Vertical Pod Autoscaler - Amazon EKS

Vertical Pod Autoscaler

Kubernetes Vertical Pod Autoscaler는 pods에 대한 CPU 및 메모리 예약을 자동으로 조정하여 애플리케이션의 ‘크기를 적절히 조정’할 수 있게 지원합니다. 이러한 조정을 통해 클러스터 리소스 사용률을 개선하고 다른 pods를 위한 CPU 및 메모리를 확보할 수 있습니다. 이 주제에서는 Vertical Pod Autoscaler를 클러스터에 배포하고 제대로 작동하는지 확인하는 방법을 안내합니다.

사전 조건

Vertical Pod Autoscaler 배포

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

Vertical Pod Autoscaler를 배포하려면

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

  2. kubernetes/autoscaler GitHub 리포지토리를 복제합니다.

    git clone https://github.com/kubernetes/autoscaler.git
  3. 디렉터리를 vertical-pod-autoscaler로 변경합니다.

    cd autoscaler/vertical-pod-autoscaler/
  4. (선택 사항) 다른 버전의 Vertical Pod Autoscaler를 이미 배포했다면 다음 명령을 사용하여 제거합니다.

    ./hack/vpa-down.sh
  5. 노드에 k8s.gcr.io 컨테이너 레지스트리에 대한 노드에 인터넷 액세스 권한이 없는 경우, 다음 이미지를 가져와 자체 개인 리포지토리로 푸시해야 합니다. 이미지 가져오기, 자체 개인 리포지토리로 푸시하는 방법에 대한 자세한 내용은 한 리포지토리에서 다른 리포지토리로 컨테이너 이미지 복사 단원을 참조하세요.

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

    이미지를 개인 Amazon ECR 리포지토리에 푸시하는 경우 매니페스트의 k8s.gcr.io를 레지스트리로 바꿉니다. 111122223333을 계정 ID로 바꿉니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다. 다음 명령은 해당 리포지토리의 이름이 매니페스트의 리포지토리 이름과 같다고 가정합니다. 리포지토리의 이름을 다르게 지정하면 리포지토리도 변경해야 합니다.

    sed -i.bak -e 's/k8s.gcr.io/111122223333.dkr.ecr.region-codeamazonaws.com/' ./deploy/admission-controller-deployment.yaml sed -i.bak -e 's/k8s.gcr.io/111122223333.dkr.ecr..dkr.ecr.region-codeamazonaws.com/' ./deploy/recommender-deployment.yaml sed -i.bak -e 's/k8s.gcr.io/111122223333.dkr.ecr..dkr.ecr.region-codeamazonaws.com/' ./deploy/updater-deployment.yaml
  6. 다음 명령을 사용하여 클러스터에 Vertical Pod Autoscaler를 배포합니다.

    ./hack/vpa-up.sh
  7. Vertical Pod Autoscaler pods가 성공적으로 생성되었는지 확인합니다.

    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가 작동 중인지 확인합니다.

Vertical Pod Autoscaler 설치를 테스트하려면

  1. 다음 명령을 사용하여 예시 hamster.yaml Vertical Pod Autoscaler를 배포합니다.

    kubectl apply -f examples/hamster.yaml
  2. hamster 예제 애플리케이션에서 pods를 가져옵니다.

    kubectl get pods -l app=hamster

    출력 예는 다음과 같습니다.

    hamster-c7d89d6db-rglf5 1/1 Running 0 48s hamster-c7d89d6db-znvz5 1/1 Running 0 48s
  3. 여러 pods 중 하나를 설명하여 cpumemory 예약을 확인합니다. c7d89d6db-rglf5를 이전 단계의 출력에서 반환된 ID 중 하나로 바꿉니다.

    kubectl describe pod hamster-c7d89d6db-rglf5

    출력 예는 다음과 같습니다.

    ... Containers: hamster: Container ID: docker://e76c2413fc720ac395c33b64588c82094fc8e5d590e373d5f818f3978f577e24 Image: k8s.gcr.io/ubuntu-slim:0.1 Image ID: docker-pullable://k8s.gcr.io/ubuntu-slim@sha256:b6f8c3885f5880a4f1a7cf717c07242eb4858fdd5a84b5ffe35b1cf680ea17b1 Port: <none> Host Port: <none> 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에서는 100millicpu의 CPU와 50메비바이트의 메모리를 예약한 것을 알 수 있습니다. 이 예시 애플리케이션의 경우 100millicpu는 pod가 실행해야 하는 것보다 적으므로 CPU가 제한되어 있습니다. 또한 필요한 메모리보다 훨씬 적은 메모리를 예약합니다. Vertical Pod Autoscaler vpa-recommender 배포에서는 hamster pods를 분석하여 CPU 및 메모리 요구 사항이 적절한지 확인합니다. 조정이 필요하면 vpa-updater는 업데이트된 값으로 pods를 다시 시작합니다.

  4. vpa-updater가 새로운 hamster pod를 시작할 때까지 기다립니다. 1~2분 정도 걸립니다. 다음 명령을 사용하여 pods를 모니터링할 수 있습니다.

    참고

    새 pod가 시작되었는지 알 수 없다면 pod 이름을 이전 목록과 비교하십시오. 새 pod가 시작되면 새 pod 이름이 표시됩니다.

    kubectl get --watch pods -l app=hamster
  5. hamster pod가 시작되면 포드를 설명하여 업데이트된 CPU 및 메모리 예약을 확인합니다.

    kubectl describe pod hamster-c7d89d6db-jxgfv

    출력 예는 다음과 같습니다.

    ... Containers: hamster: Container ID: docker://2c3e7b6fb7ce0d8c86444334df654af6fb3fc88aad4c5d710eac3b1e7c58f7db Image: k8s.gcr.io/ubuntu-slim:0.1 Image ID: docker-pullable://k8s.gcr.io/ubuntu-slim@sha256:b6f8c3885f5880a4f1a7cf717c07242eb4858fdd5a84b5ffe35b1cf680ea17b1 Port: <none> Host Port: <none> 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 예약이 원래 값의 5배가 넘는 587밀리cpu로 증가했음을 알 수 있습니다. memory은 원래 값의 5배에 달하는 262,144킬로바이트(약 250메비바이트)로 증가했습니다. 이 pod는 리소스가 부족하므로 Vertical Pod Autoscaler는 추정치를 훨씬 더 적절한 값으로 수정하였습니다.

  6. hamster-vpa 리소스를 설명하여 새로운 권장 사항을 확인하십시오.

    kubectl describe vpa/hamster-vpa

    출력 예는 다음과 같습니다.

    Name: hamster-vpa Namespace: default Labels: <none> 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: <none>
  7. 샘플 애플리케이션에 대한 실험이 끝나면 다음 명령으로 이를 삭제할 수 있습니다.

    kubectl delete -f examples/hamster.yaml