[Kubernetes] Drain, Cordon, Uncordon


서론

클러스터를 운영하다보면 노드에 OS업그레이드나 보안 패치를 적용하기 위해 잠시 노드를 중단해야 하는 상황이 생긴다.

이때 파드가 끊기는 시간을 최소화하면서 안전하게 노드를 관리해야 한다.

이와 관련하여

  • Drain명령어를 통해 노드에 실행중인 파드들을 모드 종료하고 다른 노드에 생성하도록 한다.
  • 파드를 더이상 스케줄링 하지 않도록하는 Cordon 명령어
  • Uncordon이라는 명령어로 Cordon 명령어를 해제

에 대해서 알아보도록 한다.

본론

노드가 갑자기 다운되면 그 노드에 있던 파드는 즉시 접근 불가가 된다.

플레인은 노드가 떨어진 후 최대 5 분(pod-eviction-timeout)을 기다린다.

그 안에 노드가 복구되면 원래 파드들이 살아난 노드에 그대로 복구된다.

만약 노드가 5분 이후에 복구되면, 그 노드에는 스케줄된 파드가 하나도 없는 빈 상태로 올라온다.

5분안에 노드가 복구된다면 문제가 없지만 5분안에 복구될지는 알 수 없다.

따라서 노드를 중단시켜야 하는 경우 drain명령을 사용해 모든 워크로드(파드, 서비스, 디플로이먼트 등)를 해당 노드에서 종료시키고 다른 노드에 새로 생성한다.

  • 주의할 점은 Replicaset에 의해 파드가 관리되는 경우는 파드를 종료하면 다시 실행시키지만 일반 파드의 경우에 종료시키면 다시 실행시키는 것이 불가능하다. 따라서 일반 파드가 실행중인 노드에 drain명령어 실행시 오류가 난다.
  • 따라서 이런 경우 일반 파드를 Replicaset으로 관리하도록 변경해야한다.

또한 해당 노드는 cordon 처리되어 ‘스케줄 불가’ 상태가 되며, 제한을 해제하기 전까지 새 파드가 배치되지 않는다.

제한을 해제하기 위해서는 uncordon 명령어를 통해 해제가 가능하다.

drain외에 cordon이라는 명령어도 있으며 이는 노드를 스케줄 불가 상태로 만들어 해당 노드에 파드가 배치되지 않도록한다.

정리

  • drain → 유지보수 → uncordon 순서를 지키면 서비스 중단 없이 노드를 관리할 수 있습니다.
  • cordon은 일시적으로 새 파드 스케줄을 막고 싶을 때, drain은 실제로 파드를 다른 노드로 옮겨야 할 때 사용하면 된다.