Priority Classes

Yu Sang Min·2025년 5월 28일

CKA

목록 보기
23/110
post-thumbnail

📌 Priority Classes

  • K8S는 서로 다른 우선순위를 가진 다양한 애플리케이션을 파드로 실행한다
  • 예를들면, control plane의 구성요소들은 항상 실행되어야 하며 DB나 Critical Apps 등 우선 순위가 높은 워크로드, jobs 등 낮은 우선순위의 워크로드가 있을 수 있다.
  • 때문에, 우선순위가 높은 워크로드 들이 낮은 우선 순위에 방해 받지 않고 항상 scheduling 가능한 방법이 필요하다
  • Priority Classes는 다양한 워크로드에 대한 우선순위를 정의하여 우선순위가 높은 워크로드가 항상 낮은 개체보다 높은 우선순위를 갖도록 한다.
  • 우선순위가 높은 pod를 스케줄링 할수 없는 경우 scheduler는 우선순위가 낮은 워크로드를 종료 하여 이를 실행하려고 시도한다.
  • 따라서 Priority Classes는 네임스페이스가 아닌 객체로, 특정 네임스페이스 내에서 생성되거나 연결되지 않는다.
  • 일단 생성되고 나면 네임스페이스의 모든 pod에서 구성할 수 있다.

⚖️ How to set

  • 다양한 숫자를 사용하여 우선순위를 정의
  • 최고: 10억
  • 최저: -20억 또는 그정도의 수치로 정의할 수있다.
  • 숫자가 클수록 우선순위를 갖는다.
  • control plane 구성 요소 자체와 같은 내부 중요 시스템 부분을 위한 별도의 범위 존재
  • 따라서 항상 가장 높은 우선순위를 가지며 20억까지 가질 수 있다.

⌨️ command

$ kubectl get priorityclass

📋 How to Create Priority Classes

# priority-class.yaml

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 100000000
description: “Priority class for mission critical pods”

# pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

priorityClassName: 
high-priority
  • 해당 파드가 생성되면 priority class에 할당된 이 우선순위를 갖는것으로 가정

❓만약 파드의 priority class 이름을 지정하지 않으면?

  • 기본적으로 우선순위 클래스 값은 0을 갖는다.
  • 그러나 이를 수정하려면 새 우선순위 클래스를 만들고 글로벌 기본 속성을 true로 할당
  • 따라서 이 필드는 선택 사항이지만, 해당 파드 구성 파일에 명시적으로 정의된 priorityClassName이 없는 경우 모든 파드의 기본 우선순위를 정의하는데 사용할 수 있다.
  • 따라서 단일 priorityClass로만 정의할 수 있다는 점도 유의
  • 왜냐하면 global default property는 여러 기본값을 가질 수 없다
  • 때문에 하나의 priority class에서만 정의 한다
  • 따라서 글로벌 기본속성이 true로 설정된 우선순위 클래스를 두 개 이상 가질 수 없다.

# priority-class.yaml

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 100000000
description: “Priority class for mission critical pods”
  globalDefault: true    // 이 구문 주목

✨ Effect of Pod Priority

  • 우선순위가 다른 두 워크로드 (여러 파드 인스턴스 묶음)가 있다고 가정
  • 우선순위는 각각 7(중요)과 5(덜중요)
  • 중요한 앱의 우선순위가 더 높으므로 7의 워크로드가 먼저 배치됨
  • 이후 아직 사용 가능한 리소스가 있는 경우 우선순위가 높은 앱이 배치된 후 다음 배치
  • 이 상태에서 우선순위가 6인 더 높은 워크로드가 배치되려고 하는데 클러스터에 남은 리소스가 없다고 가정
  • 새롭게 배치되는 앱에 할당된 priority class에 정의된 선점 정책에 의해 정의됨
  • preemptionPolicy: PreemptLowerPriority 필드가 정의되어 있다면 우선순위가 낮은 작업을 죽이고 그 자리를 대신할 수 있다.
  • 만약 죽이지 않고 리소스가 확보될 때 까지 기다리려면 이 선점 정책을 변경
    • preeptionPolicy: never
      👉 이 선점 정책을 정의 하려면 해당 priority classpod는 비선점, 즉 다른 파드를 죽일 수 없으며 스케줄링 큐에서 스케줄링 될때까지 대기
      ❌ 그러나 예약 대기 중인 다른 우선 순위가 낮은 pod보다 우선 순위가 자동으로 더 높아진다

💡 tips. 다음 명령을 사용하여 두 포드의 우선 순위 클래스를 비교할 수 있습니다

$ kubectl get pods -o custom-columns="NAME:.metadata.name,PRIORITY:.spec.priorityClassName"
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글