티스토리 뷰

카테고리 없음

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 노드에 재배포된 것을 확인


 

 
댓글