본문으로 건너뛰기

Priority Classes


Priority Classes

개념

  • 워크로드가 모두 같은 우선순위를 갖는 것이 아니다, 예를들어, 1순위는 kube-apiserver, kube-scheduler, etcd, kubelet 등의 쿠버네티스 컴포넌트들, 2순위는 데이터 베이스, 3순위는 중요한 애플리케이션, 4순위는 기타 Jobs가 있을 수 있다. 이럴 때 사용하는 것이 Priority Class이다.
  • 즉, 고우선순위 Pod가 항상 스케줄링되는 것을 보장하기 위해 사용하는 기능이다.

특징

  • PriorityClass는 특정 네임스페이스에 종속되는 객체가 아니다.
  • PriorityClass의 값은 숫자(정수)로 지정된다.
    • 숫자가 클수록 우선순위가 높다.
    • 범위: -21억(-2147483648) ~ 10억
    • Control Plane에 있는 Kubernetes 중요 컴포넌트들은 10억 ~ 21억(+2147483647)의 별도의 높은 우선순위 범위를 사용한다.

Yaml

PriorityClass

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
preemptionPolicy: PreemptLowerPriority
value: 1000
description: "High priority application"
globalDefault: true
  • apiVersion: scheduling.k8s.io/v1
  • kind: PriorityClass
  • metadata
  • preemptionPolicy: PreemptLowerPriority(기본) / Never
    • PreemptLowerPriority: 리소스가 부족할 경우, 새로운 우선순위가 높은 Pod가 기존의 낮은 우선순위의 Pod를 종료(evict) 시키고 자리를 차지한다.
    • Never: 우선순위가 높은 Pod가 실행되어야하더라도 기존의 Pod를 죽이지 않고, 스케줄링 큐에서 기다린다. (단 스케줄링 큐에서는 우선권을 가진다)
  • value: 여기에 우선순위를 정수로 지정한다.
  • globalDefault: true/false
    • Pod에서 priorityClassName이 지정되지 않은 모든 Pod의 우선순위는 globalDefaulttruePriorityClass의 우선순위를 따른다.
    • globalDefaulttruePriorityClass는 오직 한개만 존재할 수 있다.
    • globalDefaulttruePriorityClass가 존재하지 않으면서, PodpriorityClassName도 지정되지 않는다면, Pod의 우선순위 value는 0으로 지정된다.

Pod

apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
priorityClassName: high-priority
  • spec
    • priorityClassName: 여기에 지정학고자하는 PriorityClassname을 지정한다.
      • 만약 지정하지 않는다면, globalDefaulttruePriorityClass를 따르며, 해당 PriorityClass가 존재하지 않는다면, 우선순위의 value가 0으로 지정된다.

레퍼런스