본문으로 건너뛰기

오버 프로비저닝 설정

오버 프로비저닝을 효과적으로 구현하려면 애플리케이션에 적합한 PriorityClass 리소스를 생성하는 것이 모범 사례로 간주됩니다. globalDefault: true 필드를 사용하여 전역 기본 우선순위 클래스를 생성하는 것부터 시작하겠습니다. 이 기본 PriorityClassPriorityClassName을 지정하지 않은 Pod와 배포에 할당됩니다.

~/environment/eks-workshop/modules/autoscaling/compute/overprovisioning/setup/priorityclass-default.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: default
value: 0
globalDefault: true
description: "Default Priority class."
A

값은 필수 value 필드에 지정됩니다. 값이 높을수록 우선순위가 높습니다.

B

globalDefault 필드는 이 PriorityClass의 값이 priorityClassName이 없는 Pod에 사용되어야 함을 나타냅니다.

다음으로, 오버 프로비저닝에 사용되는 pause Pod를 위해 우선순위 값이 -1PriorityClass를 생성하겠습니다.

~/environment/eks-workshop/modules/autoscaling/compute/overprovisioning/setup/priorityclass-pause.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: pause-pods
value: -1
globalDefault: false
description: "Priority class used by pause-pods for overprovisioning."
A

"-1"의 우선순위 값은 빈 "pause" 컨테이너가 플레이스홀더 역할을 할 수 있도록 합니다. 실제 워크로드가 스케줄링되면 빈 플레이스홀더 컨테이너가 축출되어 애플리케이션 Pod를 즉시 프로비저닝할 수 있습니다.

Pause Pod는 환경에 필요한 오버 프로비저닝 양에 따라 사용 가능한 노드가 충분히 있도록 하는 데 중요한 역할을 합니다. Cluster Autoscaler는 ASG에 지정된 이 최대값을 초과하여 노드 수를 늘리지 않으므로 EKS 노드 그룹의 ASG에서 --max-size 파라미터를 염두에 두는 것이 중요합니다.

~/environment/eks-workshop/modules/autoscaling/compute/overprovisioning/setup/deployment-pause.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pause-pods
namespace: other
spec:
replicas: 2
selector:
matchLabels:
run: pause-pods
template:
metadata:
labels:
run: pause-pods
spec:
priorityClassName: pause-pods
containers:
- name: reserve-resources
image: registry.k8s.io/pause
resources:
requests:
memory: "6.5Gi"
A

pause Pod의 복제본 2개를 배포합니다

B

이전에 생성한 우선순위 클래스를 사용합니다

이러한 Pod는 각각 6.5Gi의 메모리를 요청하므로 거의 전체 m5.large 인스턴스를 소비하여 항상 두 개의 "예비" 워커 노드를 사용할 수 있게 됩니다.

이러한 업데이트를 클러스터에 적용해 보겠습니다:

~$kubectl apply -k ~/environment/eks-workshop/modules/autoscaling/compute/overprovisioning/setup
priorityclass.scheduling.k8s.io/default created
priorityclass.scheduling.k8s.io/pause-pods created
deployment.apps/pause-pods created
~$kubectl rollout status -n other deployment/pause-pods --timeout 300s

이 프로세스가 완료되면 pause Pod가 실행됩니다:

~$kubectl get pods -n other
NAME                          READY   STATUS    RESTARTS   AGE
pause-pods-7f7669b6d7-v27sl   1/1     Running   0          5m6s
pause-pods-7f7669b6d7-v7hqv   1/1     Running   0          5m6s

이제 Cluster Autoscaler에 의해 추가 노드가 프로비저닝된 것을 관찰할 수 있습니다:

~$kubectl get nodes -l workshop-default=yes
NAME                                         STATUS   ROLES    AGE     VERSION
ip-10-42-10-159.us-west-2.compute.internal   Ready    <none>   3d      v1.33-eks-036c24b
ip-10-42-10-111.us-west-2.compute.internal   Ready    <none>   33s     v1.33-eks-036c24b
ip-10-42-10-133.us-west-2.compute.internal   Ready    <none>   33s     v1.33-eks-036c24b
ip-10-42-11-143.us-west-2.compute.internal   Ready    <none>   3d      v1.33-eks-036c24b
ip-10-42-11-81.us-west-2.compute.internal    Ready    <none>   3d      v1.33-eks-036c24b
ip-10-42-12-152.us-west-2.compute.internal   Ready    <none>   3m11s   v1.33-eks-036c24b

이 두 개의 추가 노드는 pause Pod를 제외한 어떤 워크로드도 실행하지 않으며, "실제" 워크로드가 스케줄링되면 축출됩니다.