02-08 01:02
반응형
250x250
Recent Posts
Recent Comments
Link
관리 메뉴

DevOps Tasks

Kubernetes Taints, Tolerations, Node Affinity를 활용한 최적의 Pod 스케줄링 본문

Kubernetes

Kubernetes Taints, Tolerations, Node Affinity를 활용한 최적의 Pod 스케줄링

데밥스 2024. 12. 28. 00:14
728x90
반응형

 

Kubernetes의 세 가지 핵심 기능인 `taint`, `tolerations`, `nodeAffinity`를 개별적으로 사용할 때 발생할 수 있는 문제점들과, 이를 AWS 환경에서 GPU 노드, SSD 디스크 노드, 리전별 노드에 적용하여 복합적으로 사용하는 방법을 쉽게 이해할 수 있도록 설명해 드리겠습니다.

 


왜 세 가지 기능을 함께 사용해야 할까요?

Kubernetes에서 Pod 스케줄링을 제어하는 방법은 다양합니다.

그중에서도 `taint`, `tolerations`, `nodeAffinity`는 각각 고유한 역할을 합니다.

하지만 이들을 개별적으로 사용할 경우, 원하는 스케줄링 결과를 얻지 못할 수 있습니다.

 

1. `taint`와 `tolerations`만 사용할 때의 문제점

`taint`와 `tolerations`는 특정 노드에 Pod가 스케줄링되는 것을 제한하거나 허용하는 데 사용됩니다.

예를 들어, GPU를 사용하는 Pod가 GPU가 장착된 노드에만 배치되도록 설정할 수 있습니다.

 

문제 1: 노드의 세부 속성 미반영

`AWS`의 `p3 인스턴스`에 `dedicated=gpu:NoSchedule` 테인트를 적용했다고 가정해 봅시다.

이 설정은 GPU Pod만 해당 노드에 스케줄링되도록 합니다.

하지만 이 설정만으로는 그 노드가 SSD 디스크를 가지고 있는지, 특정 리전에 있는지 등을 제어할 수 없습니다.

 

쉽게 말해,

" 이 방에는 GPU Pod만 들어올 수 있어요! " 라고 표기했지만,

그 방이 SSD 디스크를 가지고 있는지, 특정 리전에 위치한 지도 신경 쓰지 못하는 상황입니다.

 

문제 2: Pod 간의 상호 배제 어려움

예를 들어, A 포드는 `p3 인스턴스`에만, B 포드는 `i3 인스턴스`에만 배치되도록 설정한다고 합시다.

`dedicated=blue:NoSchedule` 테인트를 `p3 인스턴스`에, `dedicated=red:NoSchedule` `taint`를 `i3 인스턴스`에 적용하면 됩니다.

하지만 동일한 `taint`를 공유하는 다른 Pod들도 같은 `tolerations`을 가지면, 원치 않는 Pod가 해당 노드에 스케줄링될 수 있습니다.

 

쉽게 말해,

" A 포드만 들어올 수 있어요 ! " 라고 표기했지만,

만약 다른 Pod들도 같은 조건을 만족하면, 원치 않는 Pod들이 그 방에 들어올 수 있는 상황입니다.

 


2. `nodeAffinity`만 사용할 때의 문제점

`nodeAffinity`는 Pod가 특정 노드에 배치되도록 규칙을 설정하는 데 유용합니다.

예를 들어, SSD 디스크가 필요한 Pod를 `i3 인스턴스`에만 배치할 수 있습니다.

 

문제 1: 노드의 상호 배제 제어 불가

`nodeAffinity`만 사용하면 Pod가 특정 노드에 배치되기는 하지만, 그 노드에 다른 Pod들이 들어오는 것을 막을 수 없습니다.

예를 들어, 파란색 포드가 p3 인스턴스에만 배치되도록 설정해도, 다른 색상의 포드들이 동일한 노드에 들어올 수 있습니다.

 

쉽게 말해,

" `p3 인스턴스`에만 GPU 파드가 들어올 수 있어요 ! " 라고 규칙을 설정했지만,

다른 유형의 파드들이 그 인스턴스에 들어오는 것을 막을 수 없는 상황입니다.

 

