안녕하세요, 오늘은 베스핀글로벌 DevOps실 구연수 님이 작성해 주신 ‘내 Pod 의 Node 를 정해주고 싶을때 – Node Affinity’에 대해 알아보겠습니다.
Node Affinity
특정 Node에 Pod가 위치할 수 있도록 하는 개선된 기능 Node Affinity
같은 동작을 하는 Node Selector와 Node Affinity 정의 파일
- 요구사항 : Large Node에 Pod를 위치시킬 것
Node Selector 정의 파일
apiVersion: v1
kind: Pod
metadata:
name:
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
size: Large
Node Affinity 정의 파일
apiVersion: v1
kind: Pod
metadata:
name:
spec:
containers:
- name: my-container
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- Large
Node Affinity 타입
- Node Affinity 타입으로 스케쥴러의 행동과 Pod 생명 주기의 단계를 정의할 수 있다
- Available [사용 가능한 타입]
- requiredDuringSchedulingIgnoredDuringExecution
- preferredDuringSchedulingIgnoredDuringExecution
- Planned [예정된 타입 -> 현재 사용할 수 있는지 추후 확인할 것]
- requiredDuringSchedulingRequiredDuringExecution
DurungScheduling | DuringExecution | |
---|---|---|
type 1 | required | ignored |
type 2 | preferred | ignored |
type 3 | required | required |
- DurungScheduling : pod가 존재하지 않으며 최초로 생성되는 단계. Pod가 최초 생성될 때 명시된 Affinity Rule을 고려하여 적절한 Node에 pod를 위치 시킨다. [만약 label과 매치되는 node가 사용 불가능한 상황이라면?]
- required
- 스케줄러는 정의된 Affinity 규칙에 node에 pod가 위치하도록 위임한다. 만약 발견되지 않는다면 pod를 스케줄링하지 않는다.
- pod의 위치가 중요시될 때 사용하는 규칙이다.
- preferred
- 매치되는 node가 없다면 스케줄러는 정의된 Affinity 규칙에 상관없이 사용 가능한 아무 node에나 위치 시킨다.
- pod의 위치가 별로 중요하지 않을 때 사용되는 규칙이다.
- required
- DuringExecution : pod가 이미 운영중인 상태이고 변화가 발생한 단계에서 Affinity가 영향을 준다 [만약 node의 label이 변경된다면?]
- ignored
- Node Affinity에 어떤 변화가 있더라도 pod는 상관없이 그대로 운영한다.
- required
- Affinity 규칙을 충족시키지 못한다면 실행중인 어떤 pod이던 node에서 퇴출시킨다.
- ignored
감사합니다.
Written by 구 연수 / Yeonsoo koo
Software Engineer