본문 바로가기
클라우드/쿠버네티스

🚀 내 파드는 소중하니까! 쿠버네티스 PriorityClass로 중요도 설정하기

by gasbugs 2025. 10. 4.

안녕하세요! 쿠버네티스 세상의 항해사 여러분! 👋 클러스터를 운영하다 보면 "이 파드만큼은 절대 죽으면 안 돼!" 또는 "자리가 없으면 다른 파드를 밀어내고서라도 실행되어야 해!"라고 생각되는 중요한 워크로드가 있죠. 예를 들어, 모니터링 시스템, 로깅 에이전트, 또는 핵심 API 서버 같은 파드들 말이에요.

 

오늘은 바로 이런 중요한 파드들을 지키는 방법, 쿠버네티스의 PriorityClass에 대해 자세히 알아보겠습니다. 내 소중한 파드의 우선순위를 어떻게 설정하고, 다른 파드보다 항상 먼저 자리를 차지하게 만들 수 있는지 함께 살펴볼까요? 🧐

 


🤔 PriorityClass가 왜 필요한가요?

쿠버네티스 스케줄러는 기본적으로 모든 파드를 평등하게 대합니다. 하지만 클러스터의 리소스(CPU, 메모리)가 부족해지면 어떤 일이 벌어질까요? 새로 생성된 파드는 자리가 날 때까지 Pending 상태로 무한정 기다리게 됩니다. 만약 이 파드가 아주 중요한 역할을 하는 파드라면 서비스 전체에 장애가 발생할 수도 있겠죠. 😱

또한, 클러스터에 자리가 부족할 때 어떤 파드를 먼저 제거(Evict)할지 결정해야 하는 상황이 올 수도 있습니다. 이때 중요도가 낮은 파드부터 제거하고, 중요한 파드는 최대한 보호해야 합니다.

PriorityClass는 바로 이런 상황을 위해 존재합니다. 파드에 **'우선순위'**라는 등급을 매겨서, 스케줄러와 노드(kubelet)가 어떤 파드를 더 중요하게 다뤄야 할지 알려주는 역할을 합니다.

  • 스케줄링 우선권 (Scheduling Priority): 리소스가 부족할 때, 우선순위가 높은 파드는 우선순위가 낮은 파드보다 먼저 스케줄링 대기열의 앞쪽에 배치됩니다.
  • 선점 (Preemption): 더 중요한 파드가 스케줄링될 공간이 없을 경우, 이미 실행 중인 덜 중요한 파드를 노드에서 쫓아내고 (Evict) 그 자리를 차지할 수 있습니다.

⚙️ PriorityClass 사용법: 3단계로 끝내기!

가장 높은 우선순위를 갖는 파드를 만드는 과정은 아주 간단합니다. 딱 3단계만 기억하세요!

 

1단계: PriorityClass 객체 만들기

가장 먼저, 어떤 우선순위 등급을 만들지 정의해야 합니다. value 필드에 높은 숫자를 넣을수록 우선순위가 높아집니다. 시스템에서 사용하는 가장 높은 우선순위가 보통 10억(1,000,000,000)이므로, 우리가 만드는 우선순위는 이보다 높게 설정하면 안됩니다. 여기서는 100만 점을 줘서 아주 높은 등급을 만들어 보겠습니다.

 

preemptionPolicy는 PreemptLowerPriority로 설정하여, 이 우선순위를 가진 파드가 자리가 없을 때 자기보다 낮은 우선순위의 파드를 밀어낼 수 있도록 허용합니다.

 

high-priority.yaml

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for critical pods only."
preemptionPolicy: PreemptLowerPriority
  • value: 우선순위 점수입니다. 숫자가 클수록 우선순위가 높습니다. (최대 1,000,000,000)
  • globalDefault: true로 설정하면, priorityClassName을 지정하지 않은 모든 파드가 이 우선순위를 갖게 됩니다. 보통은 false로 두고 명시적으로 지정하는 것이 안전합니다.
  • preemptionPolicy:
    • PreemptLowerPriority (기본값): 자신보다 낮은 우선순위의 파드를 선점할 수 있습니다.
    • Never: 다른 파드를 절대 선점하지 않습니다.

이제 이 YAML 파일을 클러스터에 적용합니다.

$ kubectl apply -f high-priority.yaml
priorityclass.scheduling.k8s.io/high-priority created

 

2단계: 파드에 PriorityClass 지정하기

이제 우리가 만든 high-priority 등급을 실제 파드에 적용해 보겠습니다. 파드 스펙(spec)에 priorityClassName 필드를 추가하고, 방금 만든 PriorityClass의 이름을 적어주기만 하면 됩니다.

 

high-priority-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-critical-app
spec:
  containers:
  - name: my-app-container
    image: nginx
  priorityClassName: high-priority

3단계: 파드 생성 및 확인하기

이제 이 파드를 생성해 봅시다.

$ kubectl apply -f high-priority-pod.yaml
pod/my-critical-app created

 

이제 이 파드는 high-priority 등급을 부여받았습니다. 만약 클러스터에 리소스가 부족하여 이 파드가 Pending 상태가 된다면, 쿠버네티스 스케줄러는 high-priority보다 우선순위가 낮은 다른 파드들을 노드에서 제거하여 공간을 확보하고 my-critical-app 파드를 실행시키려고 시도할 것입니다.


⚠️ 주의사항 및 팁

  • 선점은 공짜가 아니다!: 선점 기능은 매우 강력하지만, 실행 중인 파드를 종료시키는 비용이 발생합니다. 종료되는 파드는 정상적인 종료 절차(termination grace period)를 거치지만, 이로 인해 서비스에 일시적인 중단이 발생할 수 있습니다. 따라서 꼭 필요한 핵심 파드에만 높은 우선순위를 부여해야 합니다.
  • PodDisruptionBudget (PDB)와의 관계: 선점 과정에서 쿠버네티스는 PDB를 존중합니다. 즉, 어떤 파드를 쫓아내려고 할 때, 해당 파드가 속한 그룹의 PDB 정책에 위배된다면 선점에 실패할 수 있습니다. 중요한 파드 그룹에는 PDB를 설정하여 최소 가용성을 보장하는 것이 좋습니다.
  • 무분별한 사용은 금물: 모든 파드에 높은 우선순위를 부여하는 것은 아무 의미가 없습니다. 우선순위는 상대적인 개념이기 때문이죠. 정말로 중요한 워크로드를 식별하고, 계층적으로 우선순위를 설계하는 것이 중요합니다.

✨ 결론

PriorityClass는 복잡하고 바쁜 쿠버네티스 클러스터에서 질서를 유지하고, 중요한 애플리케이션의 안정성을 보장하는 핵심 기능입니다. 스케줄링 우선권과 선점(Preemption) 메커니즘을 통해, 리소스가 부족한 극한 상황에서도 핵심 서비스가 중단 없이 실행될 수 있도록 보장해 줍니다.

 

이제 여러분도 클러스터의 중요한 파드들을 식별하고, PriorityClass를 사용하여 든든한 보호막을 씌워주세요! 🛡️