본문 바로가기
[DevOps]/Kubernetes

kubernetes - 노드와 파드 간 상호작용 제어 기술(Taint, Toleration, Node Selector, Node Affinity)

by 황원용 2023. 11. 23.
728x90

📌 Taint & Toleration

  • 쉽게 말해 노드와 파드 간의 상호작용을 제어하는 기능이다.
  • Taint와 Toleration을 함께 사용하면 특정 노드에만 특정 유형의 파드를 스케줄링하도록 제한할 수 있다.
    • 이를 통해 특정한 역할을 가진 노드에만 특정한 유형의 파드를 할당하거나, 노드를 보호하기 위해 파드가 스케줄링되지 않도록 할 수 있다. 

 

📌 Taint

  • 노드에 특정한 제약 조건을 설정한다.
  • 주로 노드에 특정한 상황이나 제약 사항이 있는 경우에 사용된다.
    • 예를 들어, 특정 노드에는 특정한 유형의 파드만 스케줄링하고 싶다면 해당 노드에 Taint를 설정하여 다른 유형의 파드가 해당 노드에 스케줄링되지 않도록 할 수 있다.

 

Kubectl taint nodes <nodeName> key=value:<taintEffect>

 

💡 taint-effect

NoSchedule

  • Taint가 설정된 노드에 해당 toleration이 없는 파드를 스케줄링할 수 없도록 막는 옵션이다.
  • 만약 노드에 NoSchedule Taint가 설정되어 있다면 해당 노드에는 파드가 자동으로 스케줄링되지 않는다.

PreferNoSchedule

  • Taint가 설정된 노드에 파드를 스케줄링하긴 하지만 다른 노드(Taint가 설정되지 않은)를 우선적으로 고려하는 옵션이다.
    • 즉, 파드는 가능한 경우 다른 노드에 스케줄링되지만, 해당 노드에만 스케줄링이 가능한 경우에는 그대로 스케줄링된다.
  • 특정 노드를 피하고자 하지만, 어쩔 수 없을 때에는 해당 노드에 스케줄링되는 것을 허용하고자 하는 경우에 사용한다.

NoExecute

  • Taint가 설정된 노드에 이미 스케줄링되어 있는 파드들에게 영향을 주는 옵션이다.
  • NoExecute Taint가 설정된 노드에 파드가 이미 스케줄링되어 있는 경우, 해당 노드에서 Taint를 허용하지 않는 파드들은 다른 노드로 이동하게 됩니다.
    • 이는 노드의 상태가 변경되어 파드를 안전하게 이동시키고자 할 때 유용합니다.

 

🧹 taint 제거

kubectl taint nodes controlplane node-role.kubernetes.io/control-plane:NoSchedule-

위 명령어와 같이 '-'를 붙이는 것으로 taint를 제거할 수 있다.

 

📌 Toleration

  • 파드가 특정한 Taint를 허용하도록 지정하는 것이다.
  • Toleration을 설정한 파드는 해당 Taint가 설정된 노드에 스케줄링될 수 있게 된다.
  • 파드의 스펙에 tolerations 필드를 추가하여 설정할 수 있다.

 

예시

  • key: 말 그대로 key이다.
  • value: 말그대로 value이다.
  • effect: 위의 taint-effect를 말한다.

operator

  • "Equal" 연산자 (=): Tolerations의 키-값 쌍과 노드의 Taint의 키-값 쌍이 정확히 일치하는 경우에만 파드를 해당 노드에 스케줄링한다.
  • "Exists" 연산자 (Exists): Tolerations의 키-값 쌍과 노드의 Taint의 키가 일치하는 경우에만 파드를 해당 노드에 스케줄링합니다. 값은 일치하지 않아도 된다.
  • "DoesNotExist" 연산자 (DoesNotExist): Tolerations의 키가 노드의 어떤 Taint와도 일치하지 않는 경우에만 파드를 해당 노드에 스케줄링한다.

 

