Container Orchestration/Kubernetes

Kubernetes Affinity 및 Scheduling 설정 가이드

Somaz 2024. 4. 19. 20:28
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

 

 

2. 어피니티(Affinity)

  • 노드 셀렉터보다 고급이며, 특정 파드 배치에 대한 규칙을 설정한다.
  • 주요 유형: 노드 어피니티(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
반응형