실습 환경
k8s-master-1 CentOS 7.8 IP : 192.168.219.103 |
k8s-master-2 CentOS 7.8 IP : 192.168.219.105 |
k8s-worker-1 CentOS 7.8 IP : 192.168.219.106 |
k8s-worker-2 CentOS 7.8 IP : 192.168.219.100 |
cordon
cordon은 node에 더 이상 pod들이 스케줄링되지 않도록 합니다.
현재 구성된 클로스터를 보시면, nginx pod이 총 3개가 있고 worker-1에 두 개, worker-2에 하나가 올라가 있습니다.
[root@k8s-master-1 tmp]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-4gtb8 1/1 Running 0 8h
nginx-deployment-66b6c48dd5-7nb8w 1/1 Running 0 8h
nginx-deployment-66b6c48dd5-dd8gv 1/1 Running 0 8h
[root@k8s-master-1 tmp]# kubectl get pod -o yaml | grep worker
nodeName: k8s-worker-2
nodeName: k8s-worker-1
nodeName: k8s-worker-1
이 상태에서 k8s-worker-2에 대해 condon을 진행하면
아래와 같이 "SchedulingDisabled" 상태가 됩니다.
[root@k8s-master-1 tmp]# kubectl cordon k8s-worker-2
node/k8s-worker-2 cordoned
[root@k8s-master-1 tmp]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 17h v1.19.5
k8s-master-2 Ready master 16h v1.19.5
k8s-worker-1 Ready <none> 16h v1.19.5
k8s-worker-2 Ready,SchedulingDisabled <none> 16h v1.19.5
pod을 하나 더 추가할 경우 k8s-worker-1 노드로 올라가는 것을 확인할 수 있습니다.
pod을 여러 개 증설해도 마찬가지지만 가상 서버 메모리가 부족하여 하나로 진행하였습니다.
[root@k8s-master-1 tmp]# kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
[root@k8s-master-1 tmp]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-66b6c48dd5-4gtb8 1/1 Running 0 8h 10.233.74.2 k8s-worker-2 <none> <none>
nginx-deployment-66b6c48dd5-7nb8w 1/1 Running 0 8h 10.233.88.5 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-dd8gv 1/1 Running 0 8h 10.233.88.4 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-7fxfp 0/1 ContainerCreating 0 15s <none> k8s-worker-1 <none> <none>
[root@k8s-master-1 tmp]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-66b6c48dd5-4gtb8 1/1 Running 0 8h 10.233.74.2 k8s-worker-2 <none> <none>
nginx-deployment-66b6c48dd5-7fxfp 1/1 Running 0 3m24s 10.233.88.6 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-7nb8w 1/1 Running 0 8h 10.233.88.5 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-dd8gv 1/1 Running 0 8h 10.233.88.4 k8s-worker-1 <none> <none>
drain
drain은 node에 떠있는 pod들을 안전하게 종료 후 다른 node로 이동시키는 역할은 합니다.(서비스 단절 없음)
k8s-worker-2 node에 대해 drain을 진행하였고요.
[root@k8s-master-1 tmp]# kubectl drain k8s-worker-2 --ignore-daemonsets
node/k8s-worker-2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-st84s, kube-system/kube-proxy-nmrxf, kube-system/nodelocaldns-z5x82
evicting pod kube-system/coredns-85967d65-9mc2r
evicting pod default/nginx-deployment-66b6c48dd5-4gtb8
pod/nginx-deployment-66b6c48dd5-4gtb8 evicted
pod/coredns-85967d65-9mc2r evicted
node/k8s-worker-2 evicted
k8s-worker-2에 있던 pod이 사라졌고, k8s-worker-1에 하나 더 추가되었습니다.
참고로 pod이 이동이 되는 것은 아닙니다. 기존 pod은 삭제되고 새로운 이름의 pod가 worker-1에 생기는 것입니다.
[root@k8s-master-1 tmp]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-66b6c48dd5-7fxfp 1/1 Running 0 11m 10.233.88.6 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-7nb8w 1/1 Running 0 8h 10.233.88.5 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-dd8gv 1/1 Running 0 8h 10.233.88.4 k8s-worker-1 <none> <none>
nginx-deployment-66b6c48dd5-x4xwb 1/1 Running 0 22s 10.233.88.7 k8s-worker-1 <none> <none>
그리고, drain을 실행할 때 "--ignore-daemonsets" 옵션을 추가했는데요
데몬셋으로 실행된 pod들이 있으면 drain 과정에서 실패가 납니다.
데몬셋으로 실행된 pod들은 삭제 시 각 노드에 하나씩 다시 생성이 되기 때문에 발생하는 오류로 보시면 됩니다.
이제 k8s-worker-2에는 아무 pod도 없는 상태입니다.
이 상태에서 해당 node를 셧다운, 리부팅하여 점검을 하시거나, "kubectl delete node" 명령어로 클러스터에서 제외하시면 됩니다.
uncordon
다시 해당 node를 스케줄링 가능한 상태로 바꾸시려면 uncordon을 진행하시면 됩니다.
[root@k8s-master-1 tmp]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 17h v1.19.5
k8s-master-2 Ready master 17h v1.19.5
k8s-worker-1 Ready <none> 17h v1.19.5
k8s-worker-2 Ready,SchedulingDisabled <none> 17h v1.19.5
[root@k8s-master-1 tmp]#
[root@k8s-master-1 tmp]#
[root@k8s-master-1 tmp]# kubectl uncordon k8s-worker-2
node/k8s-worker-2 uncordoned
[root@k8s-master-1 tmp]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 17h v1.19.5
k8s-master-2 Ready master 17h v1.19.5
k8s-worker-1 Ready <none> 17h v1.19.5
k8s-worker-2 Ready <none> 17h v1.19.5
'IT > Docker & Kubernetes' 카테고리의 다른 글
containerd.io : Depends: libseccomp2 조치 내용 (0) | 2022.12.28 |
---|---|
[Docker] private local registry 구축하기 (0) | 2021.03.19 |
[k8s] kubernetes(쿠버네티스) node 추가 제거 (1) | 2020.07.18 |
[k8s] kubernetes(쿠버네티스) cluster에 nginx 설치하기 (0) | 2020.07.10 |
[k8s] kubespray로 kubernetes(쿠버네티스) 설치하기 (2) | 2020.07.01 |