728x90
반응형
Overview
Kubernetes Affinity and Scheduling에 대해서 공부해보려고 한다.
graph LR
A[Kubernetes Scheduling] -->|controls| B(NodeSelector)
A -->|more advanced| C(Affinity)
A -->|restricts| D(Taints & Toleration)
A -->|marks node| E(Cordon)
A -->|removes pods| F(Drain)
B -->|uses| G[key-value pairs]
C -->|has types| H(Node Affinity)
C -->|has types| I(Pod Affinity)
C -->|avoids node| J(Node Anti-affinity)
C -->|avoids pods| K(Pod Anti-affinity)
H -->|strict| L(requiredDuringSchedulingIgnoredDuringExecution)
H -->|preferred| M(preferredDuringSchedulingIgnoredDuringExecution)
I -->|places close| N(label selector)
J -->|places away based on node label| O(matchExpressions)
K -->|places away from specific pods| P(matchExpressions)
D -->|applies to node| Q(Taint)
D -->|set on pod| R(Toleration)
E -->|command| S(kubectl cordon)
F -->|command| T(kubectl drain)
Q -->|example| U(kubectl taint nodes nodename key=value:effect)
R -->|example| V(toleration settings in pod spec)
L -->|example| W(pod spec with nodeSelectorTerms)
M -->|example| X(pod spec with weight and preferences)
N -->|example| Y(pod spec with podAffinity)
P -->|example| Z(pod spec with podAntiAffinity)
Kubernetes Affinity and Scheduling
쿠버네티스에서는 다음과 같은 여러 메커니즘을 통해 클러스터 내에서 파드가 배포되는 위치를 제어할 수 있다.
- 노드 셀렉터(NodeSelector)
- 어피니티(Affinity)
- 테인트 & 톨러레이션(Taints & Toleration)
- 커든(Cordon)
- 드레인(Drain)
1. 노드 셀렉터(NodeSelector)
- 쿠버네티스에서 가장 간단한 스케줄링 제약 조건이다.
- 키-값 쌍을 사용하여 노드를 선택한다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd
- 노드 셀렉터보다 고급이며, 특정 파드 배치에 대한 규칙을 설정한다.
- 주요 유형: 노드 어피니티(Node Affinity) 및 파드 어피니티(Pod Affinity).
- 노드 어피니티
- `requiredDuringSchedulingIgnoredDuringExecution` 또는 `preferredDuringSchedulingIgnoredDuringExecution`으로 설정할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
- requiredDuringSchedulingIgnoredDuringExecution
- 파드가 스케줄링될 때 반드시 충족해야 하는 요구사항을 정의한다. 규칙을 만족하는 노드에만 파드가 스케줄될 수 있다.
- 특정 노드에 파드를 배치해야 할 때 사용한다. 예를 들어, 특정 라벨이 있는 노드에만 파드를 배치하고 싶은 경우 이 규칙을 사용할 수 있다.
- 만약 이 규칙을 만족하는 노드가 없다면, 파드는 스케줄되지 않는다.
- preferredDuringSchedulingIgnoredDuringExecution
- 스케줄러에게 파드가 스케줄링될 때 선호되는(하지만 필수는 아닌) 요구사항을 알린다. 스케줄러는 이 규칙을 가능한 한 충족시키려고 시도하지만, 규칙을 만족하는 노드가 없어도 파드는 다른 노드에 스케줄될 수 있다.
- 파드의 배치에 더 유연성을 제공하고자 할 때 사용한다. 예를 들어, 특정 노드에 파드를 선호적으로 배치하고 싶지만, 그러한 노드가 없거나 사용할 수 없는 경우 다른 노드에도 배치될 수 있도록 하고 싶을 때 사용할 수 있다.
- 이 규칙을 만족하는 노드가 있으면 그 노드에 파드가 우선적으로 스케줄되지만, 만족하는 노드가 없어도 파드는 스케줄될 수 있다.
- 요약하자면, `requiredDuringSchedulingIgnoredDuringExecution`은 파드의 스케줄링에 있어서 반드시 충족해야 하는 엄격한 요구사항을 정의하는 반면, `preferredDuringSchedulingIgnoredDuringExecution`은 선호되는 조건을 정의하지만, 이 조건이 충족되지 않더라도 파드가 스케줄될 수 있도록 유연성을 제공한다.
- 노드 안티-어피니티
- 특정 노드의 속성이나 라벨을 기반으로 하여 파드를 해당 노드로부터 멀리 배치하고자 할 때 사용한다.
- 노드 안티-어피니티는 노드 어피니티와 유사하게 작동하지만, 반대의 목적을 가지고 있다.
- 이 예제에서 `requiredDuringSchedulingIgnoredDuringExecution`은 disktype이 hdd가 아닌 노드에 파드를 배치하도록 요구한다. 즉, SSD 또는 다른 유형의 디스크를 사용하는 노드에만 파드가 배치될 수 있다. 또한, `preferredDuringSchedulingIgnoredDuringExecution` 설정은 cpu가 high가 아닌 노드를 선호하지만, 이는 필수 조건이 아다. weight는 이 선호도의 중요성을 나타낸다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: NotIn
values:
- hdd
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: cpu
operator: NotIn
values:
- high
containers:
- name: mycontainer
image: myimage
- 파드 어피니티
- 다른 파드의 레이블을 기준으로 규칙을 설정하는 데 사용된다.
- 역시 하드 어피니티와 소프트 어피니티 규칙을 정의할 수 있다.
- 다른 파드와 가깝게 배치되기를 원할 때 사용한다.
- `requiredDuringSchedulingIgnoredDuringExecution` 예제에서, mypod는 `app=database` 레이블을 가진 다른 파드와 같은 호스트(kubernetes.io/hostname)에 배치되어야 한다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- database
topologyKey: "kubernetes.io/hostname"
containers:
- name: mycontainer
image: myimage
- 파드 안티-어피니티
- 파드를 특정 레이블을 가진 다른 파드로부터 멀리 배치하고자 할 때 사용한다.
- `requiredDuringSchedulingIgnoredDuringExecution` 예제에서, mypod는 `app=webserver` 레이블을 가진 다른 파드와는 다른 호스트(kubernetes.io/hostname)에 배치되어야 한다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- webserver
topologyKey: "kubernetes.io/hostname"
containers:
- name: mycontainer
image: myimage
3. 테인트 & 톨러레이션(Taints & Toleration)
- 테인트는 특정 노드에 적용되어 톨러레이션을 갖지 않는 파드를 거부한다.
- 톨러레이션은 테인트가 적용된 노드에 스케줄링될 수 있도록 파드에 설정한다.
- 테인트 적용 예제
kubectl taint nodes 노드이름 키=값:효과
- 톨러레이션 설정 예제
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
4. 커든(Cordon)
- 특정 노드를 스케줄 불가능 상태로 표시하여 새로운 파드가 해당 노드에 스케줄되지 않도록 하는 데 사용된다.
kubectl cordon 노드이름
5. 드레인(Drain)
- 노드에서 모든 파드를 추방하여 유지보수 또는 노드 폐기를 위해 사용된다.
- PodDisruptionBudgets를 존중하며 `--ignore-daemonsets=true` 옵션이 사용되지 않는 한 DaemonSet으로 관리되는 파드는 제거하지 않는다.
kubectl drain 노드이름
Reference
https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
https://kubevirt.io/2020/Advanced-scheduling-with-affinity-rules.html
728x90
반응형
'Container Orchestration > Kubernetes' 카테고리의 다른 글
Kubernetes Volumes 및 StorageClass: CSI 드라이버 사용 가이드 (0) | 2024.04.28 |
---|---|
Kubernetes Operator 및 Custom Resource Definitions(CRDs) 이해하기 (0) | 2024.04.24 |
Kubernetes Network (0) | 2024.02.17 |
Kubernetes 클러스터 구축하기(kubespray 2024v.) (0) | 2024.02.02 |
k3d(k3s in docker)란? (2) | 2024.01.14 |