본문 바로가기
[DevOps]/Kubernetes

kubernetes - Node Update(drain, cordon, uncordon)

by 팡펑퐁 2024. 1. 20.
728x90

🛠️  쿠버네티스에서의 클러스터 유지보수

  • 쿠버네티스의 클러스터는 여러 개의 노드로 구성되어 있다.
  • 각 노드는 하나의 인스턴스로 구성되어 각자에 맞는 OS와 Kubelet 버전이 있을 것이다.
  • 만약 이 OS 혹은 kubelet 버전을 업데이트하거나, 하드웨어를 교체하는 등 노드의 유지보수 작업이 수행될 때 파드의 서비스 중단 없이 안전하게 노드를 유지 보수하려면 어떻게 해야 할까?
    • 쿠버네티스에는 pod의 스케줄링 정책을 커스텀하게 설정할 수 있는 여러 명령어를 제공한다.
    • 이를 통해 업데이트가 필요한 노드의 파드를 다른 노드로 옮기고 안전하게 업데이트를 진행할 수 있다.

 

📌 drain

kubectl drain <nodeName> --ignore-daemonsets
  • drain은 '물을 빼다'라는 뜻으로 쿠버네티스에서는 해당 노드의 파드를 제거하여 노드를 비우는 명령어로 사용된다.
  • `kubectl drain` 명령어를 사용하게 되면 해당 노드는 SchedulingDisabled 상태가 되고, 노드에 더 이상 새로운 파드가 스케줄링(추가)되지 않는다.
  • 또한, 해당 노드의 이미 스케줄링 되어있던 파드가 없어지고 다른 노드에 스케줄링된다.
  • --ignore-daemonsets
    • Replicaset, Statefulset 등에 의해 관리되고 있는 파드의 경우 다른 노드에 자동으로 스케줄링된다.
    • 그러나, Daemonset의 경우 각 노드에 파드를 하나씩 실행하는 특성 때문에 노드가 클러스터에서 제거되면 해당 노드에서 실행 중인 파드는 그대로 제거되며 다른 파드에 추가적으로 스케줄링되지는 않는다.
  • Standalone 파드의 경우 별도로 관리받고있지 않으므로 파괴된다.
  • kubelet에 의해 관리되고 있는 Static 파드의 경우에는 해당 노드에 계속 남아있게 된다.

 

📌 cordon & uncordon

kubectl cordon <nodeName>
kubectl uncordon <nodeName>
  • cordon의 경우 '어떠한 경계의 저지선`이라는 뜻으로 쿠버네티스에서 해당 노드에 이미 스케줄링되어 있는 파드는 건드리지 않고 추가적인 스케줄링을 제한하는 명령어로 사용된다.
  • drain과의 차이점은 drain의 경우 기존에 스케줄링되어있는 파드 역시 제거하지만 cordon의 경우 새로 추가되는 파드만을 막는 데에 있다.
  • cordon 명령어를 사용하면 해당 노드는 SchedulingDisabled 상태가 된다. 
  • 이후 uncordon을 사용하면 SchedulingDisabled에서 벗어나 다시 노드에 새로운 파드를 스케줄링할 수 있게 된다.

 

 

 

참고

Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests

뤼튼

https://velog.io/@koo8624/Kubernetes-Drain-Cordon-and-Uncordon

728x90