Kubernetes의 Pod 우선순위와 선점

Kubernetes의 스케줄링, 선점 및 퇴출

Pod 우선순위와 선점

Pod는 우선순위를 가질 수 있습니다. 우선순위는 다른 Pod들과 비교했을 때 해당 Pod의 중요도를 나타냅니다. Pod가 스케줄링될 수 없는 경우, 스케줄러는 대기 중인 Pod의 스케줄링을 가능하게 하기 위해 더 낮은 우선순위의 Pod들을 선점(퇴출)하려고 시도합니다.

우선순위와 선점 사용 방법 우선순위와 선점을 사용하려면:

  1. 하나 이상의 PriorityClass를 추가합니다.

  2. Pod를 생성할 때 priorityClassName을 추가된 PriorityClass 중 하나로 설정합니다. 물론 Pod를 직접 생성할 필요는 없습니다. 일반적으로 Deployment와 같은 컬렉션 객체의 Pod 템플릿에 priorityClassName을 추가합니다.

PriorityClass는 네임스페이스가 없는 객체로, 우선순위 클래스 이름을 우선순위의 정수 값에 매핑합니다. 이름은 PriorityClass 객체의 메타데이터의 name 필드에 지정됩니다. 값은 필수 value 필드에 지정됩니다. 값이 높을수록 우선순위가 높습니다. PriorityClass 객체의 이름은 유효한 DNS 서브도메인 이름이어야 하며, system-으로 시작할 수 없습니다.

PriorityClass 객체는 10억 이하의 32비트 정수 값을 가질 수 있습니다. 이는 PriorityClass 객체의 값 범위가 -2147483648부터 1000000000까지(포함)임을 의미합니다. 더 큰 숫자는 중요한 시스템 Pod를 나타내는 내장 PriorityClass를 위해 예약되어 있습니다. 클러스터 관리자는 원하는 각 매핑에 대해 하나의 PriorityClass 객체를 생성해야 합니다.

PriorityClass에는 globalDefault 필드와 description 필드도 있습니다. globalDefault 필드는 선택 사항이며 boolean 값입니다. 이 필드가 true로 설정된 PriorityClass가 있는 경우, priorityClassName이 없는 새로 생성되는 Pod에 이 PriorityClass가 적용됩니다. 클러스터에는 globalDefault가 true로 설정된 PriorityClass가 하나만 있어야 합니다. globalDefault가 설정된 PriorityClass가 없는 경우, priorityClassName이 없는 Pod의 우선순위는 0입니다. description 필드는 선택 사항이며, 관리자가 이 클래스를 언제 사용해야 하는지에 대한 임의의 문자열을 포함할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: important
  name: important
  namespace: lion
spec:
  priorityClassName: level3
  containers:
    - image: nginx:1.21.6-alpine
      name: important
      resources:
        requests:
          memory: 1Gi
  dnsPolicy: ClusterFirst
  restartPolicy: Always