파드 스케줄링 준비 상태
파드 스케줄링 준비 상태 (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또는fieldExpressions에NodeSelectorRequirements를 추가하는 것만 허용되고, 기존matchExpressions와fieldExpressions에 대한 변경은 허용되지 않아요. 이는.requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms의 항(terms)은 OR로 결합되는 반면,nodeSelectorTerms[].matchExpressions와nodeSelectorTerms[].fieldExpressions의 표현식은 AND로 결합되기 때문이에요..preferredDuringSchedulingIgnoredDuringExecution에 대해서는 모든 업데이트가 허용돼요. preferred 항은 권위적(authoritative)이지 않기 때문에, 정책 컨트롤러가 그 항을 검증하지 않기 때문이에요.
더 알아보기 (Learn more)
- 자세한 내용은 PodSchedulingReadiness KEP를 읽어 보세요.
- Pod 스케줄링 준비 KEP