목록으로

Programming Notes

Kubernetes v1.35: 워크로드 인식 스케줄링 소개

대규모 워크로드를 스케줄링하는 것은 단일 파드(Pod)를 스케줄링하는 것보다 훨씬 더 복잡하고 섬세한 작업입니다. 이는 종종 각 파드를 독립적으로 스케줄링하는 대신 모든 파드를 함께 고려해야 하기 때문입니다. 예를 들어, 머신러닝 배치 작업을 스케줄링할 때, 전체 프로세스를...

대규모 워크로드를 스케줄링하는 것은 단일 파드(Pod)를 스케줄링하는 것보다 훨씬 더 복잡하고 섬세한 작업입니다. 이는 종종 각 파드를 독립적으로 스케줄링하는 대신 모든 파드를 함께 고려해야 하기 때문입니다. 예를 들어, 머신러닝 배치 작업을 스케줄링할 때, 전체 프로세스를 가능한 한 효율적으로 만들기 위해 각 워커를 동일한 랙에 배치하는 등 전략적으로 배치해야 하는 경우가 많습니다. 동시에, 이러한 워크로드의 일부인 파드들은 스케줄링 관점에서 매우 자주 동일하며, 이는 이 프로세스가 근본적으로 어떻게 보여야 하는지를 바꿉니다.

워크로드 스케줄링을 효율적으로 수행하기 위해 많은 커스텀 스케줄러들이 있지만, 특히 AI 시대에 사용 사례가 증가하면서 워크로드 스케줄링이 Kubernetes 사용자들에게 얼마나 흔하고 중요한지를 고려할 때, 이제 kube-scheduler에 워크로드를 일급 시민으로 만들고 기본적으로 지원해야 할 때입니다.

워크로드 인식 스케줄링

최근 Kubernetes 1.35 릴리스는 워크로드 인식 스케줄링 개선 사항의 첫 번째 부분을 제공했습니다. 이는 워크로드의 스케줄링 및 관리를 개선하기 위한 광범위한 노력의 일환입니다. 이 노력은 여러 SIG(Special Interest Group)와 릴리스에 걸쳐 진행될 것이며, 선점(preemption) 및 오토스케일링을 포함하되 이에 국한되지 않는 Kubernetes 내 원활한 워크로드 스케줄링 및 관리를 달성하는 북극성 목표를 향해 시스템의 기능을 점진적으로 확장할 예정입니다.

Kubernetes v1.35는 워크로드의 원하는 형태와 스케줄링 관련 요구 사항을 설명하는 데 사용할 수 있는 Workload API를 도입합니다. 이 API에는 kube-scheduler에게 갱 파드(gang Pods)를 전체 또는 없음(all-or-nothing) 방식으로 스케줄링하도록 지시하는 *갱 스케줄링(gang scheduling)*의 초기 구현이 포함되어 있습니다. 마지막으로, 우리는 기회주의적 배치(opportunistic batching) 기능 덕분에 동일한 파드(일반적으로 갱을 구성하는)의 스케줄링을 가속화하여 프로세스 속도를 높였습니다.

Workload API

새로운 Workload API 리소스는 scheduling.k8s.io/v1alpha1 API 그룹의 일부입니다. 이 리소스는 다중 파드 애플리케이션의 스케줄링 요구 사항에 대한 구조화된, 기계가 읽을 수 있는 정의 역할을 합니다. Job과 같은 사용자 대면 워크로드는 무엇을 실행할지 정의하는 반면, Workload 리소스는 파드 그룹이 어떻게 스케줄링되어야 하는지, 그리고 수명 주기 전반에 걸쳐 배치(placement)가 어떻게 관리되어야 하는지를 결정합니다.

워크로드(Workload)를 통해 파드 그룹을 정의하고 스케줄링 정책을 적용할 수 있습니다. 다음은 갱 스케줄링 구성의 예시입니다. workers라는 podGroup을 정의하고 minCount가 4인 gang 정책을 적용할 수 있습니다.

apiVersion: scheduling.k8s.io/v1alpha1
kind: Workload
metadata:
  name: training-job-workload
  namespace: some-ns
spec:
  podGroups:
  - name: workers
    policy:
      gang:
        # The gang is schedulable only if 4 pods can run at once
        minCount: 4

파드를 생성할 때, 새로운 workloadRef 필드를 사용하여 이 워크로드에 연결합니다.

apiVersion: v1
kind: Pod
metadata:
  name: worker-0
  namespace: some-ns
spec:
  workloadRef:
    name: training-job-workload
    podGroup: workers
  ...

갱 스케줄링 작동 방식

gang 정책은 전체 또는 없음 배치를 강제합니다. 갱 스케줄링이 없으면, Job이 부분적으로 스케줄링되어 리소스를 소비하면서도 실행할 수 없어 리소스 낭비와 잠재적인 교착 상태로 이어질 수 있습니다.

