서론
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가 존재하지 않으면 일치
Comment