ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Default Pod Scheduler의 스케줄링 로직
    Kubernetes 2025. 3. 21. 01:35
    728x90

    Kubernetes의 기본 Pod 스케줄러(Default Scheduler)는 새로 생성된 Pod을 적절한 Node에 배치하는 역할을 합니다. 스케줄링 로직은 크게 Filter(필터링) → Score(점수 평가) → Bind(할당) 세 단계로 진행됩니다.

     

    1. 스케줄링 프로세스

    ① 후보 노드 필터링 (Predicates)

    스케줄러는 먼저 클러스터 내의 모든 노드 중에서 Pod을 실행할 수 없는 노드를 제외합니다. 이 과정에서 다음과 같은 조건이 적용됩니다.

    필터링 조건

    1. NodeSelector & NodeAffinity

    • nodeSelector, nodeAffinity 등의 조건이 맞지 않으면 제외
    nodeSelector:
      disktype: ssd

     

    2. 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)

    필터링을 통과한 노드들에 대해 각 노드에 점수를 매기고 가장 높은 점수를 가진 노드를 선택합니다.

    점수 평가 기준

    1. Least Requested Priority (리소스 사용률이 낮은 노드 선호, 최대 100점)
      • 사용률이 낮을수록 높은 점수를 부여하여 균형적 리소스 사용 유도
    2. Balanced Resource Allocation (CPU/메모리 사용 균형, 최대 100점)
      • CPU, Memory 사용률이 비슷한 노드를 선호
      • CPU 90% 사용 + Memory 10% 사용 같은 불균형 상태를 피하려 함
    3. Node Affinity Priority (선호하는 노드 점수 부여, 최대 100점)
      • preferredDuringSchedulingIgnoredDuringExecution을 기반으로 선호도를 부여
    4. Spread Priority (Pod 분산, 최대 100점)
      • 특정 노드에 집중되는 것을 방지하고 Pod을 분산 배치
    5. Inter-Pod Affinity & Anti-Affinity Priority
      • 특정 Pod과 가까이 있거나 멀리 있도록 점수를 부여
    6. 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: 1000000

     

    3. 결론

    Kubernetes 기본 스케줄러는 필터링(Predicates) → 점수 평가(Scoring) → 바인딩(Binding) 과정을 통해 최적의 노드를 선택합니다. 기본적으로 리소스 균형을 유지하면서도 Affinity, Taint/Toleration, Spread Priority 등 다양한 기준을 활용해 세밀한 컨트롤이 가능합니다.

    추가적으로 Scheduler Extender 또는 Custom Scheduler를 구현하여 워크로드에 맞는 맞춤형 스케줄링도 가능합니다

    728x90
Designed by Tistory.