파드 스케줄링 기본 개념 및 YAML 구조
파드 스케줄링은 쿠버네티스에서 파드를 클러스터 내 적절한 노드에 자동으로 배치하는 과정이다. 스케줄러는 파드의 요구사항, 노드의 상태, 다양한 정책과 제약 조건을 고려해 파드를 최적의 노드에 할당한다. 이를 통해 리소스 활용을 극대화하고, 가용성과 확장성을 보장한다.
기본 파드 스케줄링 YAML 예시
가장 단순한 스케줄링 방법은 nodeSelector와 nodeName을 활용하는 것이다.
nodeSelector 예시
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd
nodeName 예시
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
nodeName: worker01
YAML 주요 필드 설명
apiVersion: 오브젝트 API 버전 (v1)kind: 오브젝트 종류 (Pod)metadata: 파드의 이름 등 메타데이터spec: 파드의 상세 스펙 및 스케줄링 정책containers: 파드에서 실행할 컨테이너 목록nodeSelector: 파드를 특정 레이블을 가진 노드에만 스케줄링nodeName: 파드를 특정 노드에 직접 스케줄링
주요 파드 스케줄링 정책
노드 셀렉터 (nodeSelector)
- 가장 단순한 스케줄링 방법. 파드의
.spec.nodeSelector필드에 노드의 레이블을 지정하면 해당 레이블을 가진 노드에만 파드가 스케줄링된다. - 노드에 레이블 추가:
kubectl label nodes <노드이름> <key>=<value> - 공식문서: Assign Pods to Nodes
노드 어피니티 (Node Affinity)
- 노드의 레이블 기반 고급 스케줄링.
.spec.affinity.nodeAffinity필드에 설정한다. requiredDuringSchedulingIgnoredDuringExecution: 반드시 만족해야 하는 조건(하드 요구)preferredDuringSchedulingIgnoredDuringExecution: 만족하면 좋은 조건(소프트 요구, 가중치 기반)- 예시:
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd preferredDuringSchedulingIgnoredDuringExecution: - weight: 80 preference: matchExpressions: - key: zone operator: In values: - eastoperator종류:In,NotIn,Exists,DoesNotExist,Gt,Lt- required와 preferred 조건은 모두 만족하는 노드 중 preferred의 가중치가 높은 노드를 우선 선택
- 공식문서: Affinity and anti-affinity
파드 어피니티 & 안티 어피니티 (Pod Affinity & AntiAffinity)
- 파드 간의 배치 관계를 제어. 디플로이먼트/스테이트풀셋 등에서 파드 템플릿의
.spec.affinity.podAffinity또는.spec.affinity.podAntiAffinity에 설정 - 어피니티: 특정 파드와 같은 노드/영역에 배치
- 안티 어피니티: 특정 파드와 다른 노드/영역에 분산
- 예시:
spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - high-cpu topologyKey: "kubernetes.io/hostname" topologyKey: 배치 기준(노드, zone, region 등)required는 반드시,preferred는 가중치 기반
테인트와 톨러레이션 (Taint & Toleration)
- 특정 노드에 파드가 스케줄링되지 않도록 제한
- 노드에 테인트 추가:
kubectl taint nodes <노드이름> key=value:effect - 파드에 톨러레이션 추가:
.spec.tolerations필드에 설정 - 예시:
spec: tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule" - effect 종류:
NoSchedule: 톨러레이션 없으면 스케줄링 불가PreferNoSchedule: 가급적 스케줄링하지 않음NoExecute: 기존 파드도 퇴출
- 공식문서: Taints and Tolerations
기타 스케줄링 옵션
spec.nodeName: 파드를 특정 노드에 직접 스케줄링할 때 사용- 파드 토폴로지 분산 제약(Topology Spread Constraints): 파드가 노드, zone, region 등에 고르게 분산되도록 제약 가능
파드 스케줄링 동작 원리와 실전 명령어
- 스케줄러는 파드의 요구사항, 노드의 상태, 정책(어피니티, 테인트 등)을 종합적으로 고려해 파드를 노드에 할당한다.
- 노드 관리 명령어:
kubectl cordon <노드이름>: 노드에 신규 파드 스케줄링 금지kubectl uncordon <노드이름>: 노드에 파드 스케줄링 허용kubectl drain <노드이름>: 노드의 파드를 다른 노드로 이동(관리형 파드만, 데몬셋/스태틱 파드는 별도 옵션 필요)
- 빠른 YAML 생성:
kubectl run ... --dry-run=client -o yaml - 구조 확인:
kubectl explain pod.spec.affinity등
참고 자료
'CKA' 카테고리의 다른 글
| 데이터 저장 정리 (0) | 2025.07.07 |
|---|---|
| 인증과 권한 관리 정리 (0) | 2025.07.04 |
| 시크릿 정리 (0) | 2025.06.30 |
| 컨피그맵 정리 (5) | 2025.06.27 |
| 레이블과 애너테이션 정리 (0) | 2025.06.27 |