- NodeSelector
- Affinity and Anti-affinity
- Pod Overhead
- 파드 스케줄링 준비성(Readiness)
- 파드 토폴로지 분배 제약 조건
- Taints and Tolerations
- cordon and drain ← 오늘 볼 내용
7. Cordon and Drain
1. Cordon
cordon 명령은 노드를 스케줄링에서 차단하는데 사용된다.
이 명령은 주로 유지보수 작업이나 특정 노드에서의 장애 복구 시에 사용된다.
cordon 명령으로 노드를 일시적으로 차단하면 새로이 생성되는 파드는 해당 노드에 더 이상 스케줄되지 않는다.
사용 방법
kubectl cordon <노드 이름>
노드를 차단한 후 다시 원상복구시키고 싶다면 다음 명령을 사용하면 된다.
사용 방법
kubectl uncordon <노드 이름>
적용 방법과 해제 방법 모두 간단하다.
2. Drain
drain 명령은 쿠버네티스 클러스터의 노드에서 파드를 안전하게 제거하고, 해당 노드를 유지보수 또는 다른 목적으로 사용할 수 있도록 하는 명령이다.
drain은 cordon의 역할 + 노드에서 파드 제거 역할을 한다.
안전하게 파드를 정리하려면 다음 명령을 입력해야한다.
사용 방법
kubectl drain --ignore-daemonsets <노드 이름>
위 명령을 통해 데몬셋 파드에 대해서는 건드리지 않지만 기존의 파드들은 다른 노드로 이관함으로 안전하게 노드를 비울 수 있다.
drain 으로 차단된 노드를 해제하는 법은 다음과 같다.
사용 방법
kubectl uncordon <노드 이름>
해제하는 법은 cordon이나 drain이나 같다.
실습
아래 yaml코드를 실행시켜 cordon과 drain을 적용할 때 각각 어떻게 동작하는지 확인해보자.
아래 yaml코드는 데몬셋으로 각 노드에 파드를 하나씩 생성하고 디플로이먼트로 세 개의 파드를 분산하여 스케줄된 상태다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
spec:
selector:
matchLabels:
rel: stable
template:
metadata:
labels:
rel: stable
spec:
containers:
- name: wp-container
image: wordpress
ports:
- containerPort: 80
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep-test
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx-container
image: nginx:1.25
ports:
- containerPort: 80
protocol: TCP
cordon을 적용하면 실행되고 있는 파드는 문제가 생기지 않지만 이후에 생성되는 파드는 cordon이 적용된 노드에 스케줄되지 않는다.
kubectl cordon node1
아까 사용했던 디플로이먼트를 한번 더 적용하여 생성하면 node1에는 파드가 스케줄되지 않는 것을 볼 수 있다.
이것이 cordon의 역할이다.
이번에는 drain을 적용하여 결과를 확인해보자.
kubectl uncordon node1
kubectl drain --ignore-daemonsets node2
node1은 cordon을 해제하고 node2에 drain을 적용해볼 것이다.
파드들이 모두 node2에서 축출(evict)되면서 데몬셋을 제외한 모든 파드들이 node1로 이전되었다.
스케줄러는 cordon이나 drain 중인 노드들에 대해서는 스케줄하지 않도록 한다.
하지만 새로운 데몬셋 컨트롤러가 생성되려고 하는 경우에는 허용한다.
일반적으로 노드를 제거하거나 VM을 삭제해야 하는 경우 cordon과 drain을 통해 노드의 리소스를 모두 정리한 후에 제거하는 것이 좋다.
daemonset 파드는 노드에 그대로 남아있더라도 다른 파드는 모두 다른 노드로 이전해야 노드를 삭제할 때 큰 문제가 생기지 않는다.
그러므로 클러스터에서 노드를 제거하는 작업을 수행할 때는 cordon과 drain을 반드시 적용한 후 진행해야 한다.
'Kubernetes' 카테고리의 다른 글
Kubernetes 기초 - Storage(2) (0) | 2024.01.20 |
---|---|
Kubernetes 기초 - Storage(1) (0) | 2024.01.12 |
Kubernetes 기초 - Scheduling(5) (0) | 2024.01.09 |
Kubenets 기초 - Scheduling(4) (0) | 2024.01.06 |
Kubernetes 기초 - Scheduling(3) (0) | 2024.01.05 |