파드가 점유하는 자원(CPU, memory)이 노드의 한계까지 다다르게 되면 노드 안정화를 위해 파드를 하나씩 삭제하게 된다. 이때, 기본적으로 쿠버네티스가 QoS 클래스 를 기준으로 파드를 정리하게 된다. 하지만 QoS 보다 우선순위 높은 것이 있는데, 바로 PriorityClass 이다. 즉, PriorityClass 를 (높게)지정하면 QoS 클래스가 낮더라도 노드에 더 오래 남아있을 수 있는 것이다.
1. PriorityClass 생성
아래와 같은 매니페스트로 PriorityClass 를 생성한다. PC(PriorityClass)는 namespaced: false 인 리소스이다.
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
preemptionPolicy: Never # 기본값은 preemptLowerPriority
globalDefault: false # 기본값은 false
description: "This priority class will not cause other pods to be preempted."
value 로 지정하는 숫자값이 클 수록 선점(preemption)하게 된다. 사용자가 정의할 수 있는 value 의 범위는 -2147483648 ~ 1000000000 이다. preemptionPolicy 와 globalDefault 항목에 올 수 있는 값은 다음과 같다.
| 항목 | 설명 | 값 | 의미 |
| preemptionPolicy | 선점 정책 | preemptLowerPriority | 더 낮은 우선순위 파드를 밀어내고 강제로 선점함. (기본값) |
| Never | 이미 더 낮은 우선순위 파드가 Running 중이더라도 선점하지 않음. 대기열 queue 내에서만 우선순위를 가짐. | ||
| globalDefault | Pod 에 priorityClassName 을 지정하지 않았을 때 기본 PC 로 사용할지 여부. | true | 클러스터에 Pod 생성시 spec.priorityClassName 를 지정하지 않았을 때 기본으로 이 PC가 적용된다. 클러스터 내에서 단 한개의 PC만 true의 값을 가질 수 있다. |
| false | 기본 PC 로 사용되지 않는다(기본값) |
주의할점은 PC 는 파드가 생성될 때를 기준으로 파드에 적용된다는 점이다. 즉, 중간에 PC를 삭제하거나 새로운 PC를 globalDefault: true 로 만들어도 기존에 동작중인 파드는 영향을 받지 않는다.
2. 파드에서 사용
아래와 같이 spec.priorityClassName 에 지정한다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
priorityClassName: high-priority
3. 불변 속성
PC 는 선점 우선순위 값인 value 를 지정하기 위해 사용하는 오브젝트인데, 이 value 항목은 수정 불가능한(immutable) 값이다. 변경하려면 오브젝트를 삭제 후 재생성하여야 한다.
4. 시스템 정의 PriorityClass
아래와 같은 커맨드로 PC 를 조회해보면, 이미 생성된 2개의 PC 가 존재함을 알 수 있다.
$ kubectl get pc
NAME VALUE GLOBAL-DEFAULT AGE PREEMPTIONPOLICY
system-cluster-critical 2000000000 false 38d PreemptLowerPriority
system-node-critical 2000001000 false 38d PreemptLowerPriority
value 값이 사용자 정의 가능 범위인 1000000000 을 넘는것을 알 수 있는데, 클러스터와 노드의 핵심 컴포넌트들의 우선순위를 높이기 위해 존재하는 PC 이다.
system-cluster-critical 은 nginx, calico-cni, coredns 같은 파드를 유지시켜주며,
system-node-critical 은 kube-apiserver, kube-scheduler, kube-controller-manager 같은 파드를 유지시켜준다.
Pod Priority and Preemption
FEATURE STATE: Kubernetes v1.14 [stable] Pods can have priority. Priority indicates the importance of a Pod relative to other Pods. If a Pod cannot be scheduled, the scheduler tries to preempt (evict) lower priority Pods to make scheduling of the pending P
kubernetes.io
'Kubernetes' 카테고리의 다른 글
| [KUBERNETES] Longhorn 으로 Block Storage 서버 구성하기 (0) | 2026.08.06 |
|---|---|
| [KUBERNETES] ingress nginx 타임존 변경하기 (0) | 2026.08.01 |
| [KUBERNETES] nginx ingress log 포멧 변경하기 (0) | 2026.08.01 |
| [KUBERNETES] ingress-nginx-controller 의 로드밸런싱 정책을 ewma 로 변경하기 (0) | 2026.08.01 |
| [KUBERNETES] Ingress 에서 base path 를 기준으로 연결 Service 구분하기 (0) | 2026.08.01 |