갱 스케줄링
갱 스케줄링 (Gang Scheduling)
이 기능을 사용하려면 사용자(또는 클러스터 관리자)가 클러스터의 모든 관련 컴포넌트에서 GenericWorkload 기능 게이트(feature gate)를 활성화해야 해요.
자세한 내용은 기능 게이트 활성화/비활성화 (Enable Or Disable Feature Gates)를 참고하세요.
**갱 스케줄링(Gang scheduling)**은 Pod 그룹이 "전부 아니면 전무(all-or-nothing)" 기준으로 스케줄되도록 보장해요. 클러스터가 전체 그룹(또는 minCount로 지정한 정의된 최소 Pod 수)을 수용할 수 없으면 어떤 Pod도 노드에 바인딩되지 않습니다.
참고: 스케줄러는 초기 배치 중에는 설정된
minCount보다 적은 수의 Pod를 절대 수용하지 않지만, 실행 중인 Pod가 나중에 삭제되거나 축출되거나minCount요구 사항이 증가하면 실제 런타임 스케줄 Pod 수가 이 임계값 아래로 떨어질 수 있어요. 이런 일이 생기면 스케줄러는 이미 스케줄된 Pod와 새로 적합해진 스케줄되지 않은 Pod의 합계가minCount이상에 도달하거나 초과할 때만 추가 Pod를 배치합니다.
이 기능은 PodGroup API에 의존합니다. 클러스터에서 GenericWorkload 기능 게이트와 scheduling.k8s.io/v1beta1 API 그룹이 활성화되어 있는지 확인하세요.
출처: 문서
작동 방식 (How it works)
GangScheduling 플러그인이 활성화되면 스케줄러는 갱 스케줄링 정책을 가진 PodGroup에 속한 Pod의 수명 주기를 변경합니다. 이 과정은 각 PodGroup에 대해 다음 단계를 따릅니다.
- 스케줄러는 다음 조건이 충족될 때까지 Pod를 PreEnqueue 단계에 보관합니다: 참조된 PodGroup 객체가 존재한다. PodGroup을 위해 생성된 Pod 수(이미 스케줄된 것과 스케줄되지 않은 것 모두)가
minCount이상이다. 두 조건이 모두 충족될 때까지 PodGroup은 활성 스케줄링 큐에 들어가지 않습니다. - 쿼럼(quorum)이 충족되면 스케줄러는 그룹의 모든 스케줄되지 않은 Pod의 배치를 찾으려고 시도합니다. PodGroup 스케줄링 사이클을 활용해 단일한 원자적(atomic) 스케줄링 결정을 내려요. GangScheduling 플러그인은 사이클 동안 평가되는 각 Pod에 대해 호출되는
PlacementFeasible확장 지점을 구현합니다. 이는 성공적으로 배치된 Pod 수(이전 사이클에서 이미 스케줄된 것 포함)를minCount값과 비교해minCount제약이 충족되는지 판단하는 데 사용됩니다. - 스케줄러가 최소
minCount수의 Pod에 대해 유효한 배치를 찾으면, 성공적으로 배치된 Pod가 지정된 노드에 바인딩되도록 허용합니다.minCount요구 사항을 충족할 만큼 배치를 찾지 못하면 어떤 Pod도 스케줄되지 않습니다. 대신 스케줄 불가능 큐로 이동해 클러스터 리소스가 비워지기를 기다리며, 그동안 다른 워크로드는 스케줄될 수 있어요.
CompositePodGroups를 이용한 계층적 갱 스케줄링 (Hierarchical gang scheduling with CompositePodGroups)
이 기능을 사용하려면 클러스터의 모든 관련 컴포넌트에서 CompositePodGroup 기능 게이트를 활성화해야 해요.
자세한 내용은 기능 게이트 활성화/비활성화를 참고하세요.
CompositePodGroup 기능 게이트와 scheduling.k8s.io/v1alpha3 API 그룹이 활성화되면, 갱 스케줄링은 그 지원 범위를 CompositePodGroups로 확장합니다.
Pod들을 그룹화하는 PodGroup과 달리, CompositePodGroup은 하위 그룹들을 함께 그룹화해요 — PodGroup이든 다른 CompositePodGroup이든 말이죠. CompositePodGroup은 스케줄링 중 하위 그룹에 적용되는 스케줄링 정책을 지정합니다.
minGroupCount필드가 있는 gang 정책: 단일 단위로 원자적으로 함께 스케줄되어야 하는 하위 그룹(CompositePodGroup 또는 PodGroup 객체)의 최소 수를 지정해요.- 하위 그룹이 독립적으로 스케줄될 수 있음을 나타내는 basic 정책.
gang 정책은 여러 하위 그룹에 걸쳐 전부 아니면 전무 스케줄링을 요구하는 다중 컴포넌트 워크로드에 유용하며, 최소 수의 하위 그룹이 함께 스케줄되도록 보장합니다. 이런 요구 사항을 가진 워크로드의 예로 복제된 AI 학습(replicated AI training)이 있어요.
basic 정책은 각각 독립적인 갱으로 스케줄될 수 있는 여러 Pod 그룹으로 구성된 워크로드(예: AI 추론 워크로드)에 사용할 수 있어요.
계층적 쿼럼 (Hierarchical quorum)
GangScheduling 플러그인은 루트 CompositePodGroup이 **계층적 쿼럼(hierarchical quorum)**을 충족할 때까지 PreEnqueue 단계에서 활성 스케줄링 큐에 들어가는 것을 막아요. 이 쿼럼은 잎(leaf) PodGroup 객체에서 루트 CompositePodGroup까지 **상향식(bottom-up)**으로 평가됩니다.
- 잎 PodGroup은 PodGroup 객체가 존재하고 스케줄링 정책 기준을 충족할 잠재력이 있을 때에만 쿼럼을 충족합니다: gang 정책의 경우 구성 Pod 중 최소
minCount개가 생성됐을 때. basic 정책의 경우 구성 Pod 중 최소 하나가 생성됐을 때. - CompositePodGroup은 CompositePodGroup 객체가 존재하고 스케줄링 정책 기준을 충족할 잠재력이 있을 때에만 쿼럼을 충족합니다: gang 정책의 경우 직접 하위 그룹 중 최소
minGroupCount개가 쿼럼을 충족할 때. basic 정책의 경우 직접 하위 그룹 중 최소 하나가 쿼럼을 충족할 때. - 루트 CompositePodGroup이 쿼럼을 충족할 때에만 전체 계층적 쿼럼이 충족됩니다.
결국 루트 CompositePodGroup은 계층적 쿼럼을 충족하고, 하위 PodGroup 중 하나에 속한 대기 중인 Pod가 최소 하나 있을 때에만 활성 스케줄링 큐에 허용됩니다.
배치 적합성 (Placement feasibility)
GangScheduling 플러그인의 PlacementFeasible 메서드는 PodGroup과 CompositePodGroup 모두에 대한 평가를 지원합니다. 하위 평가를 시작하기 전과 CompositePodGroup의 각 하위 그룹을 평가한 후 스케줄링 사이클에 의해 호출됩니다.
성공적으로 스케줄된 하위 그룹의 수와 아직 스케줄링 사이클에서 평가되지 않은 하위 그룹의 수를 고려해, PlacementFeasible은 그룹의 정책 제약이 여전히 달성 가능한지 판단합니다. 이를 통해 기저 스케줄링 정책이 더 이상 충족될 수 없으면 스케줄링 사이클이 CompositePodGroup 평가를 일찍 중단할 수 있어요.
다음 단계 (What's next)
- PodGroup API와 그 수명 주기 알아보기
- CompositePodGroup API 읽어보기
- PodGroup 스케줄링 정책 읽어보기
- PodGroup 스케줄링 읽어보기