갱 스케줄링된 파드 그룹의 일부인 파드를 생성하면, 스케줄러의 GangScheduling 플러그인이 각 파드 그룹(또는 레플리카 키)에 대해 수명 주기를 독립적으로 관리합니다.

  1. 파드를 생성하거나(또는 컨트롤러가 파드를 생성), 스케줄러는 다음 조건이 충족될 때까지 파드의 스케줄링을 차단합니다.
    • 참조된 Workload 객체가 생성됩니다.
    • 참조된 파드 그룹이 Workload에 존재합니다.
    • 해당 그룹의 대기 중인 파드 수가 minCount를 충족합니다.
  2. 충분한 파드가 도착하면 스케줄러는 파드를 배치하려고 시도합니다. 그러나 파드를 노드에 즉시 바인딩하는 대신, Permit 게이트에서 대기합니다.
  3. 스케줄러는 전체 그룹(최소 minCount 이상)에 대한 유효한 할당을 찾았는지 확인합니다.
    • 그룹을 위한 공간이 있다면 게이트가 열리고 모든 파드가 노드에 바인딩됩니다.
    • 시간 초과(5분으로 설정됨) 내에 그룹 파드의 일부만 성공적으로 스케줄링되었다면, 스케줄러는 그룹의 모든 파드를 거부합니다. 파드들은 큐로 돌아가고, 예약된 리소스는 다른 워크로드를 위해 해제됩니다.

이것이 첫 번째 구현이지만, Kubernetes 프로젝트는 향후 릴리스에서 갱 스케줄링 알고리즘을 개선하고 확장할 확고한 의도를 가지고 있음을 지적하고 싶습니다. 우리가 제공하고자 하는 이점에는 전체 갱에 대한 단일 사이클 스케줄링 단계, 워크로드 수준 선점(preemption) 등이 포함되며, 이는 북극성 목표를 향해 나아가는 것입니다.

기회주의적 배치

명시적인 갱 스케줄링 외에도, v1.35는 기회주의적 배치를 도입합니다. 이는 동일한 파드에 대한 스케줄링 대기 시간을 개선하는 베타 기능입니다.

갱 스케줄링과 달리, 이 기능은 Workload API나 사용자의 명시적인 옵트인(opt-in)을 필요로 하지 않습니다. 스케줄러 내에서 동일한 스케줄링 요구 사항(컨테이너 이미지, 리소스 요청, 어피니티 등)을 가진 파드를 식별하여 기회적으로 작동합니다. 스케줄러가 파드를 처리할 때, 큐의 후속 동일한 파드에 대해 실현 가능성 계산을 재사용하여 프로세스 속도를 크게 높일 수 있습니다.

대부분의 사용자는 파드가 다음 기준을 충족하는 경우 특별한 조치 없이 이 최적화의 혜택을 자동으로 받게 됩니다.

제약 사항

기회주의적 배치는 특정 조건에서 작동합니다. kube-scheduler가 배치를 찾는 데 사용하는 모든 필드는 파드 간에 동일해야 합니다. 또한, 일부 기능을 사용하면 정확성을 보장하기 위해 해당 파드에 대한 배치 메커니즘이 비활성화됩니다.

워크로드에 대한 배치가 암묵적으로 비활성화되지 않도록 kube-scheduler 구성을 검토해야 할 수도 있습니다.

제약 사항에 대한 자세한 내용은 문서를 참조하십시오.

북극성 비전

이 프로젝트는 워크로드 인식 스케줄링을 제공하려는 광범위한 야망을 가지고 있습니다. 이러한 새로운 API 및 스케줄링 개선 사항은 단지 첫 단계일 뿐입니다. 가까운 미래에 이 노력은 다음을 다룰 것입니다.

  • 워크로드 스케줄링 단계 도입
  • 다중 노드 DRA (Dynamic Resource Allocation) 및 토폴로지 인식 스케줄링 지원 개선
  • 워크로드 수준 선점(preemption)
  • 스케줄링과 오토스케일링 간의 통합 개선
  • 외부 워크로드 스케줄러와의 상호 작용 개선
  • 워크로드 수명 주기 전반에 걸친 배치 관리
  • 다중 워크로드 스케줄링 시뮬레이션

그리고 더 많은 것이 있습니다. 이러한 중점 영역의 우선순위 및 구현 순서는 변경될 수 있습니다. 추가 업데이트를 기대해 주십시오.

시작하기

워크로드 인식 스케줄링 개선 사항을 시도하려면:

  • Workload API: kube-apiserverkube-scheduler 모두에서 GenericWorkload 기능 게이트를 활성화하고, scheduling.k8s.io/v1alpha1 API 그룹이 활성화되어 있는지 확인하십시오.
  • 갱 스케줄링: kube-scheduler에서 GangScheduling 기능 게이트를 활성화하십시오(Workload API 활성화 필요).
  • 기회주의적 배치: 베타 기능이므로 v1.35에서 기본적으로 활성화되어 있습니다. 필요한 경우 kube-scheduler에서 OpportunisticBatching 기능 게이트를 사용하여 비활성화할 수 있습니다.

테스트 클러스터에서 워크로드 인식 스케줄링을 시도하고 경험을 공유하여 Kubernetes 스케줄링의 미래를 형성하는 데 도움을 주시기를 권장합니다. 다음 방법을 통해 피드백을 보낼 수 있습니다.

더 알아보기