Vertical Pod Autoscaler로 Pod 리소스 조정

Vertical Pod Autoscaler로 Pod 리소스 조정

Kubernetes Vertical Pod Autoscaler는 Pod의 CPU와 메모리 예약을 자동으로 조정하여 애플리케이션을 "적절한 크기(right size)"로 만드는 데 도움을 줍니다. 이 조정은 클러스터 리소스 활용도를 개선하고 다른 Pod를 위한 CPU와 메모리를 확보할 수 있습니다. 이 주제는 Vertical Pod Autoscaler를 클러스터에 배포하고 작동하는지 확인하는 데 도움이 됩니다.

출처: 문서

본문

사전 요구 사항

  • 기존 Amazon EKS 클러스터. 없다면 Amazon EKS 시작하기(Get started with Amazon EKS)를 참조하세요.
  • Kubernetes Metrics Server가 설치되어 있습니다. 자세한 내용은 Kubernetes Metrics Server로 리소스 사용률 보기를 참조하세요.
  • Amazon EKS 클러스터와 통신하도록 구성된 kubectl 클라이언트를 사용하고 있습니다.
  • 기기에 OpenSSL 1.1.1 이상이 설치되어 있습니다.

Vertical Pod Autoscaler 배포

이 섹션에서는 Vertical Pod Autoscaler를 클러스터에 배포합니다.

터미널 창을 열고 Vertical Pod Autoscaler 소스 코드를 다운로드할 디렉터리로 이동합니다.

kubernetes/autoscaler GitHub 저장소를 클론합니다.

git clone https://github.com/kubernetes/autoscaler.git

vertical-pod-autoscaler 디렉터리로 이동합니다.

cd autoscaler/vertical-pod-autoscaler/

(선택 사항) 이전 버전의 Vertical Pod Autoscaler를 이미 배포했다면 다음 명령으로 제거합니다.

./hack/vpa-down.sh

노드가 registry.k8s.io 컨테이너 레지스트리에 인터넷 액세스가 없다면 다음 이미지를 가져와 자체 프라이빗 저장소에 푸시해야 합니다. 이미지를 가져와 자체 프라이빗 저장소에 푸시하는 방법은 한 저장소에서 다른 저장소로 컨테이너 이미지 복사를 참조하세요.

registry.k8s.io/autoscaling/vpa-admission-controller:0.10.0
registry.k8s.io/autoscaling/vpa-recommender:0.10.0
registry.k8s.io/autoscaling/vpa-updater:0.10.0

이미지를 프라이빗 Amazon ECR 저장소에 푸시한다면 매니페스트에서 registry.k8s.io를 레지스트리로 바꿉니다. 111122223333을 계정 ID로 바꿉니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다. 다음 명령은 저장소 이름을 매니페스트의 저장소 이름과 동일하게 지정했다고 가정합니다. 다른 이름으로 지정했다면 그것도 변경해야 합니다.

sed -i.bak -e 's/registry.k8s.io/111122223333.dkr.ecr.region-code.amazonaws.com/' ./deploy/admission-controller-deployment.yaml
sed -i.bak -e 's/registry.k8s.io/111122223333.dkr.ecr.region-code.amazonaws.com/' ./deploy/recommender-deployment.yaml
sed -i.bak -e 's/registry.k8s.io/111122223333.dkr.ecr.region-code.amazonaws.com/' ./deploy/updater-deployment.yaml

다음 명령으로 Vertical Pod Autoscaler를 클러스터에 배포합니다.

./hack/vpa-up.sh

Vertical Pod Autoscaler Pod가 성공적으로 생성되었는지 확인합니다.

kubectl get pods -n kube-system

예시 출력은 다음과 같습니다.

NAME                                        READY   STATUS    RESTARTS   AGE
[...]
metrics-server-8459fc497-kfj8w              1/1     Running   0          83m
vpa-admission-controller-68c748777d-ppspd   1/1     Running   0          7s
vpa-recommender-6fc8c67d85-gljpl            1/1     Running   0          8s
vpa-updater-786b96955c-bgp9d                1/1     Running   0          8s

Vertical Pod Autoscaler 설치 테스트

이 섹션에서는 Vertical Pod Autoscaler가 작동하는지 확인하기 위해 샘플 애플리케이션을 배포합니다.

다음 명령으로 hamster.yaml Vertical Pod Autoscaler 예제를 배포합니다.

kubectl apply -f examples/hamster.yaml

hamster 예제 애플리케이션에서 Pod를 가져옵니다.

kubectl get pods -l app=hamster

예시 출력은 다음과 같습니다.

hamster-c7d89d6db-rglf5   1/1     Running   0          48s
hamster-c7d89d6db-znvz5   1/1     Running   0          48s

