컨테이너 런타임
: 컨테이너를 어떻게 설치(실행)할 것인가
위치 : ~/kubespray/inventory/mycluster/group_vars/k8s_cluster
$ grep containerd k8s-cluster.yml
## docker for docker, crio for cri-o and containerd for containerd. ➜ 3가지 중 선택 가능
## Default: containerd
container_manager: containerd ✔️ # Docker 설치되어있지 x ➜ containerd로만 제어
k8s는 기본적으로 Containerd와 Cri-o 2가지만 지원
요즘은 Docker도 Containerd 라이브러리를 사용하기 때문에 k8s가 Doker를 지원하지 않아도 문제 x
$ systemctl status containerd
...
/usr/local/bin/containerd-shim-`runc`-v2
...
/usr/local/bin/containerd-shim-runc
-v2 ➜ container 생성 담당
Docker 명령어처럼 활용 가능
관리자 권한 필요 (sudo -i)
# crictl [ps, images, pull httpd, rmi docker.io/library/httpd, exec -it 컨테이너 ID bash ...]
⚠️ 필독!
이 메세지 아래에서 진행되는 실습은 node1 (controll plane)만 제대로 생성되어있고,
node2 (worker node)가 제대로 생성되지 않은 상태로 진행하였기 때문에
worker node까지 제대로 생성하고 난 후라면 아래 표기 된 정보보다 더 정확한 정보 확인 가능
모든 노드
가 파드의 사본(template)을 실행하도록 함
클러스터 전체
에 파드를 띄울 떄 사용하는 컨트롤러
🌟 무조건 한 노드에 1개
씩 ➜ 분산 보장
➜ 노드가 늘어나면 그 노드에 파드 배치 / 노드가 줄어들면 해당 노드에서 제거
🎈 Replicaset과 Daemonset의 차이
RS은 노드가 여러 개 있어도 파드를 각 노드에 1개씩 자동으로 배치할 수 x
➜ sched로 파드를 어디에 배치하면 좋을지 파악하여 가장 최선의 배치 진행
(각 노드마다 파드를 고르게 분산해야하는 의무 x)
➜ sched를 조정해서 원하는대로 배치할 수는 있지만, RS 자체에서 할 수는 x
ex. RS가 파드 3개로 설정되어있고 노드도 3개로 되어있을 때
RS는 노드 3개 중 1개를 잃으면 다른 노드에 파드를 새로 생성시켜 갯수 맞춤
DS는 복제본이 x ➜ 노드가 클러스터에서 제거되면 해당 노드에 있던 파드는 가비지(garbage)로 수집
➕가비지 컬렉터 ➜ 메모리 누수 방지
메모리 누수 : 메모리 할당하고 해제하지 않아 계속해서 메모리가 쌓이는 것
데몬셋의 주 용도 : Agent
데몬셋은 노드에서 실행되는 어플리케이션 보조 / 인프라 유지, 보수, 관리하기 위한 어플리케이션
관리
➜ Workload는 기본적으로 스토리지(디스크) 파드 보유
k8s가 연결할 수 있는 컨테이너 스토리지 인터페이스 (CSI)
를 통해 접근
➜ Rook, Ceph 사용
스토리지를 관리할 애플리케이션 필요 ➜ 데몬셋이 관리
kube-proxy는 클러스터 내 모든 노드에 설치되어있어야하므로 ds로 관리 (dns, calico도 마찬가지)
$ kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 1 1 1 1 1 kubernetes.io/os=linux 42h
kube-proxy✔️ 1 1 1 1 1 kubernetes.io/os=linux 42h
nodelocaldns 1 1 1 1 1 kubernetes.io/os=linux 42h
DS spec 확인
$ kubectl explain ds.spec.selector
$ kubectl explain ds.spec.template
➜ ds.spec에는 Replicasets라는 필드가 없음 ➜ 복제본이 아님
을 의미
🎈 DaemonSet 실습
myweb-ds
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: myweb-ds
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- myweb
- key: env
operator: Exists
template:
metadata:
labels:
app: myweb
env: dev
spec:
containers:
- name: myweb
image: ghcr.io/c1t1d0s7/go-myweb
ports:
- containerPort: 8080
protocol: TCP
💡 yaml 파일에서의 label 선언 및 일치
➜ pod에 사용하는 spec.template.metadata의 label과
metadata 필드에 사용하는 label은 관습적으로 일치시켜주는 편 (필수 x)
➜ Selector의 matchlavels와 spec.template.metadata의 labels는 맞춰줘야 함
DS 생성
$ kubectl create -f myweb-ds.yaml
Worker Node or Control Plane
터미널 1
DS 수 추가 / 감소하는 것 실시간 확인
$ watch kubectl get ds
터미널 2
$ ansible-playbook -i inventory/mycluster/inventory.ini remove-node.yml -b --extra-vars="node=node3" --extra-vars reset_nodes=true
노드 추가
https://kubespray.io/#/
➜ 추가할 노드를 인벤토리
에 미리 명시 해놓아야 함
$ ansible-playbook -i inventory/mycluster/inventory.ini scale.yml -b
📌 현재 제거할 worker node가 존재하지 않으므로
해당 실습은 node2, node2 제대로 생성 완료 후 다시 진행해서 필기할 예정
Daemon과는 다르게 시작과 끝
이 있는 애플리케이션 관리 (Batch 작업)
파드가 성공적으로 종료될 때가지 계속해서 파드 실행 재시도
➜ 어플리케이션이 종료되어야 파드가 종료 됨
Statefuless
: Jobs / CronJobs🎈 배치(batch)
$ kubectl api-resources | grep batch
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
Job spec 확인
$ kubectl explain jobs.spec
$ kubectl explain jobs.spec.template
🎈 Job 실습
mypi.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: mypi
spec:
template:
spec:
containers:
- image: perl
name: mypi
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy : OnFailure ✔️
perl : python과 같은 스크립트 language
pod.spec.containers.command
== job.spec.template.spec.containers.command
➜ Entrypoint 대체
perl 이미지 정보 확인
$ sudo -i
# crictl pull perl
🌟 재시작 정책(restartPolicy)
을 선언하지 않았을 때
우리가 원하는 것 : 연산이 끝나면 어플리케이션이 끝이 나는 것
but 파드의 재시작 정책은 기본이 always ➜ 오류 발생
$ kubectl create -f mypi.yaml
The Job "mypi" is invalid: spec.template.spec.restartPolicy: Required value: valid values: "OnFailure", "Never"
Job 생성
$ kubectl create -f mypi.yaml
생성 확인
$ watch kubectl get job,po kube-node1: Thu May 19 01:56:56 2022
NAME COMPLETIONS DURATION AGE
job.batch/mypi 0/1 41s 42s ✔️
NAME READY STATUS RESTARTS AGE
pod/mypi--1-wzrp8 0/1 ContainerCreating 0 41s ✔️
pod/myweb-ds-ldpmj 1/1 Running 0 40m
pod/myweb-rc-cfvnv 1/1 Running 1 (150m ago) 14h
pod/myweb-rc-kv795 1/1 Running 1 (150m ago) 14h
⬇️
NAME COMPLETIONS DURATION AGE
job.batch/mypi 1/1 2m50s 3m57s ✔️
NAME READY STATUS RESTARTS AGE
pod/mypi--1-wzrp8 0/1 Completed 0 3m56s ✔️
pod/myweb-ds-ldpmj 1/1 Running 0 44m
pod/myweb-rc-cfvnv 1/1 Running 1 (154m ago) 14h
pod/myweb-rc-kv795 1/1 Running 1 (154m ago) 14h
Job의 로그 확인
$ kubectl logs mypi--1-wzrp8 # 연산
$ kubectl get job,po -o wide --show-labels
# job
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR LABELS
job.batch/mypi 1/1 2m50s 41m mypi perl controller-uid=5c2156e5-f2aa-4c71-9517-d89bf50de0a4 controller-uid=5c2156e5-f2aa-4c71-9517-d89bf50de0a4,job-name=mypi
# pod
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/mypi--1-wzrp8 0/1 Completed 0 41m 10.233.90.52 node1 <none> <none> controller-uid=5c2156e5-f2aa-4c71-9517-d89bf50de0a4,job-name=mypi
yaml 파일에서 Pod template 의 label
/ Job 컨트롤러의 label selector
지정 x
➜ 잘못 된 매핑으로 기존의 파드를 종료하지 않게 하기 위함
Job / Cron Job은 시작을 하면 끝이 나는 것을 보장하기 때문에 (stateful)
Selector를 사용하게 되면 Job 컨트롤러가 동일한 label을 가진 Stateless 파드를
잘못 매핑하여 다른 어플리케이션을 죽이려고 할 가능성 존재
Job이 끝났는데 파드 계속 남아있음
해당 파드의 로그
는 삭제되지 않고 etcd에 저장
➜ etcd DB is getting full
사용자에게 삭제 선택권 부여
➜ 완료한 Job에 대한 로그가 필요 없으면 반드시 삭제
하기
외부에 로그 서버
필수
➜ 로그를 외부 서버에 따로 저장하면 Job을 삭제해도 아무 문제 x
$ kubectl get job,po
NAME COMPLETIONS DURATION AGE
job.batch/mypi 1/1 2m50s 41m
NAME READY STATUS RESTARTS AGE
pod/mypi--1-wzrp8 0/1 Completed 0 41m ✔️
Job 컨트롤러의 spec의 필드 확인
$ kubectl explain job.spec
🎈 Job spec 필드
mypi-tsaf.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: mypi
spec:
template:
spec:
containers:
- image: perl
name: mypi
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy : OnFailure
ttlSecondsAfterFinished: 10 ✔️
➜ 파드가 종료 되고 10초 후에 종료 및 삭제
mypi-comp.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: mypi
spec:
completions: 3 ✔️
template:
spec:
containers:
- image: perl
name: mypi
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy : OnFailure
➜ 해당 과정을 3번 실행하고 완료되어야 끝남
Job 생성
$ kubectl create -f mypi-comp.yaml
진행 확인
$ kubectl get po --watch
NAME READY STATUS RESTARTS AGE
mypi--1-mnxlj 0/1 ContainerCreating 0 9s
mypi--1-mnxlj 1/1 Running 0 11s
mypi--1-mnxlj 0/1 Completed 0 18s
mypi--1-87xps 0/1 Pending 0 0s
mypi--1-87xps 0/1 Pending 0 0s
mypi--1-87xps 0/1 ContainerCreating 0 0s
mypi--1-mnxlj 0/1 Completed 0 23s
mypi--1-87xps 0/1 ContainerCreating 0 8s
mypi--1-87xps 1/1 Running 0 16s
mypi--1-87xps 0/1 Completed 0 28s
...
생성 및 실행 완료 확인
$ watch kubectl get job,po
kube-node1: Thu May 19 02:55:40 2022
NAME COMPLETIONS DURATION AGE
job.batch/mypi 3/3 87s 3m36s
NAME READY STATUS RESTARTS AGE
pod/mypi--1-87xps 0/1 Completed 0 3m18s
pod/mypi--1-dk9jz 0/1 Completed 0 2m50s
pod/mypi--1-mnxlj 0/1 Completed 0 3m36s
mypi-para.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: mypi
spec:
completions: 3
parallelism: 3 # 이 파트 수정
template:
spec:
containers:
- image: perl
name: mypi
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy : OnFailure
Job 및 생성 Job Pod 확인
$ watch kubectl get job,po
💡 completion 횟수
≥
parallelism 횟수
$ kubectl edit job mypi
vi 편집기
로 suspend 부분을 true
로 바꿔주면 일시중지 가능
➕ vi 에디터를 강제종료 하면 파일
이름 앞에 . 뒤에 .swap
이 붙은 파일을 볼 수 있을 것
어떻게 할 것인지 정해주면 됨 (삭제, 수정 ...)
ex. 택배 위치 확인 사이트에서 확인하는 정보와 실제 택배의 위치가 다른 이유
➜ 택배 회사가 택배 위치정보를 배치 작업을 통하여 동기화 시키기 때문
Cronjob의 API 버전 확인
$ kubectl explain cj --api-version=batch/v1beta1
--api-version
: api 버전까지 확인 가능
CronJob의 spec 필드 확인
$ kubectl explain cj.spec
$ kubectl explain cj.spec.jobTemplate
$ kubectl explain cj.spec.suspend
$ kubectl explain cj.spec.schedule 🌟
🎈 CronJob 실습
mypi-cj.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: mypi-cj
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: mypi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: OnFailure
터미널 1
CronJob 생성
$ kubectl create -f mypi-cj.yaml
터미널 2
모니터링
$ watch -n1 -d kubectl get cj,po kube-node1: Thu May 19 05:34:18 2022
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/mypi-cj * * * * * False 1 19s 4m2s
NAME READY STATUS RESTARTS AGE
pod/mypi-cj-27548971--1-xd8zl 0/1 Completed 0 3m19s
pod/mypi-cj-27548972--1-4q4kw 0/1 Completed 0 2m13s
pod/mypi-cj-27548973--1-5rx4q 0/1 Completed 0 78s
pod/mypi-cj-27548974--1-shmk9 1/1 Running 0 18s
-n[n초]
: n초마다 업데이트 확인
-d
: 업데이트 시 변경사항 확인
🎈 CronJob spec 필드
successfulJobsHistoryLimit
히스토리 제한
➜ 파드 갯수 무한정 증가 x
➜ Default : 3개
CronJob은 기본적으로 4개의 job만 가짐
(현재 실행되고 있는 것까지 합쳐서 4개)
Running 되는 파드가 여러 개면 확인(get) 시 보여지는 pod는 4개 이상일 수 있음
제일 오래 된 job은 삭제 됨
concurrencyPolicy
어플리케이션 동시 작업
허용 여부
(어플리케이션의 data 성질에 따라 충돌 발생할 수도 있음)
➜ Default : allow
♢ Allow : 허용
♢ Forbid : 금지 ➜ 실행 중인 작업이 끝나야 다음 작업 실행 (그 전까지는 실행 안되고 대기)
♢ Replace : 변경 ➜ job 실행 중 replace 할 작업이 생성되는 경우, 실행 중이었던 Job 파드를 죽이고 replace 할 파드 실행
sleep-cj.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: sleep-cj
spec:
schedule: "* * * * *" # 1분에 1번씩 실행되는 스케줄
jobTemplate:
spec:
template:
spec:
containers:
- name: sleep
image: ubuntu
command: ["sleep", "80"]
restartPolicy: OnFailure
concurrencyPolicy: Forbid ✔️
1분마다 Job 실행 ➜ 1분이 지나면 다음 Job 파드 실행 대기 ➜ 이전 작업 끝나면 실행
터미널 1
$ kubectl create -f sleep-cj.yaml
터미널 2
$ watch -n1 -d kubectl get cj,po
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/sleep-cj * * * * * False 1 60s 9m5s
NAME READY STATUS RESTARTS AGE
pod/nettool 1/1 Running 2 (28m ago) 3h43m
pod/sleep-cj-27549270--1-2gdkv 0/1 Completed 0 7m
pod/sleep-cj-27549273--1-f4nw6 0/1 Completed 0 4m30s
pod/sleep-cj-27549275--1-6kksf 0/1 Completed 0 2m27s
pod/sleep-cj-27549277--1-wq7wz 0/1 ContainerCreating 0 45s
🌟Cron Job은 100회 이상의 실패가 누적되면 중단
시스템에 문제가 발생해서 실패를 할 수도 있지만, forbid 상태에서 파드가 실행되면 실패로 간주
➜ forbid라고 셋팅한 순간, 다음으로 실행하려고 스케줄링된 파드가 실행 중 ➜ 이 실행은 실패로 간주
파드 집합에서 실행중인 애플리케이션을 네트워크 서비스(외부)로 노출
파드에게 고유한 IP 주소
와 파드 집합에 대한 단일 DNS
명을 부여하고, 파드들 사이에서 LB
역할을 수행
IP는 파드마다 1개
부여
컨테이너마다 부여되는 것 x / 파드 내 컨테이너 갯수 상관 x
파드마다 IP가 1개이기 때문에 파드 내의 컨테이너가 어떤 애플리케이션이 수행되고있는 컨테이너인지 알 수 X ➜ 이 때 서비스 사용
pod는 서비스의 selector
에 의해 선택 됨 ➜ 파드에 정의 된 label
을 통하여 selecting
서비스에는 DNS 이름이 부여 됨 (예측 가능)
클라이언트는 해당 DNS 이름을 가지고 서비스에 접근해서 서비스의 로드밸런서 기능을 사용
Coredns
➜ 서비스에 DNS명을 붙이기 위한 kube-dns Add-On
➜ 클러스터 내에서만 사용되는 내부용 DNS
Add-On이지만 kubeadm시 필수로 설치 됨
외부 DNS와는 관계 x ➜ 따로 구성 (AWS Route53 등)
🌟 Type
종류 : ExternalName / ClusterIP / NodePort / LoadBalancer
Default : ClusterIP
- 클러스터 외부 접속 : NodePort / LoadBalancer
- 클러스터 내부 접속 :
ClusterIP
- 외부도 내부도 x : ExternalName
🎈 ClusterIP
서비스 생성 요청 시 클러스터에 고유한 Cluster IP
지정 가능
$ kubectl describe svc myweb-svc
Name: myweb-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=web
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.233.9.55
IPs: 10.233.9.55
Port: <unset> 80/TCP
TargetPort: 8080/TCP
Endpoints: 10.233.90.128:8080,10.233.90.129:8080,10.233.90.130:8080 ✔️
Session Affinity: None
Events: <none>
서비스의 백앤드에 RS를 생성하면 Endpoints 필드가 활성화 ➜ RS에 의해 생성 된 파드의 갯수만큼 Endpoint
생성
Endpoint는 label로 Selecting한 파드 정보
를 가지고 있음
파드가 삭제되면 해당 파드에 부여되어있던 Endpoint 삭제 ➜ 새로 생성 된 파드의 Endpoint로 변경
백앤드가 바뀌면 알아서 Endpoint가 알아채고 값 변경 (VM에서는 불가능한 기능)
➜ 오브젝트 리소스
$ kubectl get endpoints(ep)
서비스의 이름과 동일
한 엔드포인트 생성
🎈 Ports
필드
파드의 포트
🎈Service 실습
myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb-svc
spec:
selector:
app: web
ports:
- port: 80 ✔️
targetPort: 8080 ✔️
서비스의 포트와 파드의 포트 번호는 달라도 상관 x
(LB와 VM의 포트가 달라도 상관 없었던 것과 동일한 이유)
포트 번호는 yaml 파일 선언 시 리스트 형태
myweb-rs.yaml
LB를 진행할 Replicaset을 서비스의 백앤드로 생성
label로 Selecting 될 수 있도록 myweb-svc.yaml
파일에서 선언한 Selector의 label과 동일한 label 추가
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myweb-rs
spec:
replicas: 3
selector:
matchLabels:
app: web
env: dev
template:
metadata:
labels:
app: web
env: dev
spec:
containers:
- name: myweb
image: ghcr.io/c1t1d0s7/go-myweb
ports:
- containerPort: 8080
protocol: TCP
RS, 파드, 서비스 생성 정보 확인
$ kubectl get rs,po,svc
NAME DESIRED CURRENT READY AGE
replicaset.apps/myweb-rs 3 3 3 43s
NAME READY STATUS RESTARTS AGE
pod/myweb-rs-76scn 1/1 Running 0 41s
pod/myweb-rs-8vccc 1/1 Running 0 41s
pod/myweb-rs-hsqc9 1/1 Running 0 41s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 2d
service/myweb-svc ClusterIP ✔️10.233.9.55 <none> 80/TCP 15s
➜ Cluster IP는 Kubernetes 서비스 대역에서 할당
생성된 파드에 부여 된 IP 확인
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP ✔️ NODE NOMINATED NODE READINESS GATES
myweb-rs-76scn 1/1 Running 0 8m19s 10.233.90.74 node1 <none> <none>
myweb-rs-8vccc 1/1 Running 0 8m19s 10.233.90.73 node1 <none> <none>
myweb-rs-hsqc9 1/1 Running 0 8m19s 10.233.90.75 node1 <none> <none>
🎈 클라이언트 - 서비스 - 파드 구조
🎈 파드의 엔드 포인트 확인
파드 하나 띄움
$ kubectl run client -it --image ubuntu bash
# apt update; apt install curl # curl 명령어 설치
Cluster IP curl을 통해 파드의 데이터 실행
# curl 10.233.9.55
10.233.9.55 == Cluster IP
서비스의 로드밸런싱 기능 확인
root@client:/# curl 10.233.9.55
Hello World!
myweb-rs-hsqc9 ✔️
root@client:/# curl 10.233.9.55
Hello World!
myweb-rs-76scn ✔️
root@client:/# curl 10.233.9.55
Hello World!
myweb-rs-8vccc ✔️
➕ 기존 파드 재접속 -> 초기화 되어있음
$ kubectl exec -it client bash
🎈 새로운 test 파드 생성
$ kubectl run nettool -it --image ghcr.io/c1t1d0s7/network-multitool bash
➜ host 명령 설치되어있음
DNS 이름으로 IP 정보 출력
bash-5.1# host www.google.com
www.google.com has address 172.217.175.228
www.google.com has IPv6 address 2404:6800:4004:821::2004
CoreDNS 주소 확인
bash-5.1# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 169.254.25.10 ✔️
options ndots:5
nameserver 169.254.25.10 ➜ 쿠버네티스의 coredns 주소
서비스 이름
으로 Cluster IP 주소 확인
bash-5.1# host myweb-svc
myweb-svc.default.svc.cluster.local has address 10.233.9.55
이름으로 질의
를 하면 해당되는 Ip로 접근
해서 결과 출력
bash-5.1# curl myweb-svc
Hello World!
myweb-rs-hsqc9
bash-5.1# curl myweb-svc -v
* Trying 10.233.9.55:80...
* # 해당 이름을 가진 서비스의 ip는 10.233.9.55 이며 해당 포트로 접속한다
* Connected to myweb-svc (10.233.9.55) port 80 (#0)
...
-v
: 자세한 옵션 출력
➕ kubelet maxPods =
110개
➜ Kubelet당 110개의 노드까지만 생성 가능
!= k8s의 네트워크 역할을 하는 Service
≒ 시스템 서비스
✔️ $ systemctl status kubelet
으로 확인 가능
kubelet.service - Kubernetes Kubelet Server
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: >
Active: active (running) since Thu 2022-05-19 10:09:08 UTC; 3h 44min ago
Docs: https://github.com/GoogleCloudPlatform/kubernetes
Main PID: 832 (kubelet)
Tasks: 0 (limit: 3458)
Memory: 109.0M
CGroup: /system.slice/kubelet.service
└─832 /usr/local/bin/kubelet --logtostderr=true --v=2 --node-ip=192.1>
💡 Kubelet
bootstraps
a Kubernetescontrol-plane node
API Server, Shed, Control Manager 등의 파드가 존재해야 k8s라고 정의 가능
➜ 이 파드들을 생성
시켜 줄 서비스
가 Kubelet
➜ kubelet이 컨테이너면 kublet을 생성해 줄 주체가 없음
운영체제-서비스
부트스트래핑 구조와 비슷
Kubelet은 kubernetes 디렉토리 내의 manifest yaml 파일에 정의 된 클러스터를 부트스트래핑
주요 용도 : 자체 호스팅 Control Plane을 실행
특정 노드의 kubelet 데몬에 의해 직접 관리
되는 특수 파드 (API 서버가 컨트롤하지 x)
개별 컨트롤 플레인 컴포넌트를 감독
실패하면 다시 시작
$ kubectl get po -A
실행 시 뒤에 -node1
등의 이름이 붙어있는 것
Static Pod manifest 파일은 /etc/kubernetes/manifests
디렉토리에 존재
kubelet은 시작 시 파드를 만들기 위해 위 디렉토리를 확인 함
➕ manifest file == 구체적인 리소스 설정 파일
➜ 해당 파일을 생성하면 pod가 생성되고 삭제하면 pod도 삭제 됨
💡여러 파일 한 꺼번에 실행하는 방법
여러 파일 같이 실행
$ kubectl create -f myweb-rs.yaml -f myweb-svc.yaml
현재 디렉토리의 모든 파일 실행
$ kubectl create -f .
➕오브젝트 별 API 버전 확인 필수
$ kubectl api-versions
➕ GitHub에서 (소프트웨어의) 버전 패치 확인 방법
GitHub에서 로그인 ➜ 소프트웨어의 저장소 ➜notification
설정
새로운 버전이 나올 때마다메일
로 알림 옴--@mention 파트
notification ➜ all activity 절대 하지 말기
커스텀에 release 설정해놓으면 새로운 버전 나왔을 때마다 알 수 있음
➕
esc + .
: (이전) 명령어의 마지막 부분을 붙여넣어 줌 -> 마지막으로 옮기기