본문으로 건너뛰기

Node Affinity


Node Affinity

개념

  • nodeAffinityPod가 특정 Node에 배치되도록 강제하거나 유도하는 기능이다.
  • 위 설명만 들었을 때는 nodeSelector랑 다를게 뭐지? 라는 생각이 들 것이다.
  • 예를들어 size: Large라는 label이 붙은 Node가 1개, size: Medium라는 label이 붙은 Node가 1개 size: Small이라는 label이 붙은 Node가 2개라고 하자.
  • 이때, 나는 size: Large 혹은 size: Medium인 노드에 특정 Pod를 배치하고싶다.
  • 이 경우 nodeSelector로는 불가능하다. 왜냐하면 nodeSelector는 AND 연산만 가능하기 때문이다.
  • 이렇게 조금 더 복잡한 조건을 매칭시켜야하는 경우 사용할 수 있는 기능이 nodeAffinity이다.

대표적인 operator

Operator설명
Invalue 목록 중 하나와 일치
NotInvalue 목록과 일치하지 않는 노드 선택
Existskey만 존재하면 매칭
DoesNotExistkey 자체가 없으면 매칭

Node Affinity의 Type

현재 사용할 수 있는 Type

  • requiredDuringSchedulingIgnoredDuringExecution
    • 스케줄링 시: 반드시 조건을 만족하는 Node에만 배치
      • 만족하는 Node가 없으면 PodPending상태가 된다.
    • 실행 중: label이 변경되어도 Pod는 그대로 유지
      • Nodelabel이 변경되어도 Pod는 그대로 유지된다.
  • preferredDuringSchedulingIgnoredDuringExecution
    • 스케줄링 시: 조건을 만족하는 Node에 우선 배치
      • 만족하는 Node가 없으면 아무 Node에나 배치
    • 실행 중: label이 변경되어도 Pod는 그대로 유지
      • Nodelabel이 변경되어도 Pod는 그대로 유지된다.

앞으로 추가될 예정 (아직 지원 X)

  • requiredDuringSchedulingRequiredDuringExecution
    • 스케줄링 시: 반드시 조건을 만족하는 Node에만 배치
      • 만족하는 Node가 없으면 PodPending상태가 된다.
    • 실행 중: label이 변경되면 Pod가 재배치된다.
  • preferredDuringSchedulingRequiredDuringExecution
    • 스케줄링 시: 조건을 만족하는 Node에 우선 배치
      • 만족하는 Node가 없으면 아무 Node에나 배치
    • 실행 중: label이 변경되면 Pod가 재배치된다.

YAML

apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: data-processor
image: data-processor
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- Large
- Medium
  • 예시1: size=Large 혹은 size=Medium key-value를 label로 가진 Node에 배치될 수 있다.
  • spec
    • affinity
      • nodeAffinity
        • requiredDuringSchedulingIgnoredDuringExecution: Node Affinity의 타입
          • nodeSelectorTerms
            • matchExpressions: 여기에 조건 작성
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: data-processor
image: data-processor
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: NotIn
values:
- Small
  • 예시2: size=Small이라는 key-value를 label로 가진 Node만 아니면 어느 Node에도 배치될 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: data-processor
image: data-processor
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: Exists
  • 예시3: size라는 key를 가진 모든 Node에 배치될 수 있다.

레퍼런스