DevOps

Kubernetes - kube-scheduler

Vince_rf 2024. 10. 19. 15:05

Kubernetes의 kube-scheduler는 클러스터 내에서 생성된 Pod를 적절한 노드에 할당하는 역할을 담당하는 컴포넌트입니다. Kubernetes에서 새로운 Pod가 생성되면, 해당 Pod를 어디에 배치할지 결정하는 작업이 필요합니다. 이때 kube-scheduler가 클러스터 내의 리소스 상태, 노드의 특성, 정책 등을 고려하여 Pod를 적합한 노드에 스케줄링합니다.

1. kube-scheduler의 역할

kube-scheduler의 주요 역할은 클러스터 내의 가용 리소스(노드, CPU, 메모리 등)와 요청된 리소스(Pod의 요구사항)를 바탕으로 Pod가 어느 노드에서 실행될지 결정하는 것입니다. 구체적인 역할은 다음과 같습니다:

  • Pod와 노드 간의 매칭: kube-scheduler는 새로 생성된 Pod를 클러스터 내의 어느 노드에 배치할지 결정합니다.
  • 리소스 최적화: 클러스터 내 가용 리소스를 효율적으로 사용하도록 노드에 Pod를 분산 배치합니다.
  • 제약 조건 충족: Pod의 요구사항(예: CPU, 메모리, 스토리지 등)과 각 노드의 리소스 상태를 고려하여, 적절한 노드를 선택합니다.
  • 정책 기반 배치: Affinity/Anti-Affinity, Taints/Tolerations, 우선 순위(priority) 등 사용자가 설정한 다양한 스케줄링 정책을 고려하여 Pod를 스케줄링합니다.

2. kube-scheduler의 동작 원리

kube-scheduler는 Pod가 생성된 후부터 해당 Pod가 특정 노드에 배치될 때까지 다음의 과정으로 동작합니다:

Step 1. Pod 대기열에 추가

Pod가 생성되면 Kubernetes API 서버에 의해 그 정보를 etcd에 기록하고, 스케줄링 대기 상태가 됩니다. 이때, Pod에는 아직 어떤 노드에 배치될지 정보가 없는 상태입니다. 이 상태의 Pod는 kube-scheduler에 의해 스케줄링되어야 합니다.

Step 2. 적합한 노드 선택을 위한 후보 노드 필터링

kube-scheduler는 모든 노드 중에서 Pod가 배치될 수 있는 후보 노드를 찾는 작업을 먼저 수행합니다. 이 과정에서 Kubernetes는 제약 조건 기반 필터링을 사용하여 후보 노드를 추립니다. 이 단계에서 고려되는 주요 조건들은 다음과 같습니다:

  • 노드가 적합한 리소스를 제공하는가: Pod가 요청한 CPU, 메모리, 스토리지 등을 제공할 수 있는지 확인합니다.
  • Taints와 Tolerations: 노드에 특정한 태그(taints)가 있을 경우, 해당 노드에 배치될 수 있는 Pod가 이를 허용하는지 확인합니다. Toleration이 없는 Pod는 taint된 노드에 배치되지 않습니다.
  • PodAffinity/Anti-Affinity: Pod가 다른 특정 Pod와 함께 배치되어야 하는지(Affinity) 또는 분리되어야 하는지(Anti-Affinity)를 고려합니다.
  • Node Affinity: Pod가 특정한 특성을 가진 노드에서만 실행되기를 원하는 경우, 해당 특성(Node labels)에 따라 필터링합니다.
  • Pod에 대한 Resource Quota 확인: 특정 네임스페이스에 할당된 리소스 쿼터를 초과하지 않는지 확인합니다.

Step 3. 후보 노드의 점수 계산

필터링 과정을 통해 후보 노드가 결정되면, 이제 각 후보 노드를 평가하여 가장 적합한 노드를 선택하는 **점수화 과정(Scoring)**이 진행됩니다. 이 단계에서는 다음과 같은 항목들이 고려됩니다:

  • 리소스 사용량 균형: CPU 및 메모리 사용량을 최대한 균형 있게 분배합니다. 예를 들어, 특정 노드에 과도한 부하가 걸리지 않도록 리소스를 분산하여 사용합니다.
  • Pod 스프레딩(Spreading): 같은 네임스페이스 또는 동일한 서비스에 속한 Pod가 특정 노드에 과도하게 집중되지 않도록 배치하는 정책입니다.
  • 노드의 현재 리소스 사용률: 각 노드가 가지고 있는 가용 리소스를 기준으로, Pod가 배치되었을 때의 예상 리소스 사용률을 고려합니다. 가용 리소스가 충분한 노드가 더 높은 점수를 받을 수 있습니다.
  • Preferred Node Affinity: 노드의 특성이 Pod가 선호하는 특성과 얼마나 일치하는지를 기준으로 점수를 부여합니다.

