PodGroup 교란 및 우선순위
PodGroup 교란 및 우선순위 (Disruption and Priority)
PodGroup은 교란 모드(disruption mode)를 선언할 수 있어요. 이 모드는 스케줄러가 실행 중인 PodGroup을 어떻게 교란할 수 있는지, 예를 들어 더 높은 우선순위의 PodGroup을 수용하는 방법을 결정합니다. PodGroup은 또한 우선순위를 가지는데, 이는 워크로드 인지 선점 이벤트 동안 그룹의 개별 파드의 우선순위를 재정의합니다.
출처: 문서
본문
교란 모드 유형
v1.36에서 PodGroup의 priority 또는 disruptionMode 필드는 워크로드 인지 선점에서만 존중돼요. 파드 스케줄링 단계 동안 스케줄러는 PodGroup의 priority 또는 disruptionMode 필드를 고려하지 않습니다. 이 제한은 v1.37부터 더 이상 적용되지 않습니다.
API는 Single과 All 두 가지 교란 모드를 지원해요. 기본값은 Single입니다.
Single
Single 모드는 스케줄러가 그룹의 모든 파드를 별개의 엔티티로 취급하게 지시해, PodGroup에서 단일 파드의 독립적인 교란을 허용해요.
All
All 모드는 교란에 대한 "전부 또는 전무(all-or-nothing)" 의미를 강조해요. PodGroup의 모든 파드가 함께 교란되어야 한다고 스케줄러에 지시합니다.
CompositePodGroup
CompositePodGroup도 명세에서 disruptionMode를 선언할 수 있는데, 이는 선점 이벤트 동안 스케줄러가 복합 그룹 안의 자식 그룹을 어떻게 교란하는지 제어합니다.
API는 CompositePodGroup에 대해 두 가지 교란 모드를 지원해요:
Single: 선점 중CompositePodGroup안의 개별 자식 그룹이 독립적으로 교란되게 허용한다.All:CompositePodGroup계층 전체에 걸쳐 전부 또는 전무 교란 의미를 강제한다. 이CompositePodGroup아래 계층에 포함된 어떤 파드든 선점되어야 하면, 전체 계층의 모든 파드가 선점되어야 한다.
지정하지 않으면 모드는 Single로 기본 설정됩니다.
v1.37에서 그룹은 교란 모드를 All로 설정하고 Single 모드로 설정된 자식 그룹을 가질 수 있어요. 이 경우 최상위 All 모드가 하위 Single 모드를 재정의합니다.
이 구성은 의미가 명확하지 않아 권장되지 않아요.
파드 그룹 우선순위
PodGroup은 단일 파드와 동일한 PriorityClass 개념을 사용해요. 하나 이상의 PriorityClass를 만든 뒤, 명세에서 그 PriorityClass 이름 중 하나를 지정하는 PodGroup을 만들 수 있습니다. 우선순위 어드미션 컨트롤러는 priorityClassName 필드를 사용해 우선순위의 정수 값을 채웁니다. 우선순위 클래스를 찾을 수 없으면 PodGroup이 거부돼요. PodGroup에 priorityClassName이 설정되지 않으면 쿠버네티스는 기본값(globalDefault가 true로 설정된 PriorityClass)을 찾습니다. globalDefault가 true로 설정된 PriorityClass가 없으면 priorityClassName이 없는 PodGroup은 우선순위가 0입니다.
PodGroup의 우선순위는 워크로드 인지 선점 이벤트 동안 그룹의 모든 파드에 대한 권위 있는 우선순위예요. 이 값은 스케줄링 큐에서 PodGroup의 순서에도 사용됩니다. 이 PodGroup을 구성하는 개별 파드의 우선순위가 PodGroup 우선순위와 다르면, PodGroup은 all pods in a single pod group should have the same priority as the pod group 오류로 스케줄되지 않을 것입니다.
PodGroupPreemptionPolicy 피처 게이트가 활성화되면 PodGroup에는 preemptionPolicy 필드도 있습니다. 이 필드도 PriorityClass에서 가져옵니다. 이는 그룹의 모든 파드에 대한 권위 있는 필드이며, PodGroup이 자신을 위한 자리를 마련하기 위해 더 낮은 우선순위의 파드와 파드 그룹을 선점할 수 있는지 결정합니다. 피처 게이트가 활성화되면 PodGroup의 모든 파드는 PodGroup과 같은 preemptionPolicy를 가져야 합니다. 그렇지 않으면 PodGroup은 all pods in a single pod group should have the same preemption policy as the pod group's preemption policy 오류로 스케줄되지 않습니다. PodGroup에 preemptionPolicy: Never가 있으면 워크로드 인지 선점을 수행하지 않습니다. 플래그가 비활성화되면 PodGroup을 구성하는 모든 파드는 같은 preemptionPolicy를 가져야 합니다. 그렇지 않으면 PodGroup은 all pods in a single pod group should have the same preemption policy 오류로 스케줄되지 않습니다.
다음 YAML은 정수 우선순위 값 1000000에 매핑되는 high-priority PriorityClass를 사용하는 PodGroup 구성의 예시예요. 우선순위 어드미션 컨트롤러가 스펙을 확인하고 PodGroup의 우선순위를 1000000으로 해석합니다.
apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
namespace: ns-1
name: job-1
spec:
priorityClassName: high-priority
CompositePodGroup 우선순위
CompositePodGroup API도 priorityClassName과 priority 필드를 가지며, 그 해석은 PodGroup과 같은 방식으로 우선순위 어드미션 컨트롤러를 통해 수행됩니다.
루트 CompositePodGroup의 우선순위는 워크로드 인지 선점 이벤트 동안 그 계층의 모든 자식 그룹과 파드에 대한 권위 있는 우선순위로 작동해요. 단일 그룹 계층 내의 모든 파드는 정확히 같은 우선순위를 공유해야 하며, 루트 CompositePodGroup의 우선순위와 같아야 합니다.
우선순위 값은 스케줄링 활성 큐에서 루트 CompositePodGroup의 순서에도 사용됩니다.
v1.37에서 스케줄러는 루트 CompositePodGroup의 우선순위와 같은 우선순위 값을 가졌는지 루트가 아닌 그룹을 검증하지 않아요.
CompositePodGroup의 PreemptionPolicy
CompositePodGroup API도 preemptionPolicy 필드를 가지며, 그 해석은 PodGroup API와 정확히 같은 방식으로 수행됩니다.
루트 CompositePodGroup의 preemptionPolicy 값은 필요할 때 스케줄링 중 파드를 수용하기 위해 워크로드 인지 선점을 호출할 수 있는지 결정합니다:
PreemptLowerPriority정책은 더 낮은 우선순위의 희생자를 선점하게 허용한다.Never정책은 그 루트CompositePodGroup에 대해 워크로드 인지 선점을 비활성화한다.
단일 그룹 계층 내의 모든 파드는 정확히 같은 선점 정책을 공유해야 하며, 루트 CompositePodGroup의 선점 정책과 같아야 합니다.
플래그가 비활성화되면 루트 CompositePodGroup은 그룹 계층에 속한 파드 중 하나가 preemptionPolicy를 Never로 설정하지 않는 한 선점을 수행할 수 있습니다.
v1.37에서 피처 게이트가 활성화되면 스케줄러는 루트 CompositePodGroup의 선점 정책과 같은 선점 정책을 가졌는지 루트가 아닌 그룹을 검증하지 않아요.
더 알아보기 (Learn more)
- Workload-Aware Preemption 알고리즘 읽어보기.
- Workload API 알아보기.
- 교란 모드 빌딩 블록을 포함한 스케줄링 빌딩 블록과 workloadbuilder 라이브러리 알아보기.