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

  • requiredDuringSchedulingIgnoredDuringExecutiondisktypessd인 노드에만 파드를 스케줄링합니다.

  • preferredDuringSchedulingIgnoredDuringExecutionregioneast인 노드를 선호하지만, 해당 노드가 없으면 다른 노드에 스케줄링될 수 있습니다.

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

  • requiredDuringSchedulingIgnoredDuringExecutionapp=myapp 라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 합니다.

  • preferredDuringSchedulingIgnoredDuringExecutionapp=otherapp 라벨을 가진 파드와 같은 노드에 스케줄링되지 않도록 선호하지만, 조건을 만족하지 않더라도 스케줄링될 수 있습니다.

 

Topology Key

  • topologyKey는 노드 간의 관계를 정의합니다. 일반적으로 kubernetes.io/hostname을 사용하여 같은 노드에 스케줄링되는지를 결정합니다.

  • 다른 토폴로지 키를 사용하여 동일한 리전, 존, 랙 등에 배치되는지 여부를 제어할 수 있습니다.

  • 위 예제는 특정 파드가 동일한 노드에 배치되지 않도록 하는 방법입니다.


3. Pod Affinity 및 Pod Anti-Affinity

  • 특정 파드가 다른 파드와 같은 노드 또는 다른 노드에 배치되도록 합니다.

7/03-pod-affinity.yaml

  • podAffinity는 app=frontend 라벨을 가진 파드가 있는 노드에 example-pod3을 배치합니다.

  • podAntiAffinityapp=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=ssdNoSchedule 효과를 가진 Taint를 허용하여, 해당 Taint를 가진 노드에 파드를 스케줄링할 수 있도록 합니다.

4.3 노드에 Taint 해제

5. Cordon 및 Uncordon

5.1 Cordon

  • 새로운 파드가 해당 노드에 스케줄링되지 않도록 합니다.

  • 이미 해당 노드에 스케줄링된 파드에는 영향을 미치지 않습니다.

5.2 Uncordon

  • cordon 상태로 설정된 노드를 다시 스케줄링 가능 상태로 만듭니다.

5.3 특정 노드에 위치한 파드를 모두 다른 노드로 옮길 경우

(1) 노드에 cordon 설정

  • 새로운 파드가 스케줄링되지 않도록 설정

 

(2) 노드를 drain 상태로 설정

  • 노드에 위치한 파드를 추출하여 다른 노드로 이동

 

Related content

8. 쿠버네티스 리소스 관리 및 볼륨
8. 쿠버네티스 리소스 관리 및 볼륨
Read with this
1. 쿠버네티스 실습환경 구축
1. 쿠버네티스 실습환경 구축
Read with this
9. 쿠버네티스 백업/복구
9. 쿠버네티스 백업/복구
Read with this
3. 컨테이너와 쿠버네티스
3. 컨테이너와 쿠버네티스
Read with this
0. 선수지식 및 실습환경 준비
0. 선수지식 및 실습환경 준비
Read with this
6. 쿠버네티스 서비스/네트워크
6. 쿠버네티스 서비스/네트워크
Read with this