ETC

[CKA] kubernetes Controller - DaemonSet

코린이s 2023. 9. 3. 20:57
728x90

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.

끝!

728x90