[CKA] kubernetes Controller - DaemonSet
DaemonSet 컨트롤러는 노드당 Pod가 한개씩 실행 되도록 보장하는것으로
이는 어디다 쓸까?
노드당 하나씩 실행해야하는 로그 수집기, 모니터링 에이전트 프로그램 실행시 적용하게 된다!
DaemonSet의 경우 ReplicaSet 과 동일한 형식으로 작성하고 노드당 1개씩 띄워 지므로 replicas만 정의 하지 않는다.
우선 노드 추가시 daemonSet에 의해 pod 가 생성 되는지 실습을 위해 노드 하나를 제거 하고 시작한다
우선 노드 확인후
$ kunectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane 4m39s v1.27.2
node2 Ready <none> 42s v1.27.2
node3 Ready <none> 20s v1.27.2
노드 명을 정의하여 삭제한다.
$ kubectl delete nodes node3
node "node3" deleted
$ kubectl get node
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane 4m49s v1.27.2
node2 Ready <none> 52s v1.27.2
이제 DemonSet yaml 을 생성하고
# daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-containers
image: nginx:1.14
해당 yaml을 적용한다.
$ kubectl create -f daemonset.yaml
daemonset.apps/demonset-nginx created
이제 예상대로 마스터를 제외한 노드가 1대이기 때문에 해당 노드에 해당 파드가 생성 되었다.
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-nginx-6425x 1/1 Running 0 42s 10.5.1.8 node2 <none> <none>
이제 삭제한 노드를 클러스터에 join하기 위해 마스터 노드에서 토큰정보를 확인한다.
$ kubeadm token list
만약 토큰이 나오지 않는다면 1시간 유효기간인 토큰을 생성하며 응답값으로 나온 토큰을 복사한뒤
$ kubeadm token create --ttl 1h
삭제한 노드로 들어가서 이전에 저장한 join 명령어에 token 부분만 방금 생성한 토큰으로 수정해서 명령어를 입력하면
$ kubeadm join [master ip]:6443 --token [token] --discovery-token-ca-cert-hash sha256...
노드 정보를 보면 방금 Join한 노드가 추가 되었고
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane 15m v1.27.2
node2 Ready <none> 11m v1.27.2
node3 Ready <none> 13s v1.27.2
파드 정보를 보면 신규 노드인 node3에 DemonSet에 의해 자동으로 pod가 생성된것을 알 수 있다.
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-nginx-6425x 1/1 Running 0 4m54s 10.5.1.8 node2 <none> <none>
daemonset-nginx-7hz6r 0/1 ContainerCreating 0 21s <none> node3 <none> <none>
이제 동작중인 파드를 제거하면 어떻게 될까?
$ kubectl delete pod daemonset-nginx-6425x
pod "daemonset-nginx-6425x" deleted
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-nginx-7hz6r 1/1 Running 0 83s 10.5.3.3 node3 <none> <none>
daemonset-nginx-bs89b 1/1 Running 0 5s 10.5.1.9 node2 <none> <none>
삭제가 완료 된 후에 다시 새로운 파드를 다시 생성한다.
demonset 정보를 보려면 아래와 같이 입력해서 확인하며
$ kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset-nginx 2 2 2 2 2 <none> 7m17s
$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset-nginx 2 2 2 2 2 <none> 6m49s
만약 이미 있는 demonset을 수정하고 싶다면 아래와 같이 1.14 를 1.15로 수정한다.
$ kubectl edit ds daemonset-nginx
...
..
- image: nginx:1.15
파드 정보를 watch 로 실시간으로 확인 하면 하나의 파드가 완전히 삭제 되어야 신규 이미지가 적용된 파드가 생성되는것을 볼 수 있다. (롤링 업데이트)
$ kubectl get pod -w
파드 정보를 보면 1.15로 정상 배포 된것을 알 수 있다.
$ kubectl describe pod daemonset-nginx-dqq8h
Image: nginx:1.15
롤백하려면 아래와 같이 입력하며 바로 이전 버전으로 돌릴 수 있다.
$ kubectl rollout undo daemonset daemonset-nginx
daemonset.apps/daemonset-nginx rolled back
확인 하면 정상적으로 롤백 되어 1.14버전의 파드가 존재한다.
$ kubectl describe pod daemonset-nginx-6mvfb
Image: nginx:1.14
생성한 데몬셋을 제거 하려면 아래와 같이 제거 하면 된다.
$ kubectl delete ds daemonset-nginx
daemonset.apps "daemonset-nginx" deleted
$ kubectl get pod
No resources found in default namespace.
끝!