Scheduling - PriorityClass

2025. 12. 29. 22:33·CKA

쿠버네티스 클러스터에는 우선순위가 다른 워크로드가 섞여 있습니다.

  • 컨트롤 플레인/시스템 컴포넌트(어떤 상황에서도 살아야 함)
  • DB 같은 핵심 서비스
  • 일반 비즈니스 앱
  • 배치/백그라운드 작업(상대적으로 낮은 우선순위)

문제는 간단합니다. 리소스가 부족할 때도 중요한 파드가 먼저 올라가야 합니다.
이때 쓰는 기능이 PriorityClass와 Preemption(선점) 입니다.


1) PriorityClass란?

PriorityClass는 파드에 “우선순위 점수(priority value)”를 부여하는 오브젝트입니다.

  • 숫자가 클수록 우선순위가 높음
  • 스케줄러는 우선순위가 높은 파드를 먼저 스케줄 큐에서 처리
  • 리소스가 부족하면, 설정에 따라 낮은 우선순위 파드를 종료(evict)해서 자리를 만들 수도 있음(선점)

중요: PriorityClass는 네임스페이스가 없는(cluster-scoped) 리소스입니다.
즉, 한 번 만들어두면 모든 네임스페이스의 파드에서 참조 가능합니다.


2) 우선순위 값 범위와 “시스템용” 클래스

강의에서 말한 핵심은 “일반 앱용 범위”와 “시스템 중요 컴포넌트용 범위”가 사실상 분리돼 있다는 점입니다.

  • 일반 워크로드는 특정 범위(예: 0을 중심으로 양/음수)에서 운영 정책으로 사용
  • 시스템 크리티컬 컴포넌트는 system-cluster-critical, system-node-critical 같은 기본 PriorityClass가 있고, 매우 높은 값(2,000,000,000 근처) 을 가집니다.

현재 클러스터에 있는 PriorityClass는 다음으로 확인합니다.

kubectl get priorityclass

 


3) PriorityClass 생성 방법

예시:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 700000
description: "Important workloads"
preemptionPolicy: PreemptLowerPriority
globalDefault: false

필드 의미:

  • value: 우선순위 점수(클수록 높음)
  • description: 설명(옵션)
  • preemptionPolicy: 선점 정책(옵션)
  • globalDefault: 기본 우선순위로 사용할지 여부(옵션)

4) 파드에 적용: priorityClassName

파드/디플로이먼트 템플릿에 priorityClassName만 지정하면 됩니다.

spec:
  priorityClassName: high-priority
  containers:
  - name: app
    image: nginx

priorityClassName을 안 쓰면?

  • 기본적으로 우선순위는 0으로 취급됩니다.

5) globalDefault: “기본 우선순위”를 바꾸고 싶다면

만약 “priorityClassName을 명시하지 않은 파드들도 기본 우선순위를 바꾸고 싶다”면,
PriorityClass에 globalDefault: true를 설정할 수 있습니다.

중요 규칙:

  • globalDefault: true는 클러스터에 딱 1개만 존재할 수 있습니다.
  • 두 개 이상이면 충돌/오류가 납니다.

6) 선점(Preemption): 리소스가 없을 때 무슨 일이 벌어지나?

강의의 시나리오를 현실적으로 정리하면:

  • 우선순위 7(중요 앱)과 5(낮은 작업)이 이미 스케줄되어 실행 중
  • 그 뒤 우선순위 6 파드가 새로 들어왔는데, 클러스터에 여유 리소스가 없음

이때 “낮은 우선순위 파드를 죽여서라도 자리를 만들 것인가?”는
해당 파드가 속한 PriorityClass의 preemptionPolicy 로 결정됩니다.

6-1) 기본 동작(대체로): 낮은 우선순위 선점 가능

  • preemptionPolicy를 설정하지 않으면, 기본적으로 “낮은 우선순위 파드를 선점할 수 있음” 쪽으로 동작하는 환경이 많습니다.
  • 즉, 낮은 우선순위 파드를 종료해서 리소스를 확보하고 새 파드를 스케줄합니다.

6-2) 절대 선점하지 않게 하려면

preemptionPolicy: Never
  • 이 경우 해당 우선순위 파드는 기존 파드를 죽이지 않고 리소스가 생길 때까지 대기합니다.
  • 다만 스케줄링 큐에서는 여전히 우선순위가 높기 때문에, “대기 중인 파드들 사이에서” 먼저 잡힐 가능성이 큽니다.

7) 실무에서 꼭 같이 기억할 점(중요)

  1. 우선순위가 높다고 해서 리소스가 마법처럼 생기진 않습니다.
    결국 requests/limits, 리소스 부족, 오토스케일 등과 함께 봐야 합니다.
  2. 선점은 “운영 영향”이 큽니다.
    낮은 우선순위 파드가 죽으면:
    • 작업이 중단될 수 있고
    • 재시작/재큐잉 정책에 따라 비용이 생깁니다.
  3. 시스템 클래스는 함부로 건드리지 않는 것이 보통입니다.
    system-node-critical, system-cluster-critical은 시스템 안정성에 직접 영향을 줍니다.

빠른 요약

  • PriorityClass는 클러스터 전역 리소스이며 파드에 우선순위를 부여
  • 우선순위가 높을수록 먼저 스케줄되고, 설정에 따라 낮은 우선순위 파드를 선점할 수 있음
  • priorityClassName을 안 쓰면 기본 0
  • globalDefault: true는 기본 우선순위를 바꾸지만 클러스터에 1개만 가능
  • 선점 여부는 preemptionPolicy(PreemptLowerPriority / Never)로 결정

 

 

Test Link: Practice Tests - Priority Classes

'CKA' 카테고리의 다른 글

Scheduling- Scheduler Profiles  (0) 2025.12.30
Scheduling - Multiple Schedulers(Custom Scheduler)  (0) 2025.12.29
Scheduling - Static Pod  (0) 2025.12.29
Scheduling- DaemonSet  (0) 2025.12.29
Scheduling - Resource Limit  (0) 2025.12.29
'CKA' 카테고리의 다른 글
  • Scheduling- Scheduler Profiles
  • Scheduling - Multiple Schedulers(Custom Scheduler)
  • Scheduling - Static Pod
  • Scheduling- DaemonSet
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (119)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      스레드
      조회 성능 최적화
      프록시 팩토리
      버퍼
      @discriminatorvalue
      김영한
      hibernate5module
      cglib
      @discriminatorcolumn
      typequery
      gesingleresult
      @args
      jpq
      JPQL
      Thread
      @within
      requset scope
      log trace
      락
      Target
      페치 조인
      자바
      WAS
      프록시
      reentarantlock
      양방향 맵핑
      고급
      단방향 맵핑
      jdk 동적 프록시
      빈 후처리기
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Scheduling - PriorityClass
    상단으로

    티스토리툴바