본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[CKA] Kubernetes drain/cordon/uncordon

Kubernetes OS(Operating System) Upgrade

 

클러스터의 일부로 노드를 제거해야 하는 시나리오(예: 기반 소프트웨어 업그레이드 또는 클러스터에 보안 패치 등의 패치 적용)에 대해 알아보자 이러한 경우를 처리하는 데 사용할 수 있는 옵션을 살펴보자

애플리케이션을 지원하는 몇 개의 노드와 포드가 있는 클러스터가 있다. 이 노드 중 하나가 중단되면 어떻게 될까? 물론, 그 노드 안에 있는  Pod는 접근할 수 없다.

그 Pod들을 어떻게 배치했느냐에 따라 사용자가 영향을 받을 수 있다. 예를 들어, Blue Pod의 복제본이 여러 개 있다면 Blue Application에 액세스하는 사용자는 온라인 상태의 다른 Blue Pod를 통해 서비스를 받을 때 영향을 받지 않는다. 그러나 Green 애플리케이션을 실행하는 Pod가 하나만 있다면   Green Pod에 액세스하는 사용자는 영향을 받는다.

이 경우에 Kubernetes는 무엇을 할까? 노드가 즉시 다시 온라인 상태가 되면 kubelet 프로세스가 시작되고 Pod가 다시 온라인 상태가 된다. 그러나 노드가 5분 이상 중단된 경우 Pod는 해당 노드에서 종료됩니다.

쿠버네티스는 그들이 죽었다고 생각한다. Pod가 ReplicaSet의 일부인 경우 다른 노드에서 재생성된다.
Pod가 다시 온라인 상태가 될 때까지 대기하는 시간을 pod-eviction-timeout(Pod 제거 시간 초과)라고 하며 컨트롤러 관리자에 기본값 5분으로 설정된다.

따라서 노드가 오프라인으로 전환될 때마다 마스터 노드는 최대 5분 동안 대기한 후 노드가 비활성 상태인 것으로 간주된다. pod-eviction-timeout  초과 후 노드가 다시 온라인 상태가 되면 예약된 Pod 없이 빈 상태로 표시된다.

Blue pod는 ReplicaSet의 일부였기 때문에 다른 노드에 새로운 pod가 생성되었지만, 하지만, Green Pod는 ReplicaSet의 일부가 아니었기 때문에, 그냥 사라진다. 따라서 노드에서 수행해야 할 유지 관리 작업이 있는 경우, 노드에서 실행 중인 워크로드에 다른 복제본이 있는 것을 알고 있으며, 짧은 시간 동안 작업이 중단되고, 노드가 5분 내에 다시 온라인 상태가 될 것이 확실한 경우, 빠른 업그레이드 및 재부팅을 수행할 수 있다. 그러나 노드가 5분 내에 온라인 상태로 돌아갈지 여부는 확실하지 않을것이다. 다시 돌아올 것이라고 확실히 말할 수 없기 때문에, 더 안전한 방법이 있다.

모든 워크로드를 의도적으로 노드에서 빼내어(drain) 워크로드가 클러스터의 다른 노드로 이동되도록 할 수 있다. 엄밀히 말하면, 그들은 움직이지 않는다. 노드를 빼내면 포드가 있는 노드에서 정상적으로 종료되고 다른 노드에서 다시 생성된다.

노드가 봉쇄되어 있거나 예약할 수 없는 것으로 표시되어 있으므로 제한을 구체적으로 제거할 때까지 이 노드에서 포드를 예약할 수 없다. 이제 포드가 다른 노드에서 안전하므로 노드를 재부팅할 수 있다. 재부팅 된 노드가 다시 온라인으로 돌아올 때, 그것은 여전히 예약할 수 없다. Pod를 다시 예약할 수 있도록 봉쇄를 해제(uncordon)해야 한다.

다른 노드로 이동한 Pod는 자동으로 다시 돌아가지 않는다. 이러한 Pod 중 하나가 삭제되거나 클러스터에 새 포드가 생성된 경우 이 노드에 생성된다.

drain와 uncordon 외에도 cordon이라고 불리는 또 다른 명령이 있다. Cordon은 단순히 노드를 예약할 수 없음으로 표시한다. drain과 달리 기존 노드에서 pod를 종료하거나 이동하지 않는다. cordon은 단지 새로운 Pod들이 노드에 예약되지 않는다.