AKS(Azure Kubernetes Service)에서 Vertical Pod Autoscaler 사용
이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 VPA(Vertical Pod Autoscaler)를 사용하는 방법을 알아봅니다. VPA는 워크로드의 사용 패턴과 일치하도록 Pod에 대한 CPU 및 메모리 요청을 자동으로 조정합니다. 이 기능은 애플리케이션의 성능을 최적화하고 AKS에서 워크로드를 실행하는 비용을 줄이는 데 도움이 됩니다.
자세한 내용은 Vertical Pod Autoscaler 개요를 참조하세요.
시작하기 전에
기존 AKS 클러스터가 있는 경우 Kubernetes 버전 1.24 이상을 실행하는지 확인합니다.
Azure CLI 버전 2.52.0 이상을 설치하고 구성해야 합니다.
az --version
을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.기존 클러스터에서 VPA를 사용하도록 설정하는 경우
az aks get-credentials
명령을 사용하여kubectl
이 설치되어 있고 AKS 클러스터에 연결하도록 구성되어 있는지 확인합니다.az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
새 클러스터에 Vertical Pod Autoscaler 배포
az aks create
플래그와 함께--enable-vpa
명령을 사용하여 VPA가 사용하도록 설정된 새 AKS 클러스터를 만듭니다.az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
Vertical Pod Autoscaler를 사용하도록 기존 클러스터 업데이트
--enable-vpa
플래그와 함께az aks update
명령을 사용하여 VPA를 사용하도록 기존 클러스터를 업데이트합니다.az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
기존 클러스터에서 Vertical Pod Autoscaler 사용 안 함
--disable-vpa
플래그와 함께az aks update
명령을 사용하여 기존 클러스터에서 VPA를 사용하지 않도록 설정합니다.az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
Vertical Pod Autoscaler 설치 테스트
다음 예제에서는 각각 100밀리코어를 요청하고 500밀리코어를 약간 초과하는 단일 컨테이너를 실행하는 두 개의 Pod를 활용하여 배포를 만듭니다. 또한 배포를 가리키는 VPA 구성도 만듭니다. VPA는 Pod의 동작을 관찰하고 약 5분 후에 500밀리코어를 요청하도록 Pod를 업데이트합니다.
hamster.yaml
파일을 만들고 kubernetes/autoscaler GitHub 리포지토리에서 Vertical Pod Autoscaler 예제의 다음 매니페스트에 복사합니다.apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: hamster image: registry.k8s.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
kubectl apply
명령을 사용하여hamster.yaml
Vertical Pod Autoscaler 예제를 배포합니다.kubectl apply -f hamster.yaml
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
kubectl get
명령을 사용하여 실행 중인 Pod를 확인합니다.kubectl get pods -l app=hamster
출력은 다음 예제 출력과 비슷하게 됩니다.
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
kubectl describe
명령을 사용하여 Pod 중 하나에서 CPU 및 메모리 예약을 확인합니다.<example-pod>
를 이전 단계의 출력에 반환된 Pod ID 중 하나로 바꿉니다.kubectl describe pod hamster-<example-pod>
출력은 다음 예제 출력과 비슷하게 됩니다.
hamster: Container ID: containerd:// Image: k8s.gcr.io/ubuntu-slim:0.1 Image ID: sha256: 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: Wed, 28 Sep 2022 15:06:14 -0400 Ready: True Restart Count: 0 Requests: cpu: 100m memory: 50Mi Environment: <none>
이 예제에서는 Pod에 100밀리 CPU와 50MiB의 메모리가 예약되어 있습니다. 이 샘플 애플리케이션의 경우 Pod를 실행하려면 100밀리 CPU만 필요하므로 사용 가능한 CPU 용량이 없습니다. 또한 Pod는 필요한 것보다 적은 메모리를 예약합니다. Vertical Pod Autoscaler vpa-recommender 배포는 햄스터 애플리케이션을 호스트하는 Pod를 분석하여 CPU 및 메모리 요구 사항이 적절한지 확인합니다. 조정이 필요한 경우 vpa-updater는 업데이트된 값으로 Pod를 다시 실행합니다.
kubectl get
명령을 사용하여 Pod를 모니터링합니다.kubectl get --watch pods -l app=hamster
새 햄스터 Pod가 시작되면
kubectl describe
명령을 사용하여 업데이트된 CPU 및 메모리 예약을 확인할 수 있습니다.<example-pod>
를 이전 단계의 출력에 반환된 Pod ID 중 하나로 바꿉니다.kubectl describe pod hamster-<example-pod>
출력은 다음 예제 출력과 비슷하게 됩니다.
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
이전 출력에서 CPU 예약이 원래 값의 5배 이상인 587밀리 CPU로 증가한 것을 확인할 수 있습니다. 메모리가 262,144KB로 증가했으며 이는 약 250MiB로, 원래 값의 5배입니다. 이 Pod는 리소스가 부족했기 때문에 Vertical Pod Autoscaler가 훨씬 더 적절한 값으로 추정치를 수정했습니다.
hamster-vpa 자원 정보를 설명하려면
kubectl describe
명령을 실행하여 VPA에서 업데이트된 권장 사항을 확인합니다.kubectl describe vpa/hamster-vpa
출력은 다음 예제 출력과 비슷하게 됩니다.
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Vertical Pod Autoscaler 요청 설정
VerticalPodAutoscaler
개체는 Auto
의 updateMode
를 사용하여 Pod에서 리소스 요청을 자동으로 설정합니다. 요구 사항 및 테스트에 따라 다른 값을 설정할 수 있습니다. 이 예제에서는 각각 100milliCPU 및 50MiB 메모리를 요청하고 updateMode
를 Recreate
로 설정하는 컨테이너를 실행하는 두 개의 Pod를 사용하여 배포 매니페스트를 만들고 테스트합니다.
파일
azure-autodeploy.yaml
을 만들고 다음 매니페스트에 복사합니다.apiVersion: apps/v1 kind: Deployment metadata: name: vpa-auto-deployment spec: replicas: 2 selector: matchLabels: app: vpa-auto-deployment template: metadata: labels: app: vpa-auto-deployment spec: containers: - name: mycontainer image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
kubectl create
명령을 사용하여 Pod를 만듭니다.kubectl create -f azure-autodeploy.yaml
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
kubectl get
명령을 사용하여 실행 중인 Pod를 확인합니다.kubectl get pods
출력은 다음 예제 출력과 비슷하게 됩니다.
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-kchc5 1/1 Running 0 52s vpa-auto-deployment-54465fb978-nhtmj 1/1 Running 0 52s
파일
azure-vpa-auto.yaml
을 만들고 다음 매니페스트에 복사합니다.apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-auto spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: vpa-auto-deployment updatePolicy: updateMode: "Recreate"
targetRef.name
값은vpa-auto-deployment
배포를 통해 제어되는 Pod가VerticalPodAutoscaler
에 속하도록 지정합니다.Recreate
의updateMode
값은 Vertical Pod Autoscaler 컨트롤러가 Pod를 삭제하고 CPU 및 메모리 요청을 조정한 후 새 Pod를 만들 수 있음을 의미합니다.kubectl apply
명령을 사용하여 클러스터에 매니페스트를 적용합니다.kubectl create -f azure-vpa-auto.yaml
몇 분 정도 기다린 다음
kubectl get
명령을 사용하여 실행 중인 Pod를 확인합니다.kubectl get pods
출력은 다음 예제 출력과 비슷하게 됩니다.
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-qbhc4 1/1 Running 0 2m49s vpa-auto-deployment-54465fb978-vbj68 1/1 Running 0 109s
kubectl get
명령을 사용하여 실행 중인 Pod 중 하나에 대한 자세한 정보를 확인합니다.<pod-name>
을 이전 출력에 있는 Pod 중 하나의 이름으로 바꿔야 합니다.kubectl get pod <pod-name> --output yaml
출력은 VPA 컨트롤러가 메모리 요청이 262144k로, CPU 요청이 25milliCPU로 증가했음을 보여 주는 다음 예제 출력과 유사합니다.
apiVersion: v1 kind: Pod metadata: annotations: vpaObservedContainers: mycontainer vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory request' creationTimestamp: "2022-09-29T16:44:37Z" generateName: vpa-auto-deployment-54465fb978- labels: app: vpa-auto-deployment spec: containers: - args: - -c - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done command: - /bin/sh image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine imagePullPolicy: IfNotPresent name: mycontainer resources: requests: cpu: 25m memory: 262144k
kubectl get
명령을 사용하여 Vertical Pod Autoscaler와 CPU 및 메모리 관련 권장 사항에 대한 자세한 정보를 확인합니다.kubectl get vpa vpa-auto --output yaml
출력은 다음 예제 출력과 비슷하게 됩니다.
recommendation: containerRecommendations: - containerName: mycontainer lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 230m memory: 262144k
이 예제에서
target
특성의 결과에서는 컨테이너를 최적의 상태로 실행하기 위해 CPU 또는 메모리 대상을 변경할 필요가 없음을 지정합니다. 그러나 결과는 애플리케이션 및 리소스 사용률에 따라 달라질 수 있습니다.Vertical Pod Autoscaler는
lowerBound
및upperBound
특성을 사용하여 Pod를 삭제하고 새 Pod로 바꿀지 여부를 결정합니다. Pod에 하한보다 작거나 상한보다 큰 요청이 있는 경우 Vertical Pod Autoscaler는 Pod를 삭제하고 대상 특성을 충족하는 Pod로 바꿉니다.
Vertical Pod Autoscaler용 추가 Recommender
Recommender에서는 실시간 리소스 사용량을 기반으로 리소스 사용에 대한 권장 사항을 제공합니다. AKS는 클러스터에서 VPA를 사용하도록 설정할 때 Recommender를 배포합니다. 기본 이미지와 동일한 이미지를 사용하여 사용자 지정된 Recommender 또는 추가 Recommender를 배포할 수 있습니다. 사용자 지정된 Recommender를 사용할 경우의 이점은 권장 사항 논리를 사용자 지정할 수 있다는 것입니다. 추가 Recommender를 사용하면 VBA를 분할하여 다른 Recommender를 사용할 수 있습니다.
다음 예제에서는 추가 Recommender를 만들고, 기존 AKS 클러스터에 적용하고, 추가 Recommender를 사용하도록 VPA 개체를 구성합니다.
파일
extra_recommender.yaml
을 만들고 다음 매니페스트에 복사합니다.apiVersion: apps/v1 kind: Deployment metadata: name: extra-recommender namespace: kube-system spec: replicas: 1 selector: matchLabels: app: extra-recommender template: metadata: labels: app: extra-recommender spec: serviceAccountName: vpa-recommender securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: recommender image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 imagePullPolicy: Always args: - --recommender-name=extra-recommender resources: limits: cpu: 200m memory: 1000Mi requests: cpu: 50m memory: 500Mi ports: - name: prometheus containerPort: 8942
kubectl apply
명령을 사용하여extra-recomender.yaml
Vertical Pod Autoscaler 예제를 배포합니다.kubectl apply -f extra-recommender.yaml
몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.
파일
hamster-extra-recommender.yaml
을 만들고 다음 매니페스트에 복사합니다.apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: recommenders: - name: 'extra-recommender' targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 # nobody containers: - name: hamster image: k8s.gcr.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
controlledResources
에memory
이(가) 지정되지 않은 경우 Recommender는 OOM 이벤트에 응답하지 않습니다. 이 예제에서는controlledValues
에서 CPU만 설정합니다.controlledValues
을(를) 사용하면 컨테이너의 리소스 요청을RequestsOnly
옵션을 사용하여 업데이트할지 또는RequestsAndLimits
옵션을 사용하여 리소스 요청과 한도를 모두 업데이트할지 선택할 수 있습니다. 기본값은RequestsAndLimits
입니다.RequestsAndLimits
옵션을 사용하는 경우 요청은 실제 사용량을 기준으로 계산되고 제한은 현재 Pod의 요청 및 한도 비율을 기준으로 계산됩니다.예를 들어 2개의 CPU를 요청하고 CPU 4개로 제한하는 Pod로 시작하는 경우 VPA는 항상 한도를 요청의 두 배로 설정합니다. 메모리에도 동일한 원칙이 적용됩니다.
RequestsAndLimits
모드를 사용하는 경우 초기 애플리케이션 리소스 요청 및 한도에 대한 청사진 역할을 할 수 있습니다.CPU 및 메모리 모두에 대한
Auto
모드 및 컴퓨팅 권장 사항을 사용하여 VPA 개체를 간소화할 수 있습니다.hamster-extra-recomender.yaml
명령을 사용하여kubectl apply
예제를 배포합니다.kubectl apply -f hamster-extra-recommender.yaml
[kubectl get
]kubectl-get 명령을 사용하여 Pod를 모니터링합니다.kubectl get --watch pods -l app=hamster
새 햄스터 Pod가 시작되면
kubectl describe
명령을 사용하여 업데이트된 CPU 및 메모리 예약을 확인합니다.<example-pod>
를 Pod ID 중 하나로 바꾸도록 합니다.kubectl describe pod hamster-<example-pod>
출력은 다음 예제 출력과 비슷하게 됩니다.
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
kubectl describe
명령을 사용하여 VPA에서 업데이트된 권장 사항을 확인합니다.kubectl describe vpa/hamster-vpa
출력은 다음 예제 출력과 비슷하게 됩니다.
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none> Spec: recommenders: Name: customized-recommender
Vertical Pod Autoscaler 문제 해결
Vertical Pod Autoscaler에 문제가 발생하는 경우 시스템 구성 요소 및 사용자 지정 리소스 정의를 해결하여 문제를 식별할 수 있습니다.
다음 명령을 사용하여 모든 시스템 구성 요소가 실행 중인지 확인합니다.
kubectl --namespace=kube-system get pods|grep vpa
출력에는 recommender, updater 및 admission-controller의 세 가지 Pod가 나열되어야 하며 상태는 모두
Running
입니다.이전 출력에서 반환된 각 Pod에 대해 시스템 구성 요소가 다음 명령을 사용하여 오류를 로깅하고 있는지 확인합니다.
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
다음 명령을 사용하여 사용자 지정 리소스 정의가 만들어졌는지 확인합니다.
kubectl get customresourcedefinition | grep verticalpodautoscalers
다음 단계
관련 VPA 개체에 대해 자세히 알아보려면 Vertical Pod Autoscaler API 참조를 참조하세요.
Azure Kubernetes Service