Node Affinity
Node Affinity
개념
nodeAffinity는Pod가 특정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 | 설명 |
|---|---|
In | value 목록 중 하나와 일치 |
NotIn | value 목록과 일치하지 않는 노드 선택 |
Exists | key만 존재하면 매칭 |
DoesNotExist | key 자체가 없으면 매칭 |
Node Affinity의 Type
현재 사용할 수 있는 Type
requiredDuringSchedulingIgnoredDuringExecution- 스케줄링 시: 반드시 조건을 만족하는
Node에만 배치- 만족하는
Node가 없으면Pod는Pending상태가 된다.
- 만족하는
- 실행 중:
label이 변경되어도Pod는 그대로 유지Node의label이 변경되어도Pod는 그대로 유지된다.
- 스케줄링 시: 반드시 조건을 만족하는
preferredDuringSchedulingIgnoredDuringExecution- 스케줄링 시: 조건을 만족하는
Node에 우선 배치- 만족하는
Node가 없으면 아무Node에나 배치
- 만족하는
- 실행 중:
label이 변경되어도Pod는 그대로 유지Node의label이 변경되어도Pod는 그대로 유지된다.
- 스케줄링 시: 조건을 만족하는
앞으로 추가될 예정 (아직 지원 X)
requiredDuringSchedulingRequiredDuringExecution- 스케줄링 시: 반드시 조건을 만족하는
Node에만 배치- 만족하는
Node가 없으면Pod는Pending상태가 된다.
- 만족하는
- 실행 중:
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=Mediumkey-value를label로 가진Node에 배치될 수 있다. specaffinitynodeAffinityrequiredDuringSchedulingIgnoredDuringExecution: Node Affinity의 타입nodeSelectorTermsmatchExpressions: 여기에 조건 작성
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에 배치될 수 있다.
레퍼런스
- https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
- https://kubernetes.io/blog/2017/03/advanced-scheduling-in-kubernetes/
- Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests (Mumshad)