

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# Vertical Pod Autoscaler를 사용하여 포드 리소스 조정
<a name="vertical-pod-autoscaler"></a>

Kubernetes [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler)는 포드에 대한 CPU 및 메모리 예약을 자동으로 조정하여 애플리케이션의 ‘크기를 적절히 조정’할 수 있게 지원합니다. 이러한 조정을 통해 클러스터 리소스 사용률을 개선하고 다른 포드를 위한 CPU와 메모리를 확보할 수 있습니다. 이 주제에서는 Vertical Pod Autoscaler를 클러스터에 배포하고 제대로 작동하는지 확인하는 방법을 안내합니다.
+ 기존 Amazon EKS 클러스터가 있습니다. 그렇지 않은 경우 [Amazon EKS 시작하기](getting-started.md) 섹션을 참조하세요.
+ Kubernetes 지표 서버가 설치되어 있습니다. 자세한 내용은 [Kubernetes 지표 서버를 사용한 리소스 사용량 보기](metrics-server.md) 단원을 참조하십시오.
+ [Amazon EKS 클러스터와 통신하도록 구성된](getting-started-console.md#eks-configure-kubectl) `kubectl` 클라이언트를 사용 중입니다.
+ OpenSSL `1.1.1` 이상이 디바이스에 설치되어 있습니다.

## Vertical Pod Autoscaler 배포
<a name="vpa-deploy"></a>

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

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

1. [kubernetes/autoscaler](https://github.com/kubernetes/autoscaler) GitHub 리포지토리를 복제합니다.

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

1. 디렉터리를 `vertical-pod-autoscaler`로 변경합니다.

   ```
   cd autoscaler/vertical-pod-autoscaler/
   ```

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

   ```
   ./hack/vpa-down.sh
   ```

1. 노드에 `registry.k8s.io` 컨테이너 레지스트리에 대한 노드에 인터넷 액세스 권한이 없는 경우, 다음 이미지를 가져와 자체 개인 리포지토리로 푸시해야 합니다. 이미지 가져오기, 자체 개인 리포지토리로 푸시하는 방법에 대한 자세한 내용은 [한 리포지토리에서 다른 리포지토리로 컨테이너 이미지 복사](copy-image-to-repository.md) 섹션을 참조하세요.

   ```
   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
   ```

1. 다음 명령을 사용하여 클러스터에 Vertical Pod Autoscaler를 배포합니다.

   ```
   ./hack/vpa-up.sh
   ```

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

   ```
   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 설치 테스트
<a name="vpa-sample-app"></a>

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

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

   ```
   kubectl apply -f examples/hamster.yaml
   ```

1. `hamster` 예시 애플리케이션에서 포드를 가져옵니다.

   ```
   kubectl get pods -l app=hamster
   ```

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

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

1. 여러 포드 중 하나를 설명하여 `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:          <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
   [...]
   ```

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

1. `vpa-updater`가 새로운 hamster 포드를 시작할 때까지 기다립니다. 1\$12분 정도 걸립니다. 다음 명령을 사용하여 포드를 모니터링할 수 있습니다.
**참고**  
새 포드가 시작되었는지 알 수 없다면 포드 이름을 이전 목록과 비교하세요. 새 포드가 시작되면 새 포드 이름이 표시됩니다.

   ```
   kubectl get --watch Pods -l app=hamster
   ```

1. 새 hamster 포드가 시작되면 포드를 설명하여 업데이트된 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:          <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메비바이트)로 증가했습니다. 이 포드는 리소스가 부족하므로 Vertical Pod Autoscaler는 추정치를 훨씬 더 적절한 값으로 수정하였습니다.

1. `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>
   ```

1. 샘플 애플리케이션에 대한 실험이 끝나면 다음 명령으로 이를 삭제할 수 있습니다.

   ```
   kubectl delete -f examples/hamster.yaml
   ```