-
Kubernetes Default Pod Scheduler의 스케줄링 로직Kubernetes 2025. 3. 21. 01:35728x90
Kubernetes의 기본 Pod 스케줄러(Default Scheduler)는 새로 생성된 Pod을 적절한 Node에 배치하는 역할을 합니다. 스케줄링 로직은 크게 Filter(필터링) → Score(점수 평가) → Bind(할당) 세 단계로 진행됩니다.
1. 스케줄링 프로세스
① 후보 노드 필터링 (Predicates)
스케줄러는 먼저 클러스터 내의 모든 노드 중에서 Pod을 실행할 수 없는 노드를 제외합니다. 이 과정에서 다음과 같은 조건이 적용됩니다.
필터링 조건
1. NodeSelector & NodeAffinity
- nodeSelector, nodeAffinity 등의 조건이 맞지 않으면 제외
nodeSelector: disktype: ssd2. Taints & Tolerations
- taint가 적용된 노드에는 toleration이 없는 Pod을 스케줄링하지 않음
tolerations: - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule"3. Resource Requirements
- requests.cpu, requests.memory 등을 고려하여 해당 리소스를 수용할 수 없는 노드는 제외
requests: cpu: "500m" memory: "256Mi"4. Node Conditions
- 노드 상태가 Ready가 아니거나 NetworkUnavailable 상태이면 제외
5. Node Ports & Volume Constraints
- hostPort를 사용할 경우, 해당 포트가 이미 사용 중인 노드는 제외
- 특정 Persistent Volume을 사용하는 경우, 해당 볼륨을 지원하지 않는 노드는 제외
② 후보 노드 점수 평가 (Scoring)
필터링을 통과한 노드들에 대해 각 노드에 점수를 매기고 가장 높은 점수를 가진 노드를 선택합니다.
점수 평가 기준
- Least Requested Priority (리소스 사용률이 낮은 노드 선호, 최대 100점)
- 사용률이 낮을수록 높은 점수를 부여하여 균형적 리소스 사용 유도
- Balanced Resource Allocation (CPU/메모리 사용 균형, 최대 100점)
- CPU, Memory 사용률이 비슷한 노드를 선호
- CPU 90% 사용 + Memory 10% 사용 같은 불균형 상태를 피하려 함
- Node Affinity Priority (선호하는 노드 점수 부여, 최대 100점)
- preferredDuringSchedulingIgnoredDuringExecution을 기반으로 선호도를 부여
- Spread Priority (Pod 분산, 최대 100점)
- 특정 노드에 집중되는 것을 방지하고 Pod을 분산 배치
- Inter-Pod Affinity & Anti-Affinity Priority
- 특정 Pod과 가까이 있거나 멀리 있도록 점수를 부여
- Taint Toleration Priority
- toleration을 가지고 있는 Pod에게 적절한 taint를 가진 노드를 선택
③ Pod → Node 할당 (Binding)
- 가장 높은 점수를 받은 노드가 최종 선택되며, 스케줄러가 API 서버에 해당 Pod의 Node 바인딩 정보를 업데이트하여 배정 완료
- Bind 후, Kubelet이 해당 노드에서 Pod를 실행하도록 지시
2. Pod 스케줄링 최적화 방법
Kubernetes의 기본 스케줄러는 다양한 정책을 통해 최적의 노드를 선택하지만, 특정 요구사항이 있을 경우 이를 튜닝할 수 있습니다.
① Node Affinity 사용
특정 노드에 Pod을 배치하고 싶다면 nodeAffinity 설정:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "disktype" operator: In values: - "ssd"② Pod Affinity & Anti-Affinity 설정
특정 Pod을 같은 노드에 배치하거나 반대로 배치하지 않도록 설정 가능:
affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: labelSelector: matchLabels: app: frontend topologyKey: "kubernetes.io/hostname"③ Taints & Tolerations 조정
- GPU 전용 노드 또는 특정 워크로드를 위한 노드를 만들 때 유용:
tolerations: - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule"④ PriorityClass 활용
- 중요한 Pod이 먼저 스케줄링되도록 우선순위를 지정:
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 10000003. 결론
Kubernetes 기본 스케줄러는 필터링(Predicates) → 점수 평가(Scoring) → 바인딩(Binding) 과정을 통해 최적의 노드를 선택합니다. 기본적으로 리소스 균형을 유지하면서도 Affinity, Taint/Toleration, Spread Priority 등 다양한 기준을 활용해 세밀한 컨트롤이 가능합니다.
추가적으로 Scheduler Extender 또는 Custom Scheduler를 구현하여 워크로드에 맞는 맞춤형 스케줄링도 가능합니다
728x90'Kubernetes' 카테고리의 다른 글
Kubernetes Operator를 작성할 때 피해야 할 Anti-patterns (0) 2025.03.22 Custom Pod Scheduling (0) 2025.03.21 ServiceEntry는 네임스페이스마다 설정이 필요한가? (0) 2025.03.13 Istio Egress Gateway에서 TLS 요청이 해석되는 방식 (0) 2025.03.13 Egress Gateway에서 VirtualService 설정이 필요한가? (0) 2025.03.12