PodGroup API
PodGroup API
PodGroup은 단일 단위로 함께 스케줄링되는 파드 그룹을 나타내는 런타임 객체예요. Workload API가 스케줄링 정책 템플릿을 정의하는 반면, PodGroup은 그 그룹의 특정 인스턴스에 대해 정책과 스케줄링 상태를 모두 운반하는 런타임 대응물이에요.
출처: 문서
본문
PodGroup이란 무엇인가?
PodGroup API 리소스는 scheduling.k8s.io/v1beta1 API 그룹의 일부이며, 이 API를 사용하려면 클러스터에 그 API 그룹과 GenericWorkload 기능 게이트가 둘 다 활성화되어 있어야 해요.
PodGroup은 자체 포함된 스케줄링 단위예요. 함께 스케줄링되어야 하는 파드 그룹을 정의하고, 배치를 지배하는 스케줄링 정책을 운반하며, 그 스케줄링 결정의 런타임 상태를 기록해요.
API 구조 (API structure)
PodGroup은 원하는 스케줄링 동작을 정의하는 spec과 현재 스케줄링 상태를 반영하는 status로 구성돼요.
스케줄링 정책
각 PodGroup은 spec.schedulingPolicy에 스케줄링 정책(basic 또는 gang)을 운반해요. 워크로드 컨트롤러가 PodGroup을 만들면 이 정책은 생성 시점에 Workload의 PodGroupTemplate에서 복사돼요. 독립형(standalone) PodGroup의 경우 정책을 직접 설정해요.
spec:
schedulingPolicy:
gang:
minCount: 4
템플릿 참조 (Template reference)
선택적 spec.podGroupTemplateRef는 PodGroup을 생성된 Workload의 PodGroupTemplate에 연결해요. 관찰성과 도구에 유용해요.
spec:
podGroupTemplateRef:
workload:
workloadName: training-policy
podGroupTemplateName: worker
우선순위와 중단 모드 (Priority and Disruption mode)
각 PodGroup은 자체 spec.priority, spec.preemptionPolicy, spec.disruptionMode를 정의할 수도 있어요. 우선순위와 선점 정책은 PriorityClass 리소스를 가리키는 spec.priorityClassName 필드로 설정해요.
이 필드들의 자세한 설명은 Pod Group 중단과 우선순위를 참고해요.
워크로드 컨트롤러가 PodGroup을 만들면 이 필드들은 생성 시점에 Workload의 PodGroupTemplate에서 복사돼요. 독립형 PodGroup의 경우 필드를 직접 설정해요.
spec:
disruptionMode:
all: {}
priorityClassName: high-priority
PodGroup에 DRA 디바이스 요청
동적 리소스 할당(DRA)을 통해 사용할 수 있는 디바이스는 PodGroup이 spec.resourceClaims 필드로 요청할 수 있어요.
apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: training-group
namespace: some-ns
spec:
...
resourceClaims:
- name: pg-claim
resourceClaimName: my-pg-claim
- name: pg-claim-template
resourceClaimTemplateName: my-pg-template
PodGroup과 연결된 ResourceClaim은 그 그룹에 속한 모든 파드가 공유할 수 있어요. 개별 파드 각각 대신 ResourceClaim의 status.reservedFor에 PodGroup에 대한 참조만 두면, 같은 PodGroup의 어떤 수의 파드든 하나의 ResourceClaim을 공유할 수 있어요. ResourceClaim은 각 PodGroup에 대해 ResourceClaimTemplate에서 생성될 수도 있어, 각 생성된 ResourceClaim에 할당된 디바이스를 각 PodGroup의 파드가 공유할 수 있게 해요.
자세한 내용과 더 완전한 예시는 DRA 문서를 참고해요.
상태 (Status)
스케줄러는 status.conditions를 업데이트해 그룹이 성공적으로 스케줄링되었는지 보고해요. 주요 조건은 PodGroupInitiallyScheduled이며, 필요한 모든 파드가 배치되면 True, 스케줄링이 실패하면 False예요.
조건과 이유의 전체 목록은 PodGroup 수명주기 페이지를 참고해요.
PodGroup 생성하기
PodGroup API 리소스는 scheduling.k8s.io/v1beta1 API 그룹의 일부예요. (그리고 이 API를 사용하려면 클러스터에 그 API 그룹과 GenericWorkload 기능 게이트가 둘 다 활성화되어 있어야 해요.)
다음 매니페스트는 최소 4개 파드가 동시에 스케줄링 가능해야 하는 gang 스케줄링 정책으로 PodGroup을 만들어요.
apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: training-worker-0
namespace: default
spec:
schedulingPolicy:
gang:
minCount: 4
클러스터의 PodGroup을 조사할 수 있어요.
kubectl get podgroups
스케줄링 조건을 포함한 전체 상태를 보려면:
kubectl describe podgroup training-worker-0
어떻게 맞물리는가
컨트롤러, Workload, PodGroup, Pod 사이의 관계는 다음 패턴을 따라요.
- 워크로드 컨트롤러가 스케줄링 정책을 가진 PodGroupTemplates를 정의하는 Workload를 만들어요.
- 각 런타임 인스턴스에 대해 컨트롤러가 Workload의 PodGroupTemplate 중 하나에서 PodGroup을 만들어요.
- 컨트롤러가
spec.schedulingGroup.podGroupName필드로 PodGroup을 참조하는 파드를 만들어요.
Job 컨트롤러는 현재 이 패턴을 따르는 유일한 내장 워크로드 컨트롤러예요. 커스텀 컨트롤러도 자기 워크로드 유형에 같은 흐름을 구현할 수 있어요.
apiVersion: scheduling.k8s.io/v1beta1
kind: Workload
metadata:
name: training-policy
spec:
podGroupTemplates:
- name: worker
schedulingPolicy:
gang:
minCount: 4
---
apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: training-worker-0
spec:
podGroupTemplateRef:
workload:
workloadName: training-policy
podGroupTemplateName: worker
schedulingPolicy:
gang:
minCount: 4
---
apiVersion: v1
kind: Pod
metadata:
name: worker-0
spec:
schedulingGroup:
podGroupName: training-worker-0
containers:
- name: ml-worker
image: training:v1
Workload는 수명이 긴 정책 정의 역할을 하고, PodGroup은 일시적인 인스턴스별 런타임 상태를 처리해요. 이 분리 덕분에 개별 PodGroup의 상태 업데이트가 공유 Workload 객체에서 경합하지 않아요.
부모 그룹 (Parent group)
CompositePodGroup 기능 게이트가 활성화되면, PodGroup은 PodGroup과 CompositePodGroup으로 구성된 다중 레벨 그룹 계층 구조에서 잎 노드 역할을 할 수 있어요. PodGroup은 spec.parentCompositePodGroupName 필드로 부모 그룹을 지정할 수 있어요. 워크로드를 그룹 계층 구조로 구성하면 다중 레벨 gang 스케줄링 요구 사항, 다중 레벨 토폴로지 제약, 워크로드의 일부에 걸친 중단 운명 공유(disruption fate-sharing)를 표현하는 데 사용할 수 있어요.
계층적 그룹 구조와 다중 레벨 gang 스케줄링에 대한 자세한 내용은 CompositePodGroup API 개요를 참고해요.
다음 단계
- PodGroup 수명주기 자세히 알아보기
- PodGroupTemplates를 제공하는 Workload API 읽기
- 파드가 scheduling group 필드를 통해 PodGroup을 참조하는 방법 보기
- gang 스케줄링 알고리즘 이해하기