Kubernetes v1.35 [alpha](disabled by default)표준 쿠버네티스 스케줄러는 파드를 순차적으로 평가한다. 머신러닝 학습 작업과 같은 여러 워크로드가 동시에 제출되면, 이러한 순차적 평가 방식은 리소스 교착 상태를 유발할 수 있다. 예를 들어, 서로 경쟁하는 두 워크로드가 각각 일부 파드만 스케줄링하여 클러스터 용량을 소진시키면서도, 정작 어느 워크로드도 완전히 시작하는 데 필요한 자원을 확보하지 못할 수 있다.
파드그룹 스케줄링 주기는 파드그룹을 단일 단위로 평가한다. 스케줄러는 그룹 내 모든 파드에 대한 배치를 동시에 찾으려고 시도한다. 그룹 전체의 요구 사항을 충족할 만큼 충분한 리소스를 찾지 못하면, 어떤 파드도 바인딩되지 않는다.
또한, 그룹을 하나의 통합된 개체로 다루는 방식은 다른 그룹 기반 스케줄링 기능 구현을 단순화하는 기반 아키텍처를 제공한다.
이 기능은 워크로드 API에 의존한다.
GenericWorkload
기능 게이트와 scheduling.k8s.io/v1alpha1
API 그룹이 클러스터에서 활성화되어 있는지 확인한다.
여러 파드를 그룹으로 묶어 스케줄링할 수 있도록, kube-scheduler는 파드그룹 스케줄링 주기를 사용한다.
파드를 개별적으로 처리하거나 WaitOnPermit 게이트에서 대기시키는 대신,
스케줄러는 특정 파드그룹에 속한 대기 중인 파드 전체를 한꺼번에 평가한다.
각 파드마다 별도의 스케줄링 주기를 실행하는 대신,
파드그룹 전체에 대한 적합성을 평가한 뒤 곧바로 바인딩 단계로 넘어간다.
스케줄러가 파드그룹에 속한 파드를 꺼내면, 해당 그룹에 속한 다른 모든 대기 중인 파드를 가져온다. 그런 다음 우선순위와 스케줄러가 각 파드를 최초로 인지한 시점을 기준으로 일관된 순서로 정렬하고, 다음과 같이 파드그룹 스케줄링 주기를 시작한다.
클러스터 상태 스냅샷 생성: 스케줄러가 파드그룹 평가를 시작하면, 해당 주기 전체 동안 유지되는 클러스터 상태의 단일 스냅샷을 생성한다. 이를 통해 그룹 전체에 대한 평가 일관성을 유지하고, 다른 이벤트와의 경합 상태를 방지한다.
실행 가능한 배치 찾기: 스케줄러는 파드그룹 스케줄링 알고리즘을 실행하여 그룹 내 파드들에 대한 유효한 노드 배치를 찾는다.
원자적(atomic) 결정: 알고리즘의 결과에 따라, 스케줄링 결정은 파드그룹 전체에 대해 원자적으로 적용된다.
성공: 스케줄러가 파드들에 대해 충분한 리소스와 유효한 배치를 찾으면
(예: 갱 스케줄링의 minCount 제약 조건을 충족하는 경우),
해당 파드들은 선택된 노드와 함께 곧바로 바인딩 주기로 진행한다.
스케줄링되지 못하고 남은 파드들은 이미 스케줄링된 파드들과 합류할 수 있도록
사용 가능한 리소스를 기다리며 스케줄링 큐로 돌아간다.
또한, 일부 파드가 이미 스케줄링된 이후에 새로운 파드가 파드그룹에 추가되면, 해당 주기는 기존 파드를 고려해 새 파드를 평가한다.
실패: 스케줄러가 파드그룹을 실행 가능하게 만들 만큼 충분한 리소스를 찾지 못하면
(예: minCount 제약 조건을 충족하지 못하는 경우), 해당 파드그룹 전체가 스케줄링할 수 없는 것으로 간주된다.
어떤 파드도 바인딩되지 않으며, 대신 모두 스케줄링 큐로 돌아간다.
표준 스케줄링 백오프 로직이 적용되어, 파드그룹을 나중에 다시 시도할 수 있다.
이러한 단일 주기 방식을 사용함으로써, 스케줄러는 비효율적인 병목 현상을 방지한다. 이 병목 현상에서는 일부만 스케줄링된 그룹이 나머지 파드가 들어맞기를 무한정 기다리는 동안 클러스터 용량을 계속 점유하게 된다.
기본 파드그룹 스케줄링 알고리즘은 기존의 파드 기반 스케줄링 알고리즘에 크게 의존한다. 이 알고리즘은 파드그룹 내 파드들을 순회하며 각 파드에 대해 다음을 수행한다.
표준 파드별 필터링 및 스코어링 단계를 사용하여 실행 가능한 노드를 찾는다.
PostFilter 익스텐션(extension) 포인트를 실행하여 선점을 시도한다.Permit 익스텐션 포인트를 사용하여, 스케줄링 가능한 파드들이 그룹의 스케줄링 기준
(예: 갱 스케줄링의 minCount)을 충족하는지 확인한다.
어떤 파드에 대해서든 Success 상태가 반환되면, 해당 파드그룹은 실행 가능한 것으로 간주된다.
알고리즘이 모든 파드를 처리하고도 Success 상태를 얻지 못하면, 해당 파드그룹은 스케줄링할 수 없는 것으로 간주된다.
Kubernetes v1.36 [alpha](disabled by default)배치 스케줄링 알고리즘은 파드그룹 스케줄링 알고리즘의 대안으로, 스케줄링 플러그인을 사용하여 대상 파드그룹에 대한 최적의 배치를 찾는다. 사용자는 플러그인을 사용하고 구성하여 이 알고리즘을 자신의 필요에 맞게 조정할 수 있다.
이 알고리즘은 주어진 파드그룹에 대해 세 가지 주요 단계로 진행된다.
예를 들어 파드그룹의 스케줄링 제약 조건(이는 파드그룹 오브젝트에서 정의할 수 있다)을 기반으로, 후보 배치(파드그룹 할당에 이론적으로 실행 가능한 노드의 부분집합)를 생성한다.
이 단계는 PlacementGeneratePlugin 익스텐션 포인트로 실행된다.
기본 파드그룹 스케줄링 알고리즘을 실행하여, 파드그룹에서 요구되는 수의 파드가 들어맞을 수 있는지 각 제안된 배치를 검증한다. 들어맞을 수 있다면, 해당 배치는 실행 가능한 것으로 표시된다.
파드그룹에 대한 최적의 도메인을 선택하기 위해 모든 실행 가능한 배치에 점수를 매긴다.
이 단계는 PlacementScorePlugin 익스텐션 포인트로 실행된다.
파드그룹 스케줄링 알고리즘은 특정 파드 정렬 방식에 의존하기 때문에, 그룹의 파드를 다른 순서로 처리했다면 발견할 수 있었던 유효한 배치를 찾지 못할 수 있다. 특히 다음과 같은 경우가 있다.
기본적인 동질적(homogeneous) 파드그룹(즉, 모든 파드가 동일한 스케줄링 요구 사항을 가지며 어피니티, 안티-어피니티, 토폴로지 분산 제약 조건과 같은 파드 간 의존성이 없는 그룹)의 경우, 유효한 배치가 존재한다면 알고리즘이 이를 찾아낼 것으로 예상된다.
이질적(heterogeneous) 파드그룹의 경우, 유효한 배치를 찾는 것이 보장되지 않는다.
파드 간 의존성이 있는 파드그룹의 경우, 유효한 배치를 찾는 것이 보장되지 않는다.
위 사항 외에도, 그룹 내 의존성이 관련된 경우 (예: 한 파드의 스케줄링 가능 여부가 파드 간 어피니티를 통해 다른 그룹 구성원에 의존하는 경우), 이 알고리즘은 고정된 처리 순서로 인해 클러스터 상태와 무관하게 배치를 찾지 못할 수 있다.
주기 전체에서 일관된 동작을 위해, 이 알고리즘은 하나의 파드그룹에 속한 모든 파드가
동일한 .spec.schedulerName을 공유할 것을 요구한다. 이 요구 사항은 주기가 시작되기 전에 검증되며,
제약 조건이 충족되지 않으면 해당 파드그룹은 거부된다.
파드그룹 스케줄링 주기가 완료되면, 스케줄러는 파드그룹의 status.conditions에 있는
컨디션을 업데이트한다.
PodGroupScheduled: 파드그룹이 성공적으로 스케줄링되었는지를 보고한다.DisruptionTarget: 선점과 같은 중단으로 인해
파드그룹이 곧 종료될 예정임을 나타낸다.PodGroupScheduled스케줄링 주기가 성공하면, 해당 컨디션은 이유 Scheduled와 함께 True로 설정된다.
gang 정책 파드그룹의 경우, 이는 최소 minCount개의 파드가 배치되었음을
의미한다.
스케줄링이 실패하면, 해당 컨디션은 다음 이유 중 하나와 함께
False로 설정된다.
Unschedulable — 리소스 제약 조건, 어피니티 또는 안티-어피니티 규칙,
또는 갱을 위한 용량 부족으로 인해 파드그룹을 배치할 수 없었다.SchedulerError — 내부 스케줄러 오류(예: nodeAffinity와 같은
스케줄링 제약 조건을 파싱하는 중 발생한 오류)로 인해 스케줄링이 실패했다.DisruptionTarget스케줄러가 우선순위가 더 높은 파드그룹 또는 파드를 위한 공간을 확보하기 위해
파드그룹을 선점하면, reason 필드를 PreemptionByScheduler로 설정하고 컨디션을 True로 설정한다.
다음 명령으로 컨디션을 확인할 수 있다.
kubectl get podgroup <name> -o jsonpath='{.status.conditions}'