l Pod 배포 스케줄 개요 - NodeSelector 설명
cordon/uncordon
...
목차 | ||
---|---|---|
|
...
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
코드 블럭 |
---|
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: region
operator: In
values:
- east
containers:
- name: mycontainer
image: nginx |
requiredDuringSchedulingIgnoredDuringExecution
는disktype
이ssd
인 노드에만 파드를 스케줄링합니다.preferredDuringSchedulingIgnoredDuringExecution
는region
이east
인 노드를 선호하지만, 해당 노드가 없으면 다른 노드에 스케줄링될 수 있습니다.
정보 |
---|
Events 발생 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. |
코드 블럭 |
---|
# kubectl label nodes w2-k8s disktype=ssd
# kubectl get nodes --show-labels -L disktype |
2.2 Node Anti-Affinity(Pod Anti-Affinity 내용)
다른 파드와 겹치지 않게 할 때 사용합니다.
파드가 특정 노드에 스케줄링되지 않도록 설정하는 방법으로 크게 두 가지 유형이 있습니다.
requiredDuringSchedulingIgnoredDuringExecution
파드가 반드시 조건을 만족하지 않는 노드에만 스케줄링됩니다.
preferredDuringSchedulingIgnoredDuringExecution
조건을 만족하지 않는 노드에 우선적으로 스케줄링되지만, 필요하다면 다른 노드에 스케줄링될 수 있습니다.
7/02-node-anti-affinity.yaml
코드 블럭 |
---|
apiVersion: v1
kind: Pod
metadata:
name: example-pod2
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- otherapp
topologyKey: "kubernetes.io/hostname"
containers:
- name: mycontainer
image: nginx |
requiredDuringSchedulingIgnoredDuringExecution
는app=myapp
라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 합니다.preferredDuringSchedulingIgnoredDuringExecution
는app=otherapp
라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 선호하지만, 조건을 만족하지 않더라도 스케줄링될 수 있습니다.
Topology Key
topologyKey
는 노드 간의 관계를 정의합니다. 일반적으로kubernetes.io/hostname
을 사용하여 같은 노드에 스케줄링되는지를 결정합니다.다른 토폴로지 키를 사용하여 동일한 리전, 존, 랙 등에 배치되는지 여부를 제어할 수 있습니다.
위 예제는 특정 파드가 동일한 노드에 배치되지 않도록 하는 방법입니다.
...
3. Pod Affinity 및 Pod Anti-Affinity
특정 파드가 다른 파드와 같은 노드 또는 다른 노드에 배치되도록 합니다.
7/03-pod-affinity.yaml
코드 블럭 |
---|
apiVersion: v1
kind: Pod
metadata:
name: example-pod3
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: frontend
topologyKey: kubernetes.io/hostname
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchLabels:
app: backend
topologyKey: kubernetes.io/hostname
containers:
- name: mycontainer
image: nginx |
podAffinity는 app=frontend
라벨을 가진 파드가 있는 노드에example-pod
3을 배치합니다.podAntiAffinity
는app=backend
라벨을 가진 파드가 없는 노드에example-pod3을
우선 배치합니다.
...
4. Taint 및 Tolerations
파드가 특정 노드에 스케줄링되지 않도록 제한하거나, 특정 조건을 충족하는 노드에만 스케줄링되도록 제어하는 방법입니다.
노드에 Taint를 설정하면 파드가 스케줄링 되지 않으며, Toleration이 있는 파드만 스케줄링될 수 있습니다.
4.1 노드에 Taint 설정
코드 블럭 |
---|
# kubectl taint nodes w2-k8s disktype=ssd:NoSchedule
# kubectl describe nodes | grep -i taint |
Taint 효과
NoSchedule
: 이 Taint를 가진 노드에는 Toleration이 있는 파드만 스케줄링될 수 있습니다.PreferNoSchedule
: 가능하면 이 Taint를 가진 노드에는 Toleration이 있는 파드만 스케줄링하려고 합니다.NoExecute
: Toleration이 없는 기존 파드는 이 노드에서 축출됩니다.
4.2 파드에 Toleration 설정
Tolerations
는 파드에 설정되며, 특정 Taint를 가진 노드에 스케줄링될 수 있도록 허용합니다.
7/04-pod-toleration.yaml
코드 블럭 |
---|
apiVersion: v1
kind: Pod
metadata:
name: example-pod4
spec:
tolerations:
- key: "disktype"
operator: "Equal"
value: "ssd"
effect: "NoSchedule"
containers:
- name: mycontainer
image: nginx |
disktype=ssd
와NoSchedule
효과를 가진 Taint를 허용하여, 해당 Taint를 가진 노드에 파드를 스케줄링할 수 있도록 합니다.
4.3 노드에 Taint 해제
코드 블럭 |
---|
# kubectl taint nodes w2-k8s disktype=ssd:NoSchedule-
node/w2-k8s untainted |
5. Cordon 및 Uncordon
5.1 Cordon
새로운 파드가 해당 노드에 스케줄링되지 않도록 합니다.
이미 해당 노드에 스케줄링된 파드에는 영향을 미치지 않습니다.
코드 블럭 |
---|
kubectl cordon <node-name> |
5.2 Uncordon
cordon
상태로 설정된 노드를 다시 스케줄링 가능 상태로 만듭니다.
코드 블럭 |
---|
kubectl uncordon <node-name> |
5.3 특정 노드에 위치한 파드를 모두 다른 노드로 옮길 경우
(1) 노드에 cordon 설정
새로운 파드가 스케줄링되지 않도록 설정
코드 블럭 |
---|
kubectl cordon w3-k8s |
코드 블럭 |
---|
# k get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
cp-k8s Ready control-plane 6h45m v1.29.2 192.168.1.10 <none> Ubuntu 22.04.2 LTS 5.19.0-28-generic containerd://1.6.28
w1-k8s Ready <none> 6h35m v1.29.2 192.168.1.101 <none> Ubuntu 22.04.2 LTS 5.19.0-28-generic containerd://1.6.28
w2-k8s Ready <none> 6h31m v1.29.2 192.168.1.102 <none> Ubuntu 22.04.2 LTS 5.19.0-28-generic containerd://1.6.28
w3-k8s Ready,SchedulingDisabled <none> 6h26m v1.29.2 192.168.1.103 <none> Ubuntu 22.04.2 LTS 5.19.0-28-generic containerd://1.6.28 |
(2) 노드를 drain 상태로 설정
노드에 위치한 파드를 추출하여 다른 노드로 이동
코드 블럭 |
---|
# kubectl drain w3-k8s --ignore-daemonsets --delete-emptydir-data
node/w3-k8s cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-5l222, kube-system/kube-proxy-kt66d, metallb-system/speaker-tv5fl
node/w3-k8s drained
|