파드 스케줄링 준비 상태

파드 스케줄링 준비 상태 (Pod Scheduling Readiness)

파드는 일단 생성되면 스케줄링 준비가 된 것으로 간주됐어요. 쿠버네티스 스케줄러는 보류 중인 모든 파드를 배치할 노드를 찾기 위해 노력을 다해요. 하지만 실제 상황에서는 일부 파드가 '필수 리소스 누락(miss-essential-resources)' 상태로 오랫동안 머물 수 있어요. 이런 파드들은 실제로 스케줄러(그리고 Cluster AutoScaler 같은 하류 통합자)를 불필요하게 흔들어 놓아요(churn).

파드의 .spec.schedulingGates를 지정/제거함으로써, 파드가 언제 스케줄링 대상으로 간주될 준비가 되는지 제어할 수 있어요.

출처: 문서

본문

파드 schedulingGates 구성하기

schedulingGates 필드는 문자열 목록을 담고 있으며, 각 문자열 리터럴은 파드가 스케줄 가능하다고 간주되기 전에 충족해야 하는 기준으로 여겨져요. 이 필드는 파드가 생성될 때만 초기화할 수 있어요(클라이언트에 의해서든, 어드미션 중에 변경되어서든). 생성 후에는 각 schedulingGate를 임의의 순서로 제거할 수 있지만, 새 스케줄링 게이트를 추가하는 것은 허용되지 않아요.

그림. 파드 SchedulingGates

사용 예시 (Usage example)

파드를 스케줄링 준비 안 됨으로 표시하려면, 다음과 같이 하나 이상의 스케줄링 게이트와 함께 생성할 수 있어요.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  schedulingGates:
  - name: example.com/foo
  - name: example.com/bar
  containers:
  - name: pause
    image: registry.k8s.io/pause:3.6

파드 생성 후에는 다음으로 상태를 확인할 수 있어요.

kubectl get pod test-pod

출력은 SchedulingGated 상태임을 보여 줘요.

NAME       READY   STATUS            RESTARTS   AGE
test-pod   0/1     SchedulingGated   0          7s

schedulingGates 필드를 확인할 수도 있어요.

kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'

출력은 다음과 같아요.

[{"name":"example.com/foo"},{"name":"example.com/bar"}]

이 파드가 스케줄링 준비가 되었음을 스케줄러에 알리려면, 수정된 매니페스트를 다시 적용해 schedulingGates를 완전히 제거할 수 있어요.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: pause
    image: registry.k8s.io/pause:3.6

schedulingGates가 비워졌는지 확인할 수 있어요.

kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'

출력은 비어 있을 것으로 예상돼요. 그리고 최신 상태는 다음으로 확인할 수 있어요.

kubectl get pod test-pod -o wide

test-pod가 CPU/메모리 리소스를 요청하지 않기 때문에, 이 파드의 상태가 이전의 SchedulingGated에서 Running으로 전환될 것으로 예상돼요.

NAME       READY   STATUS    RESTARTS   AGE   IP         NODE
test-pod   1/1     Running   0          15s   10.0.0.4   node-2

관측성 (Observability)

scheduler_pending_pods 메트릭에는 새 라벨 "gated"가 추가되어, 파드가 스케줄링을 시도했지만 불가능하다고 판단된 것인지, 아니면 스케줄링 준비가 안 된 것으로 명시적으로 표시된 것인지 구분해요. scheduler_pending_pods{queue="gated"}를 사용해 메트릭 결과를 확인할 수 있어요.

변경 가능한 파드 스케줄링 지시문 (Mutable Pod scheduling directives)

특정 제약 조건 하에서 스케줄링 게이트가 있는 동안 파드의 스케줄링 지시문을 변경할 수 있어요. 개략적으로 말하면 파드의 스케줄링 지시문은 강화(tighten)만 가능해요. 다시 말해, 업데이트된 지시문은 파드가 이전에 일치했던 노드의 부분 집합에만 스케줄링될 수 있게 해요. 더 구체적으로, 파드의 스케줄링 지시문을 업데이트하는 규칙은 다음과 같아요.

  • .spec.nodeSelector에 대해서는 추가만 허용돼요. 없으면 설정할 수 있게 허용돼요.
  • spec.affinity.nodeAffinity에 대해서는, nil이면 무엇이든 설정할 수 있어요.
  • NodeSelectorTerms가 비어 있었다면 설정할 수 있어요. 비어 있지 않다면 matchExpressions 또는 fieldExpressionsNodeSelectorRequirements를 추가하는 것만 허용되고, 기존 matchExpressionsfieldExpressions에 대한 변경은 허용되지 않아요. 이는 .requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms의 항(terms)은 OR로 결합되는 반면, nodeSelectorTerms[].matchExpressionsnodeSelectorTerms[].fieldExpressions의 표현식은 AND로 결합되기 때문이에요.
  • .preferredDuringSchedulingIgnoredDuringExecution에 대해서는 모든 업데이트가 허용돼요. preferred 항은 권위적(authoritative)이지 않기 때문에, 정책 컨트롤러가 그 항을 검증하지 않기 때문이에요.

더 알아보기 (Learn more)