Container/Kubernetes

[Kubernetes] 쿠버네티스 cordon,drain,PDB 개념과 정리 (k8s Poddisruptionbudget)

Nirsa 2020. 4. 16. 17:04
반응형

 

  • cordon

cordon은 특정 노드를 선택하여 스케줄 대상에서 제외 시킵니다. 간단한 deployment nginx 이미지를 생성해주는 매니페스트 파일을 작성 후 아래와 같이 cordon 명령을 실행하면 선택한 특정 노드가 SchedulingDisabled 상태가 되는것을 확인할 수 있습니다.

  • kubectl get nodes : 기존 노드 STATUS 확인
  • kubectl get pod -o custom-columns=Pod:metadata.name,Node:spec.nodeName : Pod가 배치된 노드 확인
  • kubectl cordon [노드네임] : 해당 노드에 cordon 적용
  • kubectl get nodes : 기존 노드 STATUS에 SchedulingDisabled가 추가된 내용 확인

 

이후 scale를 이용하여 deployment nginx의 replicas 개수를 늘려주면 아래 이미지와 같이 cordon 했던 노드에는 pod가 증가하지 않고, 다른 노드에서 증가하는것을 확인할 수 있습니다.

저는 aks-nodepool1-14067510-vmss000000 이라는 이름을 가진 노드를 cordon 했으므로 000001 노드에 Pod가 생성 되었습니다.

 

위의 과정을 그림으로 표현한다면 아래 이미지와 같이 됩니다.

 

SchedulingDisabled를 해제하고 싶다면 uncordon을 사용하시면 됩니다. (아래 drain에서도 마찬가지 입니다)

 

  • drain

drain은 cordon이랑 똑같이 동작 하지만, SchedulingDisabled 된 노드에 남아있는 Pod를 모두 삭제하고 재생성 하는 등의 기능이 추가된거라고 보시면 됩니다.

kubectl drain [노드네임] --ignore-daemonsets 을 입력하면 아래와 이미지와 같이 실행이 됩니다. 참고로 선택하는 노드는 SchedulingDisabled가 될 노드 입니다.

좌 : drain 전  /  우 : drain 후

 

* 참고로 --ignore-daemonsets 옵션을 추가해주지 않고 drain을 사용하게 되면 아래와 같이 에러가 발생 합니다. daemonsets은 각 노드들에 하나씩 실행되기 때문에 다른 노드로 옮기수가 없어 발생하는 에러 입니다. 

 

마찬가지로 그림으로 보면 아래 이미지처럼 됩니다.

 

  • PodDisruptionBudget (PDB)

PodDisruptionBudget 오브젝트는 drain을 사용할 때 한번에 많은양의 Pod가 옮겨지고, 일시적으로 리플리카 수가 커질 가능성을 없애기 위한 오브젝트 입니다. 

  • max-unavaliable : 사용할 수 없는 Pod를 허용하는 최대 수 or 비율
  • max-available : 최소한 유지할 Pod 갯수 or 비율

max-unavaliable을 2로 설정할 경우 최대 2개까지 사용할 수 없는 Pod를 허용(Pod를 이동하는 과정에서 사용할 수 없게 되므로) Pod가 2개씩 노드를 옮겨갈 것이고, max-available을 2로 설정할 경우 최소한 Pod가 2개 되는것까지를 허용하여 나머지 Pod들이 다른 노드로 옮겨갈 것 입니다.

현재 000000 이라는 노드에 8개의 pod가 동작중이며 kubectl create poddisruptionbudget [pdb이름] --selector=app=nginx --max-unavailable=2 명령을 실행 하였습니다.

pdb 네임은 임의로 아무렇게나 지으셔도 되고, selector는 매니페스트 파일에 설정한 labels에 맞춰 작성 하시고, 저의 경우 --max-unavailable=2 를 입력하여 2개씩 이동시킬 겁니다. drain을 진행하기전에 콘솔창을 하나 더 띄워서 kubectl get deployment [deployment 이름] -w 을 사용하시면 실시간으로 최대 2개씩 옮겨가는것을 확인할 수 있습니다.  

drain 명령을 실행할 땐 --ignore-daemonsets --delete-local-data 옵션을 사용해야 합니다.

 

Pod가 2개씩 이동하여 최종적으로 000001 노드에 모든 Pod가 이동되었습니다.

 

아래 이미지와 같이 되지만, 좀더 정확히는 Pod가 노드를 옮겨가기 전에 잠깐 사라지는 구간이 있습니다. (node1 pod 종료 → node2 pod 시작 이기때문 입니다.) pdb를 생성할 때 --max-unavailable=2 를 설정 했으므로 Pod가 다른 노드에 옮겨가는 과정에서 최대 2개까지 사라지는게(?) 허용 됩니다.

 

PodDisruptionBudget은 다른것들과 마찬가지로 kubectl get, kubectl delete 등으로 조회/삭제가 가능 합니다.

 

반응형