📌 Node Selector & Node Affinity

  • 파드가 특정 노드에 스케줄링할 수 있도록 노드 선택에 제한을 두는 기능이다.

📌 Node Selector

  • 파드가 어떤 노드에 스케줄링될지를 결정하는 데 사용된다.
  • 노드의 레이블(Label)과 일치하는 조건을 지정하여 특정 노드에 파드를 스케줄링할 수 있다.
  • 예를 들어, "env=production"이라는 레이블이 있는 노드에만 파드를 할당하고자 할 때 해당 노드의 레이블을 파드의 spec.nodeSelector의 하위에 입력하여 사용한다.

 

💡 노드에 Label을 적용하기

kubectl label nodes <node-name> <label-key>=<label-value>

 

 

📌 Node Affinity

  • 파드가 특정 노드에 스케줄링되도록 하는 기능을 제공한다.
  • Node Selector보다 더 유연한 스케줄링 제어가 가능하여 복잡한 요구사항에 대응할 수 있다.

 

operator

"In" 연산자

  • key와 일치하는 노드 레이블의 값이 리스트에 포함되는 경우에 조건이 충족된다.
  • 예를 들어 size: ["small", "medium"]라는 레이블이 있는 노드에 파드를 스케줄링하고자 할 때 operator: In을 사용하면 size의 값이 "small" 또는 "medium"인 노드에만 파드를 할당할 수 있다.

"NotIn" 연산자

  • key와 일치하는 노드 레이블의 값이 리스트에 포함되지 않는 경우에 조건이 충족된다.
  • 예를 들어 size: ["large", "x-large"]라는 레이블이 없는 노드에 파드를 스케줄링하고자 할 때 operator: NotIn을 사용하면 size 키의 값이 "medium"이나 "small" 등 "large" 또는 "x-large"이 아닌 레이블을 가진 노드에만 파드를 할당할 수 있다.

"Exists" 연산자

  • key와 일치하는 노드 레이블이 존재하는 경우에 조건이 충족된다.
  • 예를 들어, size라는 레이블이 있는 노드에 파드를 스케줄링하고자 할 때 operator: Exists를 사용하면 size 레이블이 존재하는 노드에만 파드를 할당할 수 있다.

"DoesNotExist" 연산자

  • key와 일치하는 노드 레이블이 존재하지 않는 경우에 조건이 충족된다.
  • 예를 들어, size라는 레이블이 없는 노드에 파드를 스케줄링하고자 할 때 operator: DoesNotExist를 사용하면 size레이블이 존재하지 않는 노드에만 파드를 할당할 수 있다.

 

💡 Node Affinity의 세 가지 유형

  • 아래의 세 유형을 활용하여 특정 노드에 파드를 할당하거나 특정 노드를 우선적으로 선택할 수 있다.

requiredDuringSchedulingIgnoredDuringExecution

  • 파드가 스케줄링될 때 반드시 지정된 조건을 충족하는 노드에 할당되어야 한다.
  • 스케줄링 단계에서만 Node Affinity를 고려하며 이미 실행 중인 파드는 무시한다.

preferredDuringSchedulingIgnoredDuringExecution

  • 파드가 스케줄링될 때 지정된 조건을 가진 노드에 가능한 한 할당되도록 한다.
    • 해당 조건을 충족하지 않는 다른 노드에 할당될 수 있다.
  • 스케줄링 단계에서는 선호도를 고려하여 스케줄링 하지만 이미 실행 중인 파드는 무시한다.

requiredDuringSchedulingRequiredDuringExecution

  • 파드가 스케줄링될 때 지정된 조건을 충족하는 노드에 할당되어야 한다.
  • 실행 중인 파드도 해당 조건을 만족하는 노드에서 계속 실행되어야 한다. 
    • 만약, 실행중인 파드가 해당 조건을 충족하지 못하면 노드에서 퇴출당한다.

 

 

 

출처

뤼튼

Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests

https://velog.io/@pinion7/Kubernetes-Pod-배치전략-Taint와-Toleration에-대해-이해하고-실습해보기

728x90