Cordon
- 특정 노드를 스케줄러에서 제외시켜 파드가 할당되지 않도록 합니다.
- 기존에 노드에 배포된 파드는 그대로 남아있습니다.
- 노드의 status에 Ready외에 SchedulingDisabled가 추가됩니다.
kubectl cordon <Node이름>
kubectl uncordon <Node이름>
Drain
- 특정 노드를 스케줄러에서 제외시켜 파드가 할당되지 않도록 하고, 기존에 배포된 파드를 다른 노드로 이동시킵니다.
- 노드를 업데이트 하는 경우 활용 가능합니다.
- 노드의 status에 Ready외에 SchedulingDisabled가 추가됩니다.
kubectl drain <Node이름>
or
kubectl drain <Node이름> --ignore-daemonsets --force
주의 사항
1. Pod가 emptyDir을 사용하여 Local Data를 저장하는 경우
- emptyDir를 사용하여 local data를 저장하는 파드가 해당 워커 노드에 있는 경우, 이 파드를 삭제 시 해당 데이터 또한 삭제되므로 수행되지 않습니다. 해당 파드가 제거되어도 문제가 없는 경우에는 --delete-local-data 플래그를 drain 명령어에 추가하여 수행합니다.
2. 해당 워커 노드에 데몬셋(daemonset)이 구동되고 있는 경우
- 데몬셋에 속한 파드가 해당 워커 노드에 구동되고 있는 경우, kubectl drain 명령이 수행되지 않습니다. 데몬셋 컨트롤러는 노드가 unschedulable 상태에 있더라도 이를 무시하고 해당 노드에 파드를 스케줄하여 배치할 수 있습니다. 데몬셋에 속한 파드가 있는 경우에는, --ignore-daemonsets 플래그를 추가하여 해당 파드를 축출 대상에서 제외할 수 있습니다.
3. Kubernetes의 컨트롤러에서 관리되지 않는 파드가 구동되고 있는 경우
- Kubernetes에서는 Deployment, Statefulset, DaemonSet, ReplicaSet, Job을 제외한 컨트롤러가 관리하지 않는 파드가 해당 워커 노드 상에 있는 경우, kubectl drain 명령어는 이를 보호하기 위해서 동작하지 않습니다. --force 플래그를 추가하여 kubectl drain 명령어를 실행하는 경우, 이러한 파드는 클러스터에서 제거되며 재스케줄링되지 않습니다.
- 대표적인 예로는 Static Pod, Pod(바로 Pod로 생성한 경우)가 있습니다.
- 이 때 주의해야 하는 점으로는 Pod가 Dynamic PV와 연결되어 있는 경우 Pod가 삭제될 때 PVC와의 연결이 끊어지면서 PV도 재사용이 불가합니다.
- 이를 해결하기 위한 방법으로는 크게 2가지 정도가 있습니다.
1) drain 전 Pod, PV 생성 후 PV에 데이터 마이그레이션
2) Kasten과 같은 백업 솔루션 사용
4. 자동 업데이트 시 pdb 보유 여부 확인
참고 링크
쿠버네티스 커든(Cordon) 및 드레인(Drain) 개념과 설정
쿠버네티스 커든(Cordon) 및 드레인(Drain) 개념과 설정
velog.io
https://arisu1000.tistory.com/27845
쿠버네티스 cordon, drain
쿠버네티스 클러스터를 사용하다 보면 특정 노드에 있는 포드들을 모두 다른 곳으로 옮기거나 아니면 특정 노드에는 포드들이 스케쥴링 되지 않도록 제한을 걸어둘 필요가 있습니다. 이런한 기
arisu1000.tistory.com
https://guide.ncloud-docs.com/docs/nks-nks-drain-1
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Nginx Controller에 Let’s Encrypt 인증서 등록(DNS01) (0) | 2025.01.20 |
---|---|
[Kubernetes] Pod 또는 Deployment 생성 시 주의 사항 (0) | 2025.01.20 |
[Kubernetes] Nginx Controller에 Let’s Encrypt 인증서 등록(http01) (0) | 2024.09.25 |