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/
'Kubernetes > Scheduler' 카테고리의 다른 글
Kubernetes Scheduler (Affinity) (0) | 2020.10.11 |
---|---|
Kubernetes Scheduler (Taint & Toleration) (0) | 2020.10.11 |
Kubernetes Scheduler (nodeSelector) (0) | 2020.10.11 |
Kubernetes Scheduler (Pod를 원하는 Worker Node에 배포하기) (0) | 2020.10.11 |