7. 쿠버네티스 스케줄링
1. nodeSelector
파드를 배치할 노드를 선택하기 위해 노드에 정의된 레이블을 사용합니다.
레이블은 Key-Value 쌍으로 이우러진 메타데이터입니다.
1.1 nodeSelector 예시
(1) 노드에 레이블 설정
kubectl label nodes w1-k8s service=web
(2) 노드 레이블 확인
kubectl get nodes --show-labels
(3) 특정 노드에 파드 위치하도록 설정
7/00-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: ssd-pod
spec:
containers:
- name: mycontainer
image: nginx
nodeSelector:
service: web
2. Node Affinity 및 Anti-Affinity
2.1 Node Affinity
파드가 특정 조건을 만족하는 노드에 스케줄링되도록 하는 기능이며, 크게 두 가지 유형으로 나눌 수 있습니다.
requiredDuringSchedulingIgnoredDuringExecution
파드가 반드시 조건을 만족하는 노드에만 스케줄링됩니다.
조건을 만족하는 노드가 없으면 파드는 스케줄링되지 않습니다.
preferredDuringSchedulingIgnoredDuringExecution
조건을 만족하는 노드가 있다면 우선적으로 해당 노드에 스케줄링됩니다.
조건을 만족하는 노드가 없으면 다른 노드에 스케줄링 될 수 있습니다.
kubernetes explain pod.spec.affinity 로 확인하는 습관이 필요함
7/01-node-affinity.yaml
requiredDuringSchedulingIgnoredDuringExecution
는disktype
이ssd
인 노드에만 파드를 스케줄링합니다.preferredDuringSchedulingIgnoredDuringExecution
는region
이east
인 노드를 선호하지만, 해당 노드가 없으면 다른 노드에 스케줄링될 수 있습니다.
Events 발생
Type Reason Age From Message
Warning FailedScheduling 2m38s default-scheduler 0/4 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 3 node(s) didn't match Pod's node affinity/selector. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.
2.2 Node Anti-Affinity(Pod Anti-Affinity 내용)
다른 파드와 겹치지 않게 할 때 사용합니다.
파드가 특정 노드에 스케줄링되지 않도록 설정하는 방법으로 크게 두 가지 유형이 있습니다.
requiredDuringSchedulingIgnoredDuringExecution
파드가 반드시 조건을 만족하지 않는 노드에만 스케줄링됩니다.
preferredDuringSchedulingIgnoredDuringExecution
조건을 만족하지 않는 노드에 우선적으로 스케줄링되지만, 필요하다면 다른 노드에 스케줄링될 수 있습니다.
7/02-node-anti-affinity.yaml
requiredDuringSchedulingIgnoredDuringExecution
는app=myapp
라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 합니다.preferredDuringSchedulingIgnoredDuringExecution
는app=otherapp
라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 선호하지만, 조건을 만족하지 않더라도 스케줄링될 수 있습니다.
Topology Key
topologyKey
는 노드 간의 관계를 정의합니다. 일반적으로kubernetes.io/hostname
을 사용하여 같은 노드에 스케줄링되는지를 결정합니다.다른 토폴로지 키를 사용하여 동일한 리전, 존, 랙 등에 배치되는지 여부를 제어할 수 있습니다.
위 예제는 특정 파드가 동일한 노드에 배치되지 않도록 하는 방법입니다.
3. Pod Affinity 및 Pod Anti-Affinity
특정 파드가 다른 파드와 같은 노드 또는 다른 노드에 배치되도록 합니다.
7/03-pod-affinity.yaml
podAffinity는 app=frontend
라벨을 가진 파드가 있는 노드에example-pod
3을 배치합니다.podAntiAffinity
는app=backend
라벨을 가진 파드가 없는 노드에example-pod3을
우선 배치합니다.
4. Taint 및 Tolerations
파드가 특정 노드에 스케줄링되지 않도록 제한하거나, 특정 조건을 충족하는 노드에만 스케줄링되도록 제어하는 방법입니다.
노드에 Taint를 설정하면 파드가 스케줄링 되지 않으며, Toleration이 있는 파드만 스케줄링될 수 있습니다.
4.1 노드에 Taint 설정
Taint 효과
NoSchedule
: 이 Taint를 가진 노드에는 Toleration이 있는 파드만 스케줄링될 수 있습니다.PreferNoSchedule
: 가능하면 이 Taint를 가진 노드에는 Toleration이 있는 파드만 스케줄링하려고 합니다.NoExecute
: Toleration이 없는 기존 파드는 이 노드에서 축출됩니다.
4.2 파드에 Toleration 설정
Tolerations
는 파드에 설정되며, 특정 Taint를 가진 노드에 스케줄링될 수 있도록 허용합니다.
7/04-pod-toleration.yaml
disktype=ssd
와NoSchedule
효과를 가진 Taint를 허용하여, 해당 Taint를 가진 노드에 파드를 스케줄링할 수 있도록 합니다.
4.3 노드에 Taint 해제
5. Cordon 및 Uncordon
5.1 Cordon
새로운 파드가 해당 노드에 스케줄링되지 않도록 합니다.
이미 해당 노드에 스케줄링된 파드에는 영향을 미치지 않습니다.
5.2 Uncordon
cordon
상태로 설정된 노드를 다시 스케줄링 가능 상태로 만듭니다.
5.3 특정 노드에 위치한 파드를 모두 다른 노드로 옮길 경우
(1) 노드에 cordon 설정
새로운 파드가 스케줄링되지 않도록 설정
(2) 노드를 drain 상태로 설정
노드에 위치한 파드를 추출하여 다른 노드로 이동