Pod Priority, Preemption 구성하기

Hoju·2022년 8월 25일
0
post-custom-banner

Pod는 우선 순위를 가질 수 있습니다. 우선순위는 다른 파드에 대한 상대적인 파드의 중요성을 나타냅니다. 즉, 파드를 스케줄링할 수 없는 경우, 스케줄러는 우선순위가 낮은 파드를 먼저 빼내어 보류 중인 파드를 스케줄링할 수 있도록 합니다.


우선 순위(Priority)와 선점(Preemption)을 사용하는 방법

  1. 하나 이상의 PriorityClass를 추가해야합니다.
  2. 추가된 PriorityClass 중 하나에 priorityClassName이 설정된 파드를 생성해야합니다. 물론 파드를 직접 생성할 필요는 없습니다. 일반적으로 Deployment와 같은 컬렌션 Object의 Pod 템플릿에 priorityClassName을 추가합니다.

먼저 PriorityClass

프라이어리티클래스는 프라이어리티클래스 이름에서 우선순위의 정수 값으로의 매핑을 정의하는 네임스페이스가 아닌(non-namespaced) 오브젝트입니다. 오브젝트의 메타데이터의 name필드에 지정된다. 값은필수 value 필드에 지정되어 있습니다. 값이 클수록, 우선순위가 높습니다. 프라이어리티 클래스 Object의 이름은 유효한 DNS 서브 도메인 이름이어야하며, system- 접두사를 붙일 수 없습니다.

PriorityClass 두 개의 필드

  • globalDefault: 프라이어리티클래스의 값을 priorityClassName이 없는 파드에 사용해야 합니다. 시스템에서 globalDefault 가 True로 설정된 프라이어리티클래스는 하나만 존재할 수 있습니다.
  • description:필드는 임의의 문자열입니다. 이 필드는 이 프라이어리티클래스를 언제 사용해야 하는지를 클러스터 사용자에게 알려주기 위한 것 입니다.

PriorityClass Example

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "이 프라이어리티클래스는 XYZ 서비스 파드에만 사용해야 한다."
  • 이 기능없이 기존 클러스터를 업그레이드 하는 경우, 기존 파드의 우선순위는 사실상 0 입니다.
  • globalDefaulttrue 로 설정된 프라이어리티클래스를 추가해도 기존 파드의 우선순위는 변경되지 않습니다. 이러한 프라이어리티클래스의 값은 프라이어리티클래스를 추가한 후 생성된 파드에만 사용됩니다.

preemptionPolicy: Never를 가진 파드는 낮은 우선순위 파드의 스케줄링 대기열의 앞쪽에 배치되지만, 그 파드는 다른 파드를 축출할 수 없습니다. 스케줄링 대기 중인 비-선점 파드는 충분한 리소스가 확보되고 스케줄링될 수 있을 때까지 스케줄링 대기열에 대기합니다.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "이 프라이어리티클래스는 다른 파드를 축출하지 않는다."

파드 우선순위 실습

  1. 먼저 priortityClass를 생성합니다.
cat << EOF > priority.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should only be used for XYZ service pods."
EOF

kubectl apply -f priority.yaml
  1. 그런 다음 생성할 Pod에 priortityClass를 적용합니다. 아래 yaml file은 우선순위 어드미션 컨트롤러는 명세를 확인하고 파드의 우선순위를 1000000으로 해석합니다.
cat << EOF > pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  priorityClassName: high-priority
EOF

kubectl apply -f pod.yaml
  • kubectl describe pods nginx → 설정 확인
profile
Devops가 되고 싶은 청소년
post-custom-banner

0개의 댓글