문제 2: 노드의 특정 제약 조건 미반영

특정 노드가 유지보수 중일 때, `nodeAffinity`만으로는 해당 노드에 Pod가 스케줄링되지 않도록 할 수 없습니다.

유지보수 중인 노드에 Pod를 배치하지 않으려면 별도의 제어가 필요합니다.

 

쉽게 말해,

" 이 방은 청소 중이라 잠시 동안 들어올 수 없어요 ! "
라고 설정했지만,

`nodeAffinity`만으로는 이를 반영할 수 없는 상황입니다.

 


세 가지 기능을 복합적으로 사용하는 이유

 

위의 문제점들을 해결하기 위해 `taint`, `tolerations`, `nodeAffinity`를 함께 사용하는 것이 중요합니다.

AWS 환경을 기준으로 어떻게 이들을 조합하여 문제를 해결할 수 있는지 살펴보겠습니다.

 

시나리오

  • GPU 노드 (p3 인스턴스): 고성능 GPU가 탑재된 p3 인스턴스에 GPU를 필요로 하는 Pod만 스케줄링되기를 원합니다.
  • SSD 디스크 노드 (i3 인스턴스): 고속 SSD 디스크가 탑재된 i3 인스턴스에 SSD를 필요로 하는 Pod만 스케줄링되기를 원합니다.
  • 리전별 배치 (us-west-1 리전): 특정 리전(us-west-1)에 있는 노드에 우선적으로 Pod를 배치하고 싶습니다.

 

복합 사용의 해결책

`taint`, `tolerations`, `nodeAffinity`를 함께 사용하면 다음과 같은 이점을 누릴 수 있습니다.

 

정교한 제어

`taint`와 `tolerations`을 통해 노드의 특정 조건(예: GPU 노드)을 반영하고, `nodeAffinity`를 통해 노드의 다른 속성(예: 디스크 유형, 리전)을 추가로 제어할 수 있습니다.

우선순위 관리

`nodeAffinity`의 선호 조건을 통해 Pod가 우선적으로 특정 노드에 배치되도록 유도하면서, `taint`와 `tolerations`을 통해 필수 조건을 강제할 수 있습니다.

유연성과 안정성

복합적인 조건을 통해 클러스터의 자원을 효율적으로 관리하고, Pod의 성능과 가용성을 최적화할 수 있습니다.

 

복합 사용 예시

이를 구현하는 YAML 예시는 다음과 같습니다

# 이 Pod는 GPU 노드(p3 인스턴스)이면서 SSD 디스크를 가진 노드(i3 인스턴스)에 반드시 스케줄되고, 가능한 한 특정 AWS 리전(us-west-1)에 배치되도록 최적화됩니다.

apiVersion: v1
kind: Pod
metadata:
  name: optimized-pod
spec:
  tolerations:
    - key: "dedicated"
      operator: "Equal"
      value: "gpu"
      effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: "disktype"
                operator: "In"
                values:
                  - "ssd"
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 2
          preference:
            matchExpressions:
              - key: "zone"
                operator: "In"
                values:
                  - "us-west-1"
  containers:
    - name: optimized-container
      image: optimized-image

설명

`tolerations`

`dedicated=gpu:NoSchedule` `taint`를 가진 `p3 인스턴스`에 스케줄 될 수 있도록 허용합니다.

`Required nodeAffinity`

`disktype=ssd` 레이블을 가진 `i3 인스턴스`에만 스케줄링됩니다.

`Preferred nodeAffinity`

가능한 한 `zone=us-west-1` 리전에 있는 노드에 우선적으로 스케줄링됩니다.

 


결론

Kubernetes에서 `taint`, `tolerations`, `nodeAffinity`는 Pod 스케줄링을 세밀하게 제어하는 중요한 도구들입니다.

이들을 개별적으로 사용하는 경우 발생할 수 있는 제약과 문제점을 이해하고, AWS 환경에서 이를 복합적으로 활용하면 클러스터 자원을 효율적으로 관리하고, Pod의 성능과 가용성을 최적화할 수 있습니다.

728x90
반응형