Search

Affinity

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 설정은 스케줄링 시점에만 평가됩니다. 실행 중에는 영향을 주지 않음
복잡한 클러스터 환경에서 워크로드 분산, 고가용성, 성능 최적화에 유용하게 활용됨