카테고리 없음
k8s un/cordon,drain 사용법
미니대왕님
2023. 4. 4. 09:24
1. 개념
- cordon : 특정 노드를 스케줄러에서 제외시켜 파드가 할당되지 않도록 함/
기존에 노드에 배포된 파드는 그대로 남아있음 - drain : 특정 노드를 스케줄러에서 제외시켜 파드가 할당되지 않도록 하고,
기존에 배포된 파드를 다른 노드로 이동 노드를 업데이트하는 경우 활용 가능
2. cordon 설정
2.1. 명령어
(admin-k8s:awx) root@k8s-m:~# k get nodes
NAME STATUS ROLES AGE VERSION
k8s-m Ready control-plane,master 67d v1.21.4
k8s-w1 Ready <none> 67d v1.21.4
k8s-w2 Ready <none> 67d v1.21.4
(admin-k8s:awx) root@k8s-m:~# k cordon k8s-w2
node/k8s-w2 cordoned
(admin-k8s:awx) root@k8s-m:~# k get nodes
NAME STATUS ROLES AGE VERSION
k8s-m Ready control-plane,master 67d v1.21.4
k8s-w1 Ready <none> 67d v1.21.4
k8s-w2 Ready,SchedulingDisabled <none> 67d v1.21.4
(admin-k8s:awx) root@k8s-m:~#
k8s-w2 2번 워크노드에는 스케쥴링이 안되는 상태로 전환됩니다.

- cordon 적용
kubectl cordon [노드_이름]
- uncordon 해제
(admin-k8s:awx) root@k8s-m:~# k uncordon k8s-w2
node/k8s-w2 uncordoned
(admin-k8s:awx) root@k8s-m:~# k get nodes
NAME STATUS ROLES AGE VERSION
k8s-m Ready control-plane,master 67d v1.21.4
k8s-w1 Ready <none> 67d v1.21.4
k8s-w2 Ready <none> 67d v1.21.4
kubectl uncordon [노드_이름]

2.2. cordon 적용
- w3-k8s 노드에 커든 적용 후 디플로이먼트 배포
3. drain 설정
3.1. 명령어
- drain 적용
- kubectl drain k8s-w2 --ignore-daemonsets --force
kubectl drain [노드_이름]
or
kubectl drain [노드_이름] --ignore-daemonsets --force
- 해제
kubectl uncordon [노드_이름]
3.2. drain 적용
- w1-k8s 노드에 드레인 적용 시 기존에 배포된 파드가 추출된 것을 확인
(admin-k8s:awx) root@k8s-m:~# kubectl drain k8s-w2 --ignore-daemonsets --force
node/k8s-w2 cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-2lwjg, kube-system/kube-proxy-f272q
evicting pod awx/awx-operator-controller-manager-58c66f9bb6-zzj54
evicting pod awx/nginx-deployment-5d59d67564-94fd2
evicting pod awx/nginx-deployment-5d59d67564-8gzn2
pod/nginx-deployment-5d59d67564-8gzn2 evicted
pod/awx-operator-controller-manager-58c66f9bb6-zzj54 evicted
pod/nginx-deployment-5d59d67564-94fd2 evicted
node/k8s-w2 evicted
drain 하기전

k8s-w2 워크노드 2번에 대해 drain 작업진행
*evicting : 쫒겨난 혹은 추출된 이라는 뜻
이는 보통 디스크 자원이 부족현상 / 강제로 추출된 pod
Kubernates Evicted Status Pod 삭제하기
Kubernates pod Evicted 상태가 되었다.
$ kubectl describe pod <pod이름>
이렇게 하면 맨 아래 부분에서 무슨 문제가 발생을 했는지 확인할 수 있다.
이 상태로 있는 pod가 있으면 다시 실행을 해도 실행되지 않고 지워준다음 다시 시작을 해야 한다고 한다. 그럴때 이 Evicted Status인 pod를 삭제하는 방법은 다음과 같다.
$ kubectl -n default delete pods --field-selector=status.phase=Failed
위와 같이 하고 다시 get pods 를 해보면 Evicted Status 상태인 pod가 삭제된 것을 확인할 수 있다.

drain 작업 완료후 W1 으로 모두 pod 가 이동됨 확인

재 배포시 다른 노드에만 파드가 배포되는 것을 확인

해제하고 다른 노드의 파드를 삭제하면 w1-k8s 노드에 재배포된 것을 확인