

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 Vertical Pod Autoscaler 调整容器组（pod）资源
<a name="vertical-pod-autoscaler"></a>

Kubernetes [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler) 为容器组（pod）自动调整 CPU 和内存预留，帮助实现“合适规模”的应用程序。此调整可以帮助提高集群资源利用率，释放 CPU 和内存供其他容器组（pod）使用。本主题可帮助您将 Vertical Pod Autoscaler 部署到集群并验证它在正常工作。
+ 您拥有现有 Amazon EKS 集群。如果没有，请参阅[开始使用 Amazon EKS](getting-started.md)。
+ 您已安装 Kubernetes Metrics Server。有关更多信息，请参阅 [使用 Kubernetes Metrics Server 查看资源使用情况](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 容器组（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 安装
<a name="vpa-sample-app"></a>

在此部分中，您部署示例应用程序以验证 Vertical Pod Autoscaler 在正常运行。

1. 使用以下命令部署 `hamster.yaml` Vertical Pod Autoscaler 示例。

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

1. 从 `hamster` 示例应用程序获取容器组（pod）。

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

   示例输出如下。

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

1. 描述其中一个容器组（pod），查看其 `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
   [...]
   ```

   您可以看到原始容器组（pod）预留了 100 millicpu 的 CPU 和 50 MiB 内存。对于本示例应用程序，100 millicpu 小于容器组（pod）运行所需的数量，因此 CPU 受限。它预留的内存也远小于所需的数量。Vertical Pod Autoscaler `vpa-recommender` 部署会分析 hamster 容器组（pod），查看 CPU 和内存需求是否合适。如果需要调整，`vpa-updater` 使用更新后的值重新启动容器组（pod）。

1. 等待 `vpa-updater` 启动新 hamster 容器组（pod）。这大概需要一两分钟。您可以使用以下命令监控容器组（pod）。
**注意**  
如果不确定是否启动了新容器组（pod），请将容器组名称与您之前的列表比较。新容器组（pod）启动时，您会看到新容器组（pod）名称。

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

1. 当新 hamster 容器组（pod）启动时，对其进行描述，查看更新后的 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` 预留提升到了 587 个 millicpu，这是原始值的五倍多。`memory` 提高到了 262144 KB，即大约 250 MB，也就是原始值的五倍。此容器组（pod）资源不足，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
   ```