cordon
- cordon은 특정 노드를 선택하여 스케줄 대상에서 제외 시킵니다. 간단한 deployment nginx 이미지를 생성해주는 매니페스트 파일을 작성 후 아래와 같이 cordon 명령을 실행하면 선택한 특정 노드가 SchedulingDisabled 상태가 되는것을 확인할 수 있습니다.
쿠버네티스 클러스터를 사용하다 보면 특정 노드에 있는 포드들을 모두 다른 곳으로 옮기거나 아니면 특정 노드에는 포드들이 스케쥴링 되지 않도록 제한을 걸어둘 필요가 있습니다. 이런한 기능들을 제공하는 명령어가 kubectl에 있습니다. cordon, drain, taint등이 그런 용도의 명령어 들입니다.
uncordon
포드가 노드에 정상적으로 스케쥴링될 수 있게 하기 위해서는 uncordon을 해주면 됩니다.
uncordon 이 정상적으로 되면 노드 상태는 Ready만 남게 되고 Pending으로 남아 있던 포드가 잠시 후 정상적으로 스케쥴링되서 실행되고 있는걸 확인할 수 있습니다.
drain
- drain은 cordon이랑 똑같이 동작 하지만, SchedulingDisabled 된 노드에 남아있는 Pod를 모두 삭제하고 재생성 하는 등의 기능이 추가된거라고 보시면 됩니다.
kubectl drain은 노드 관리를 위해서 지정된 노드에 있는 포드들을 다른곳으로 이동시키는 명령입니다. 우선 새로운 포드가 노드에 스케쥴링 되어서 실행되지 않도록 설정합니다. 그리고 나서 기존에 이 노드에서 실행중이던 포드들을 삭제합니다. 이 때 노드에 데몬셋으로 실행된 포드들이 있으면 drain이 실패합니다. 데몬셋으로 실행된 포드들은 삭제해도 데몬셋이 즉시 다시 실행하기 때문입니다. 그래서 데몬셋으로 실행한 포드를 무시하고 진행하려면 --ignore-daemonsets=true 옵션을 주고 drain을 하면 됩니다. 컨트롤러를 통해서 실행되지 않은 포드만으로 실행된 포드들이 있으면 drain이 실패합니다. 컨트롤러에 의해 관리되고 있는 포드들은 삭제되더라도 컨트롤러가 클러스터내의 다른 노드에 다시 동일한 역할을 하는 포드를 실행합니다. 하지만 포드만으로 실행된 포드들은 한번 삭제되면 그것으로 끝이기 때문에 중요한 역할을 하는 포드였다면 위험하기 때문에 drain이 진행되지 않고 실패하게 됩니다. 이런 경우 강제로 삭제를 진행하려면 --force 옵션을 주고 실행하면 됩니다. 또한, 포드들을 삭제할때 apiserver를 통해서 실행되지 않은 kubelet이 직접 실행한 스태택 포드(static pod)들은 삭제되지 않습니다. drain을 하게 되면 그레이스풀(graceful)하게 포드들을 종료합니다. 포드들이 종료 명령을 받았을때 바로 중단 되는게 아니라 정상적으로 잘 종료되도록 설정되어 있다면 기존 작업에 대한 정리를 하고 종료가 됩니다. drain은 이 과정을 모두 기다려 주도록 되어 있습니다.
'PaaS > Kubernetes' 카테고리의 다른 글
(Kubernetes) Backup And Restore (0) | 2021.03.29 |
---|---|
(Kubernetes) Upgrade Master And Worker Node (0) | 2021.03.28 |
(Kubernetes) Containers And Volumes (0) | 2021.03.27 |
(Kubernetes) Secret (0) | 2021.03.25 |
(Kubernetes) ConfigMap (0) | 2021.03.25 |