노드가 비정상 상태가 될 경우 k8s는 신규 생성되는 파드가 해당 노드로 스케줄 되지 않게 taint 필드에 플래그를 지정합니다. https://support.agilesoda.ai/ko/support/solutions/articles/150000026968-taint-toleration
노드의 리붓 또는 클러스터 재구성 작업을 해야할 경우 수동으로 노드에 taint 플래그를 지정해 스케줄을 제한할 수 있습니다.
아래는 테스트를 위한 간단한 deploy 예시입니다. (hdcd-worker3-122 노드에만 스케줄되게 지정)
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: bogaewon name: bogaewon #namespace: devai-cluster namespace: test spec: replicas: 2 selector: matchLabels: app: bogaewon strategy: {} template: metadata: creationTimestamp: null labels: app: bogaewon spec: nodeSelector: kubernetes.io/hostname: hdcd-worker3-122 containers: - image: busybox name: bogaewon command: ["ping","localhost"] resources: {} status: {}
위의 deploy 를 반영한 결과는 아래와 같습니다. 이제 hdcd-worker3-122 노드에 스케줄되지 않게 테스트를 진행합니다.
1. cordon
: 지정한 노드의 스케줄을 제한합니다. (신규 생성되는 파드만 해당되며 기존 파드는 그대로 유지됩니다)
현재 노드의 상태
명령 반영
kubectl cordon hdcd-worker3-122
노드의 상태를 보면 스케줄이 차단되어 있음을 확인할 수 있습니다.
하지만 아직 실행중인 파드는 계속 동작합니다.
deploy scale 명령을 통해 신규 파드를 스케줄합니다. (replica 2 -> 4)
파드의 상태를 보면 신규로 생성된 파드는 pending 상태입니다. (노드에 스케줄이 차단되어 있기 때문)
다시 hdcd-worker3-122 노드에 스케줄이 가능하도록 변경합니다.
2. uncordon
: 지정한 노드가 다시 스케줄 가능하도록 변경합니다.
명령 반영
kubectl uncordon hdcd-worker3-122
노드의 상태를 보면 스케줄이 가능함을 확인할 수 있습니다.
파드의 상태를 다시보면 pending 상태인 파드가 다시 스케줄되어 동작함을 확인할 수 있습니다.
3. drain
: 지정한 노드의 스케줄을 제한합니다. (해당 노드에 실행중인 파드도 모두 중지하며 다른 노드로 스케줄 시도합니다.)
drain 명령은 cordon 명령의 상위 호환 명령입니다.
명령 반영
kubectl drain hdcd-worker3-122
위 명령의 결과는 아래와 같은 오류를 발생합니다.
모든 노드에 반드시 하나씩 실행되는 데몬셋은 일반 파드보다 상위 레벨의 스케줄링이므로 오류를 발생시키게됩니다.
따라서 --ignore-daemonsets 옵션을 추가하여 데몬셋으로 생성되는 파드도 중지시킵니다.
kubectl drain hdcd-worker3-122 --ignore-daemonsets
현재 배포된 deploy는 hdcd-worker3-122 노드에만 배포되게 지정되어 있으므로 파드는 pending 상태로 유지됩니다.
다시 스케줄 가능하게 변경하려면 uncordon 명령을 사용합니다.
drain 명령 추가 옵션 --delete-local-data : emptydir 옵션으로 마운트된 파드가 걸려있을 경우 사용 --force : 기본 drain 명령은 graceful 방식으로 파드 중지. force 옵션 사용시 강제 제거.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.