쿠버네티스 클러스터에는 우선순위가 다른 워크로드가 섞여 있습니다.
- 컨트롤 플레인/시스템 컴포넌트(어떤 상황에서도 살아야 함)
- 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) 실무에서 꼭 같이 기억할 점(중요)
- 우선순위가 높다고 해서 리소스가 마법처럼 생기진 않습니다.
결국 requests/limits, 리소스 부족, 오토스케일 등과 함께 봐야 합니다. - 선점은 “운영 영향”이 큽니다.
낮은 우선순위 파드가 죽으면:- 작업이 중단될 수 있고
- 재시작/재큐잉 정책에 따라 비용이 생깁니다.
- 시스템 클래스는 함부로 건드리지 않는 것이 보통입니다.
system-node-critical,system-cluster-critical은 시스템 안정성에 직접 영향을 줍니다.
빠른 요약
- PriorityClass는 클러스터 전역 리소스이며 파드에 우선순위를 부여
- 우선순위가 높을수록 먼저 스케줄되고, 설정에 따라 낮은 우선순위 파드를 선점할 수 있음
priorityClassName을 안 쓰면 기본 0globalDefault: 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 |