주요 옵션
- Node Selector: 특정 레이블 노드에 배치
- Node Name: 특정 노드에 강제 배치
- Taints & Tolerations: 노드 접근 제어
- Node Affinity & Pod Affinity/Anti-Affinity: 조건 및 Pod 관계 기반 배치
- Topology Spread Constraints: 균등한 Pod 분산
1. Node Selector
Node Selector는 Pod를 특정 레이블이 있는 노드에 배치하는 가장 간단한 방법
spec:
nodeSelector:
disktype: ssd
gpu-vendor: nvidia
주요 활용 사례:
- SSD 디스크 노드에 데이터베이스 배치
- GPU 노드에 ML 워크로드 배치
- 특정 CPU 아키텍처노드 선택
특징: 레이블 key-value가 정확히 일치하는 노드에만 배치(AND 조건).
복잡한 조건 불가 → Node Affinity로 대체 가능
2. Node Name
Node Name은 Pod를 특정 노드 이름에 강제로 배치
spec:
nodeName: kube-node-01
주요 활용 사례:
- 시스템 에이전트 배치
- 디버깅/테스트용 특정 노드 지정
- 특정 노드의 로컬 볼륨 사용
특징: 스케줄러를 무시하고 지정된 노드에 직접 배치
노드가 다운되면 Pod는 Pending 상태로 남아있어 일반 애플리케이션에는 비추천
3. Taints & Tolerations
Taints는 노드가 특정 Pod를 거부하도록 설정하고, Tolerations는 Pod가 이를 허용
Taint 설정 (Node):
kubectl taint nodes node-01 special-workload=true:NoSchedule
Toleration 설정 (Pod):
spec:
tolerations:
- key: "special-workload"
operator: "Equal"
value: "true"
effect: "NoSchedule"
Taint 효과:
- NoSchedule: 새로운 Pod 배치 금지
- PreferNoSchedule: 배치 피하려고 노력
- NoExecute: 배치 금지 + 기존 Pod 퇴출
주요 활용 사례:
- GPU 노드에 일반 Pod 배치 방지
- 특정 팀 전용 노드 격리
- 장애 노드에서 Pod 자동 이동
4. Node Affinity
Node Affinity는 복잡한 조건으로 노드를 선택
required(강제)와 preferred(선호) 두 가지 유형
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 60
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
지원 연산자: In, NotIn, Exists, DoesNotExist, Gt, Lt
주요 활용 사례:
- 특정 가용 영역(AZ)에 Pod 배치
- 고성능 CPU/메모리 노드 선호
- 특정 인스턴스 타입 제외
특징: Node Selector보다 유연하며, 복잡한 조건과 가중치 지원.
5. Pod Affinity & Anti-Affinity: Pod 간 관계 제어
Pod Affinity는 특정 Pod와 같은 위치에, Anti-Affinity는 다른 위치에 배치
topologyKey로 범위를 지정
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: cache-service
topologyKey: "kubernetes.io/hostname"
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: my-critical-app
topologyKey: "kubernetes.io/hostname"
실제 시나리오 예제: 웹 서버와 Redis를 같은 AZ에 배치
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis
topologyKey: "topology.kubernetes.io/zone"
주요 활용 사례:
- Affinity: 웹 서버와 캐시를 같은 노드/AZ에 배치하여 네트워크 지연 최소화
- Anti-Affinity: 애플리케이션 복제본을 다른 노드/AZ에 분산해 고가용성 확보
- 마이크로서비스 간 통신 최적화
6. Topology Spread Constraints
Topology Spread Constraints는 Pod를 노드, AZ, 리전 등에 고르게 분산
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: my-app
주요 필드:
- maxSkew: 특정 토폴로지 도메인 간 Pod 수의 최대 허용 차이
- maxSkew: 1은 가장 균등한 분산
- topologyKey: 분산의 기준이 되는 노드 레이블 키
- whenUnsatisfiable: 제약 조건을 만족시킬 수 없을 때 스케줄러의 동작을 결정
- DoNotSchedule (기본값): Pod를 스케줄링 안함
- ScheduleAnyway: Pod를 스케줄링하되, maxSkew를 최소화하는 방향으로 노력
- labelSelector: 어떤 Pod 그룹에 대해 분산 제약을 적용할지 정의합니다. 이 레이블과 일치하는 Pod들이 분산 대상
주요 활용 사례:
- AZ 간 Pod 균등 분산으로 장애 영향 최소화
- 노드별 워크로드 과부하 방지
- 트래픽 부하 분산
특징: Anti-Affinity보다 세밀한 분산 제어 가능.
결론
Kubernetes Pod 스케줄링은 클러스터의 가용성, 성능, 비용 효율성을 최적화하는 핵심 도구
간단한 배치에는 Node Selector와 Node Name을
노드 격리에는 Taints & Tolerations를
복잡한 조건과 관계 제어에는 Node/Pod Affinity를
고른 분산에는 Topology Spread Constraints를 활용
참고 자료:
'귀찮게하기 > DevOps-SRE' 카테고리의 다른 글
클러스터 외부에서 Istio Service Mesh 파드 접근 흐름 (0) | 2025.05.16 |
---|---|
Pod와 ServiceAccount의 관계 (0) | 2025.05.14 |
Redis에 대한 오해 (0) | 2025.04.23 |
DevOps - istio(2) (1) | 2025.04.12 |
[Kubernetes] RBAC (0) | 2025.04.05 |