1. Node Affinity (노드 어피니티)
특정 노드의 레이블(Label) 을 기반으로 파드가 어떤 노드에 배치될지를 제어. 이는 nodeSelector와 비슷하지만 더 유연함
용도 예시:
•
GPU가 있는 노드에만 파드를 배치하고 싶을 때
•
특정 지역(zone)이나 환경(env)의 노드에만 배치하고 싶을 때
종류:
•
requiredDuringSchedulingIgnoredDuringExecution : 조건에 맞게 스케쥴링을 할 수 없을 때 pending 파드 발생(hard)
•
preferredDuringSchedulingIgnoredDuringExecution : 조건에 맞게 스케쥴링 하도록 시도하지만, 맞지 않더라도 스케쥴링 가능(soft)
예시:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
YAML
복사
위 설정은 disktype=ssd 라는 레이블을 가진 노드에만 파드가 배치되도록 함
2. Pod Affinity (파드 어피니티)
다른 파드들과 가까운 노드에 함께 배치되도록 요청
용도 예시:
•
같은 앱의 파드들이 같은 노드 또는 같은 영역에 위치하도록 하고 싶을 때
•
데이터 집약적인 앱을 같은 노드에 모아서 네트워크 지연을 줄이고 싶을 때
예시:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
YAML
복사
이 설정은 app=myapp 라는 레이블을 가진 파드가 있는 같은 노드(hostname) 에 파드를 배치함
3. Pod Anti-Affinity (파드 안티 어피니티)
특정 파드와는 같은 노드에 배치되지 않도록 함. 즉, 파드 간의 분산 배치를 할 수 있음.
용도 예시:
•
장애에 대비하여 동일한 서비스 파드가 서로 다른 노드에 배치되도록
•
동일한 DB 인스턴스들이 같은 물리 머신에 있지 않도록
예시:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mydb
topologyKey: "kubernetes.io/hostname"
YAML
복사
이 설정은 app=mydb 라는 레이블을 가진 파드와는 같은 노드에 배치되지 않도록 함
topologyKey란?
•
affinity 조건이 적용되는 범위를 지정
•
주요 값:
◦
"kubernetes.io/hostname" → 같은 노드
◦
"topology.kubernetes.io/zone" → 같은 가용영역 (AZ)
◦
"topology.kubernetes.io/region" → 같은 리전
required vs preferred 차이
유형 | 설명 | 강제성 |
requiredDuringSchedulingIgnoredDuringExecution | 조건을 반드시 만족해야 스케줄링됨 | 강제 |
preferredDuringSchedulingIgnoredDuringExecution | 조건을 가능하면 만족하면 좋음 | 선택 |
"required"는 조건이 맞지 않으면 파드가 스케줄되지 않고 대기 상태(Pending)가 됨
"preferred"는 조건을 최대한 맞추지만, 안 맞아도 배치는 됨
실전에서 조합 예시
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: zone
operator: In
values:
- zone-a
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: "kubernetes.io/hostname"
YAML
복사
이 설정은 다음을 의미
•
가능한 zone=zone-a 노드에 배치
•
하지만 반드시 app=web 파드와는 다른 노드에 배치
nodeSelector vs Affinity 차이
항목 | nodeSelector | Affinity |
유연성 | 낮음 | 높음 (In, NotIn, Exists 등 가능) |
논리 연산 | 단순 키=값만 | AND, OR, NOT 등 지원 |
파드 간 관계 | 지원 안함 | PodAffinity, AntiAffinity로 가능 |
선호 조건 | 불가 | 가능 (preferred) |
참고
•
Affinity 설정은 스케줄링 시점에만 평가됩니다. 실행 중에는 영향을 주지 않음
•
복잡한 클러스터 환경에서 워크로드 분산, 고가용성, 성능 최적화에 유용하게 활용됨