[k8s] kubernetes(쿠버네티스) cordon drain uncordon

 

 

실습 환경

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

 

댓글

Designed by JB FACTORY

loading