특정 노드에 작업이 예정되어있거나, 별도로 분리되어야 하는경우 기존의 Cordon 기능 외에 분리된 별도로 분리된 형태의 노드를 만들어야 하는경우 해당 방법이 도움이 될것입니다.
참조 : https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/
- 작업 시작 예정시
- 노드에 Annotation으로 작업 예정임을 명시하기
- 노드에 Taint로 스케줄링 불가능하게 설정하기
- (긴급) 노드에 Taint로 Pod Eviction 시키기
순서대로 구성되어있습니다.
Annotation 부여하기
노드에 Key / Value 형태의 주석과 같은 형태의 값을 부여
관리자가 식별 가능한 주석을 달아둡니다 주석은 목적이 확인가능해야하며, 작업의 유효성(시간)이 확인 가능한 두개의 값으로 선정하였습니다.
kubectl annotate node node02 scheduled-work="true"
kubectl annotate node node02 scheduled-until="2024-11-29"
별도의 Taint 부여하기
cordon 또한, 쿠버네티스 내부에서 관리하는 Taint와 Toleration입니다.
기존의 시스템 Cordon 외에 추가적인 Taint를 부여하여 이중으로 작업스케줄에 영향이 없도록 분리하도록 합니다.
kubectl taint node node02 scheduled-work=true:NoSchedule
강제종료 시키기
사용할 일이 존재하지 않겠지만, 급하게 기존의 pod들을 graceful shutdown 시켜야할일이 생길수도 있습니다.
강제로 Eviction 시키기
노드를 강제로 종료해야만 하는 상황이 되기전에, 그래도 쿠버네티스 (kubelet)이 먼저 종료를 하는게 더 안전할수도 있기 때문에 다뤄봅니다.
kubectl taint node node02 scheduled-work=true:NoExecute
해당 Taint에 대응 가능한 Toleration 이 없는 (아마도 한개도 존재하지 않을) Pod들은 즉시 종료(Eviction) 됩니다. 물리적인 강제종료보다는 Kubelet의 Eviction은 Gracefulshutdown 정책을 준수하기때문에 조금 더 안정적인 종료방법 입니다.
Taint 건 노드에 파드 띄우기
taint 의 key / value 로 scheduled-work / true 를 부여한 후에, 파드 구동이 필요할경우 다음과 같은 파드를 생성합니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-tolerant
spec:
containers:
- name: nginx
image: nginx:alpine
tolerations:
- key: "scheduled-work"
effect: "NoSchedule"
value: "true"
- key: "node.kubernetes.io/unschedulable"
effect: "NoSchedule"
nodeSelector:
kubernetes.io/hostname: node02
작업 종료 후
부여했던 annotation과 taint들을 제거합니다.
설정 해제 방법은 설정의 역순과 동일합니다.
(설정이 되어있을경우) Eviction 시키는 Taint 제거 Scheduling 불가능한 Taint 제거 Annotation으로 작업 정보 삭제
(기 설정시)Eviction Taint 제거하기
“강제종료 시키기” 항목에서 Eviction 용 NoExecute Taint를 부여했을경우 다시 제거합니다.
kubectl taint node node02 scheduled-work=true:NoExecute-
Scheduling Taint 제거하기
부여된 NoSchedule Taint를 제거합니다.
kubectl taint node node02 scheduled-work=true:NoSchedule-
Annotation 삭제하기
작업이 완료되었을경우, Annotation을 제거 후 작업을 종료합니다.
kubectl annotate node node02 scheduled-work-
kubectl annotate node node02 scheduled-until-
별도의 Annotation & Taint 를 부여 후 회수 완료하는 과정을 다루었습니다.
Kubernetes 시스템에서 사용하는 기본적인 Cordon이 되어있을경우 Uncordon을 진행하여 작업을 완료합니다.