파드가 점유하는 자원(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 같은 파드를 유지시켜준다.

 

참고: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#non-preempting-priority-class

 

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

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,