이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

30. kubernetes PriorityClass ( Priority & Preemption )

이쿠우우 2020. 10. 11. 11:21
반응형

 

 

kubernetes Priority & Preemptption

 

 

Worker Node에 리소스가 충분하지 않거나 

배포하려는 Pod의 Port를 이미 실행 중인 다른 Pod에서 사용 중인 상황 등

다양한 경우로 인해서 

새로운 Pod를 Kubernetes Cluster에 배포하지 못하는 상황이 발생할 수 있음.

근데 만약 새로운 Pod가 매우 중요한 역할을 수행하는 Pod라면 

이러한 제약인 있는 상황이여도 꼭 배포 되어야하는데

이런 상황을 해결하기 위해 사용할 수 있는것이 바로 Kubernetes PriorityClass.

 

PriorityClass를 사용하면 Pod에 우선순위를 설정할 수 있음.

새로 배포되어야 하는 Pod의 우선 순위가 높은데

리소스 부족 등 다양한 이슈로 배포가 안된다면

해당 Pod 보다 낮은 우선순위를 가지고 있는 Pod를 Preemption하여

우선 순위가 낮은 Pod를 종료시키고 

우선 순위가 높은 새로운 Pod가 배포되어 Running됨.

 

 

Pod Priority 적용 시 주의사항

 

kubernetes Cluster에 악의적인 사용자 접근해서 공격할 수 있는 방법 중 하나로는 

리소스를 매우 많이 사용하는 Pod를 생성하는데

이 악의적인 역할을 수행하는 Pod의 우선순위를 매우 높게 설정해서

기존의 정상적인 Pod를 모두 정지 시키는 공격을 할 수가 있음.

이러한 상황을 방지하기 위해

kubernetes 관리자는 ResourceQuota와 LimitRage를 사용해서

사전에 미리 운영에 필요한 리소스 양을 지정해놓아야함.

 

 

ResourceQuota

namespace 별로 사용할 수 있는 리소스 범위를 설정함.

[ 예시 ]

CPU = 500m ~700m

memory = 1GB ~ 2GB

pod =최대 10개 생성가능

service = 최대 5개 생성가능

로 설정

apiVersion: v1

kind: ResourceQuota

metadata:

  name: iksoon-resource-quota

  namespace: iksoon-ns

spec:

  hard:

    requests.cpu: 500m

    limits.cpu: 700m

    requests.memory: 1Gi

    limits.memory: 2Gi

    pods: 10

    service: 5

 

 

LimitRange

Container 별로 사용할 수 있는 리소스 범위를 설정함.

Container 설정 시 해당 LimitRange를 적용하면 LimitRange 정책에 따라 

Container가 생성됨

 

[ 예시 ]

apiVersion: v1

kind: LimitRange

metadata:

  name: iksoon-limit-range

spec:

  limits:

  - default: # Container에 limit을 지정하지 않았을 경우 디폴트로 지정되는 limit

      cpu: 600m

      memory: 1Gi

    min:  # Container에 limit을 설정한 경우, 지정할 수 있는 최소 크기

      cpu: 100m

      memory: 500mib

    max:  #  Container에 limit을 설정한 경우, 지정할 수 있는 최대 크기

      cpu: 700m

      memory: 2Gi    

 

 

 

 


 

 

 

 

Pod Priority 적용 방법

 

먼저 PriorityClass를 생성.

그 다음 Pod spec: 에 priorityClassName 설정 추가.

 

 

PriorityClass 생성

 

[ 예제 PriorityClass.yaml  ]

apiVersion: scheduling.k8s.io/v1

kind: PriorityClass

metadata:

  name: high-priority

value: 1000000

globalDefault: false

description: "해당 PriorityClass를 어떤 Pod에 적용해야하는지 설명."

 

 

PriorityClass 특징

- PriorityClass는 namespace로 구분되어지지 않음.

- values 설정 값이 높을 수록, 높은 우선 순위를 가지게 됨.

- values는1,000,000,000 이하로 설정 할 수 있음.

- 굉장히 중요한 역할을 수행하는 Pod는 우선순위가 밀려 선점당해서 삭제되면 안되니 

   values 값을 높게 설정해야함

globalDefault 설정이 true면 해당 PriorityClass 설정이 Pod의 Default Priority 값이 됨.

- 그래서 globalDefault 설정이 true인 PriorityClass는 Kubernetes Cluster에 하나만 존재할 수 있음.

- Pod의 priorityClassName 설정 용도로 PriorityClass를 생성하기 위해서는

   globalDefault 설정이 false가 되야함. 

- name 설정 시 규칙은 DNS subdomain name 규칙과 동일함.

 

[참고 : DNS subdomain name 규칙]

- 63자 이하로 생성해야함.

- 소문자와 '-'로만 생성할 수 있음.

- 시작과 끝은 반드시 알파벳 or 숫자이여야함.

 

Non-preemption PriorityClass

 

[ 예제 PriorityClass.yaml  ]

apiVersion: scheduling.k8s.io/v1

kind: PriorityClass

metadata:

  name: high-priority-nopreempting

value: 1000000

preemptionPolicy: Never

globalDefault: false

description: "해당 PriorityClass를 어떤 Pod에 적용해야하는지 설명."

Cluster에 리소스가 부족해서 Pod가 생성 안되는 상황이면 

일반적인 우선순위가 낮은 Pod는 삭제되고 

우선 순위가 높은 Pod가 생성되지만

Pod가 priorityClassName로 

preemptionPolicy: Never설정이 되어있는 PriorityClass를 설정하게 되면

해당 Pod는 preemption 되지 않아서 삭제되지 않음.

우선순위가 낮은 Pod가 Preemption되지 않으니

새로운 Pod는 충분한 리소스가 확보될 때까지 대기하게됨.

 

 

Default PriorityClass

Kuberentes Cluster에는 Default로 

system-cluster-critical 과 system-node-critical

2개의 PriorityClass가 존재하고 있음

이 설정은 일반적으로 중요한 Pod가 항상 먼저 scheduling 되야할 때 사용됨.

 

 

 

Pod에 PriorityClass 적용

 

Pod의 spec에 priorityClassName을 설정하고 

상위에서 생성한 priorityClass 의 Name을 넣어주면

해당 Pod에 Priority가 적용됨.

 

[ 예제 pod_priority.yaml  ]

apiVersion: v1

kind: Pod

metadata:

  name: iksoon-pod

  labels:

    app: iksoon-test

spec:

  containers:

  - name: nginx

    image: nginx

  priorityClassName: high-priority

 

 

물론 deployment에도 사용할 수 있음

 

 

priorityClassName이 설정되지 않는 Pod

default로 priorityClassName 설정되지 않는 Pod 의 우선 순위는 '0' 임.

즉 우선 순위가 가장 낮음.

만약 globalDefault가 true인 PriorityClass가 존재한다면

해당 PriorityClass에 설정된 value 값이 default가 됨

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

참고

PriorityClass

https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass

 

ResourceQuota와 LimitRage

https://kubernetes.io/ko/docs/concepts/policy/resource-quotas/

 

 

 

 

 

 

 

 

 

 

반응형