[Kubernetes] NodeAffinity


서론

NodeSelector를 활용하여 단순 레이블을 바탕으로 파드를 특정 노드에 배치할 수 있도록 하는 역할을 하였다.

그러나 NodeAffinity를 활용하면 좀 더 세부적인 설정을 바탕으로 파드를 특정 노드에 배치할 수 있게 된다.

따라서 이번 포스트에서는 NodeAffinity에 대해서 알아본다.

NodeAffinity

  • 파드를 특정 노드에만 제한적으로 배치하기 위한 기능
  • 왼쪽은 NodeSelector, 오른쪽은 NodeAffinity이다.
# Pod Definition
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: In
            values:
            - Large

    

Affinity Type

required

  • 스케줄러는 반드시 Affinity조건을 만족하는 노드에만 파드를 배치한다. (만족하지 않으면 배치하지 않는다)
    • 파드의 배치가 매우 중요한 경우

preferred

  • 조건에 맞는 노드를 찾지 못하더라도, 스케줄러는 노드 어피니티 규칙을 무시하고 사용 가능한 아무 노드에 파드를 배치합니다.
    • 파드의 배치보다 작업을 실행하는 것이 더 중요한 경우

During scheduling

  • 파드가 아직 존재하지 않고 처음 생성될 때의 상태

During execution

  • 파드가 이미 실행 중이고 노드 어피니티에 영향을 미치는 환경 변경이 일어나는 상태
  • 예를 들어, 노드의 라벨이 변경되는 경우

requiredDuringSchedulingIgnoredDuringExecution

  • 파드가 처음 생성될 때(DuringScheduling) 조건에 만족(required)하는 노드에만 파드를 배치하고
  • 이미 파드가 이미 배치되었고 이후 node affinity조건이 변경된 경우(DuringExecution)에는 무시한다(Ignored).

preferredDuringSchedulingIgnoredDuringExecution

  • 파드가 처음 생성될 때(DuringScheduling) 조건에 맞는 노드를 찾지 못하더라도(preferred) 스케줄러는 노드 어피니티 규칙을 무시하고, 사용 가능한 아무 노드에 파드를 배치
  • 이미 파드가 이미 배치되었고 이후 node affinity조건이 변경된 경우(DuringExecution)에는 무시한다(Ignored).

requiredDuringSchedulingRequiredDuringExecution

  • 파드가 처음 생성될 때(DuringScheduling) 조건에 만족(required)하는 노드에만 파드를 배치하고
  • 이미 파드가 이미 배치되었고 이후 node affinity조건이 변경된 경우(DuringExecution)에는 파드를 종료시킨다(required).

Operator

  • In: 값 목록에 포함되면 일치
  • Not In: 목록에 포함되지 않으면 일치
  • Exists: 해당 key 라벨이 존재하면 일치(value값은 확인하지 않음)
  • DoesNotExist: key가 존재하지 않으면 일치