각 노드는 여러 기준에 따라 가중치가 부여된 점수를 받게 되고, kube-scheduler는 이 점수를 기준으로 가장 높은 점수를 받은 노드를 선택합니다.

Step 4. 노드에 Pod 배치

점수화가 완료되고 가장 적합한 노드가 결정되면, kube-scheduler는 API 서버에 해당 정보를 전달하여 해당 노드에 Pod를 배치합니다. 이 작업을 통해 스케줄링이 완료되며, Pod는 실제로 해당 노드에서 실행되기 위한 준비를 시작합니다.

Step 5. Pod 실행

Pod가 특정 노드에 배치되면, 해당 노드의 kubelet이 이를 감지하고 해당 Pod의 컨테이너를 실행시킵니다. kubelet은 Pod의 라이프사이클을 관리하며, 상태를 지속적으로 모니터링합니다.


3. 스케줄링 정책 및 기능

kube-scheduler는 다양한 스케줄링 정책을 사용하여 Pod를 더욱 세밀하게 관리합니다. 이러한 정책은 클러스터 리소스를 효율적으로 사용하고, 사용자의 배치 요구 사항을 만족시키는 데 도움이 됩니다.

1. Taints & Tolerations

  • Taints: 노드에 taint가 설정되어 있으면, 기본적으로 해당 노드에 Pod가 배치되지 않도록 설정됩니다.
  • Tolerations: Pod에 toleration이 설정되면, 특정 taint가 있는 노드에 Pod가 배치될 수 있습니다.
    • 예를 들어, NoSchedule taint가 설정된 노드는 해당 taint에 대한 toleration이 없는 Pod는 배치되지 않습니다.

2. Pod Affinity/Anti-Affinity

  • Pod Affinity: Pod가 특정 노드에 있는 다른 Pod와 함께 배치되어야 하는 경우입니다. 예를 들어, 서로 상호작용이 많은 두 Pod가 동일한 노드에 배치되면 네트워크 성능이 개선될 수 있습니다.
  • Pod Anti-Affinity: Pod가 특정 Pod와는 분리되어 다른 노드에 배치되도록 설정할 수 있습니다. 이는 장애 발생 시 서비스의 가용성을 높이기 위한 전략으로 사용됩니다.

3. Node Affinity

Pod가 특정 특성을 가진 노드에만 배치되기를 원할 때 사용할 수 있습니다. 예를 들어, 특정 노드에만 GPU가 있을 때, 해당 노드에 GPU 리소스를 요구하는 Pod만 배치하도록 설정할 수 있습니다.

4. Priority & Preemption

  • Priority: Kubernetes에서는 Pod의 우선 순위를 설정할 수 있습니다. 우선 순위가 높은 Pod는 리소스가 부족할 때 우선적으로 배치됩니다.
  • Preemption: 리소스가 부족한 상황에서, 우선 순위가 높은 Pod가 배치될 수 있도록, 우선 순위가 낮은 Pod를 강제로 종료하고 리소스를 확보할 수 있습니다.

4. 스케줄링 오류 처리

  • 스케줄링이 실패하는 경우(즉, 적합한 노드를 찾을 수 없는 경우), kube-scheduler는 일정 시간 동안 해당 Pod를 재시도하며, 일정 시간이 지나도 배치되지 않으면 오류 상태로 처리됩니다.
  • 오류의 원인은 대개 클러스터 내 리소스 부족, 요구사항과 일치하는 노드 부재, 노드의 리소스 제약 조건 미충족 등입니다. 이런 경우 사용자는 Pod 스펙을 수정하거나 클러스터 리소스를 확장해야 합니다.

요약

  • **kube-scheduler**는 Kubernetes에서 새로운 Pod를 적절한 노드에 배치하는 컴포넌트로, Pod의 리소스 요구사항과 노드의 상태를 기반으로 최적의 배치를 결정합니다.
  • 필터링점수화 과정을 거쳐 후보 노드를 선택하고, 가장 적합한 노드에 Pod를 스케줄링합니다.
  • 제약 조건(예: Taints/Tolerations, Affinity, 리소스 요구사항)을 고려하여 최적의 노드를 선택하며, 우선 순위정책 기반 스케줄링을 통해 복잡한 배치 요구사항을 충족시킵니다.

'DevOps' 카테고리의 다른 글

Kubernetes - kube-proxy  (0) 2024.10.19
Kubernetes - kubelet  (1) 2024.10.19
Kubernetes - kube-controller-manager  (1) 2024.10.19
Kubernetes - kube-apiserver  (0) 2024.10.19
Kubernets - ETCD  (0) 2024.10.19