728x90
Node
- 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할
- 쿠버네티스는 모든 노드에 파드를 균등하게 배포하려고 하므로 사용하고 싶지 않은 노드가 있을 때는 사용자가 직접 설정해주어야 한다.
- 노드에
SchedulingDisabled
옵션을 주어 노드가 추가 파드를 할당받지 않도록 할 수 있다.
cordon과 drain
cordon: 지정한 노드에서 실행 중인 파드는 건드리지 않고 추가적인 파드를 할당받지 않는다.
drain: 지정한 노드에 새로 생성되는 파드를 할당하지 않을 뿐 아니라 노드에 이미 실행 중인 파드도 다른 노드로 이동시킨다.
cordon
- 지정한 노드에서 실행 중인 파드는 건드리지 않고 추가적인 파드를 할당받지 않는다.
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-277g4 w3-k8s
echo-hname-7894b67f-5dngf w2-k8s
echo-hname-7894b67f-6xlst w3-k8s
echo-hname-7894b67f-7ltg4 w2-k8s
echo-hname-7894b67f-bdjxt w1-k8s
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-hnwgq w3-k8s
echo-hname-7894b67f-mx25p w1-k8s
echo-hname-7894b67f-mx4vn w1-k8s
[root@m-k8s ~]# kubectl scale deployment echo-hname --replicas=3
deployment.apps/echo-hname scaled
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-6xlst w3-k8s
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-mx25p w1-k8s
[root@m-k8s ~]# kubectl cordon w3-k8s
node/w3-k8s cordoned
[root@m-k8s ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
m-k8s Ready master 4d1h v1.18.4
w1-k8s Ready <none> 4d1h v1.18.4
w2-k8s Ready <none> 4d1h v1.18.4
w3-k8s Ready,SchedulingDisabled <none> 4d1h v1.18.4
- scheduler는 노드에 파드를 균일하게 배포한다.
cordon
명령으로 해당 노드에 파드가 더 이상 할당되지 않는SchedulingDisabled
상태를 만들 수 있음
[root@m-k8s ~]# kubectl scale deployment echo-hname --replicas=9
deployment.apps/echo-hname scaled
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-6xlst w3-k8s
echo-hname-7894b67f-f7wqf w2-k8s
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-gcjk2 w1-k8s
echo-hname-7894b67f-krtz8 w2-k8s
echo-hname-7894b67f-lxlmd w1-k8s
echo-hname-7894b67f-mx25p w1-k8s
echo-hname-7894b67f-rdpxm w2-k8s
echo-hname-7894b67f-zrngr w1-k8s
SchedulingDisabled
된 노드에는 더 이상 파드가 추가로 배포되지 않는다.
[root@m-k8s ~]# kubectl scale deployment echo-hname --replicas=3
deployment.apps/echo-hname scaled
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-6xlst w3-k8s
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-mx25p w1-k8s
- 파드의 갯수를 3개로 줄이면 노드 당 1개씩으로 변경된다.
[root@m-k8s ~]# kubectl uncordon w3-k8s
node/w3-k8s uncordoned
[root@m-k8s ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
m-k8s Ready master 4d1h v1.18.4
w1-k8s Ready <none> 4d1h v1.18.4
w2-k8s Ready <none> 4d1h v1.18.4
w3-k8s Ready <none> 4d1h v1.18.4
uncordon
명령으로 노드에 할당된SchedulingDisabled
를 해제한다.
Drain
- 지정한 노드에 새로 생성되는 파드를 할당하지 않을 뿐 아니라 노드에 이미 실행 중인 파드도 다른 노드로 이동시킨다.
- 노드를 유지보수 할 때 사용
[root@m-k8s ~]# kubectl drain w3-k8s
node/w3-k8s cordoned
error: unable to drain node "w3-k8s", aborting command...
There are pending nodes to be drained:
w3-k8s
error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/calico-node-4v9b6, kube-system/kube-proxy-whnf2
[root@m-k8s ~]# kubectl drain w3-k8s --ignore-daemonsets
node/w3-k8s already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-4v9b6, kube-system/kube-proxy-whnf2
evicting pod default/echo-hname-7894b67f-6xlst
pod/echo-hname-7894b67f-6xlst evicted
node/w3-k8s evicted
drain
명령은 지정된 노드에서 파드를 삭제하고 다른 노드에서 파드를 다시 생성하는데,DaemonSet
은 각 노드에 1개씩 존재해야하는 파드여서 삭제할 수 없다.- 따라서 --ignore-daemonsets 명령을 사용해 DaemonSet을 무시하고 진행하도록 한다.
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-mx25p w1-k8s
echo-hname-7894b67f-vf46d w2-k8s
[root@m-k8s ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
m-k8s Ready master 4d1h v1.18.4
w1-k8s Ready <none> 4d1h v1.18.4
w2-k8s Ready <none> 4d1h v1.18.4
w3-k8s Ready,SchedulingDisabled <none> 4d1h v1.18.4
- w3-k8s 노드에서 파드들이 모두 삭제되고 해당 파드는 다른 노드에 생성된다.
- 노드를 확인하면 w3-k8s에
SchedulingDisabled
옵션이 적용되었다.
[root@m-k8s ~]# kubectl uncordon w3-k8s
node/w3-k8s uncordoned
[root@m-k8s ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
m-k8s Ready master 4d1h v1.18.4
w1-k8s Ready <none> 4d1h v1.18.4
w2-k8s Ready <none> 4d1h v1.18.4
w3-k8s Ready <none> 4d1h v1.18.4
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-mx25p w1-k8s
echo-hname-7894b67f-vf46d w2-k8s
[root@m-k8s ~]# kubectl scale deployment echo-hname --replicas=6
deployment.apps/echo-hname scaled
[root@m-k8s ~]# kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
NAME NODE
echo-hname-7894b67f-29k9d w3-k8s
echo-hname-7894b67f-9btjs w3-k8s
echo-hname-7894b67f-dpxsq w1-k8s
echo-hname-7894b67f-g7kr2 w2-k8s
echo-hname-7894b67f-mx25p w1-k8s
echo-hname-7894b67f-vf46d w2-k8s
uncordon
명령으로 노드에서SchedulingDisabled
를 해제한다.- 파드를 새로 생성하면 다시 균등하게 스케줄링된다.
728x90