Pod 중 하나를 describe하여 cpu와 memory 예약을 봅니다. c7d89d6db-rglf5를 이전 단계의 출력에서 반환된 ID 중 하나로 바꿉니다.

kubectl describe pod hamster-c7d89d6db-rglf5

예시 출력은 다음과 같습니다.

[...]
Containers:
  hamster:
    Container ID:  docker://e76c2413fc720ac395c33b64588c82094fc8e5d590e373d5f818f3978f577e24
    Image:         registry.k8s.io/ubuntu-slim:0.1
    Image ID:      docker-pullable://registry.k8s.io/ubuntu-slim@sha256:b6f8c3885f5880a4f1a7cf717c07242eb4858fdd5a84b5ffe35b1cf680ea17b1
    Port:
    Host Port:
    Command:
      /bin/sh
    Args:
      -c
      while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
    State:          Running
      Started:      Fri, 27 Sep 2019 10:35:16 -0700
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        100m
      memory:     50Mi
[...]

원래 Pod가 CPU 100 millicpu와 메모리 50 mebibytes를 예약하는 것을 볼 수 있습니다. 이 예제 애플리케이션의 경우 100 millicpu는 Pod 실행에 필요한 양보다 적으므로 CPU 제약이 있습니다. 또한 필요한 양보다 훨씬 적은 메모리를 예약합니다. Vertical Pod Autoscaler vpa-recommender 배포는 hamster Pod를 분석해 CPU와 메모리 요구 사항이 적절한지 확인합니다. 조정이 필요하면 vpa-updater가 업데이트된 값으로 Pod를 다시 시작합니다.

vpa-updater가 새 hamster Pod를 시작할 때까지 기다립니다. 1~2분이 걸릴 수 있습니다. 다음 명령으로 Pod를 모니터링할 수 있습니다.

참고

새 Pod가 시작되었는지 확실하지 않으면 Pod 이름을 이전 목록과 비교하세요. 새 Pod가 시작되면 새 Pod 이름이 보입니다.

kubectl get --watch Pods -l app=hamster

새 hamster Pod가 시작되면 describe하고 업데이트된 CPU 및 메모리 예약을 봅니다.

kubectl describe pod hamster-c7d89d6db-jxgfv

예시 출력은 다음과 같습니다.

[...]
Containers:
  hamster:
    Container ID:  docker://2c3e7b6fb7ce0d8c86444334df654af6fb3fc88aad4c5d710eac3b1e7c58f7db
    Image:         registry.k8s.io/ubuntu-slim:0.1
    Image ID:      docker-pullable://registry.k8s.io/ubuntu-slim@sha256:b6f8c3885f5880a4f1a7cf717c07242eb4858fdd5a84b5ffe35b1cf680ea17b1
    Port:
    Host Port:
    Command:
      /bin/sh
    Args:
      -c
      while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
    State:          Running
      Started:      Fri, 27 Sep 2019 10:37:08 -0700
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
[...]

이전 출력에서 cpu 예약이 587 millicpu로 증가했으며, 이는 원래 값의 5배가 넘는 것을 볼 수 있습니다. memory는 262,144 Kilobytes로 증가했으며, 이는 약 250 mebibytes, 즉 원래 값의 약 5배입니다. 이 Pod는 리소스가 부족했고 Vertical Pod Autoscaler가 훨씬 더 적절한 값으로 추정치를 수정했습니다.

hamster-vpa 리소스를 describe하여 새 추천을 봅니다.

kubectl describe vpa/hamster-vpa

예시 출력은 다음과 같습니다.

Name:         hamster-vpa
Namespace:    default
Labels:
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"autoscaling.k8s.io/v1beta2","kind":"VerticalPodAutoscaler","metadata":{"annotations":{},"name":"hamster-vpa","namespace":"d...
API Version:  autoscaling.k8s.io/v1beta2
Kind:         VerticalPodAutoscaler
Metadata:
  Creation Timestamp:  2019-09-27T18:22:51Z
  Generation:          23
  Resource Version:    14411
  Self Link:           /apis/autoscaling.k8s.io/v1beta2/namespaces/default/verticalpodautoscalers/hamster-vpa
  UID:                 d0d85fb9-e153-11e9-ae53-0205785d75b0
Spec:
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         hamster
Status:
  Conditions:
    Last Transition Time:  2019-09-27T18:23:28Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     550m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     21147m
        Memory:  387863636
Events:

예제 애플리케이션 실험이 끝나면 다음 명령으로 삭제할 수 있습니다.

kubectl delete -f examples/hamster.yaml

더 알아보기 (Learn more)