

 **帮助改进此页面** 

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

# 使用 Horizontal Pod Autoscaler 扩展容器组（pod）部署
<a name="horizontal-pod-autoscaler"></a>

Kubernetes [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) 根据资源的 CPU 利用率，自动扩展部署、复制控制器或副本集中的容器组（pod）数量。这有助于您的应用程序进行扩展以满足增长的需求，或在不需要资源时进行缩减，从而释放出节点用于其他应用程序。当您设置目标 CPU 利用率百分比时，Horizontal Pod Autoscaler 扩展或缩减应用程序来尝试满足该目标。

Horizontal Pod Autoscaler 是 Kubernetes 中的标准 API 资源，只需在 Amazon EKS 集群上安装一个指标源（如 Kubernetes Metrics Server）即可正常运行。您不需要在集群上部署或安装 Horizontal Pod Autoscaler 以开始扩展您的应用程序。有关更多信息，请参阅 Kubernetes 文档中的 [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)。

使用本主题为您的 Amazon EKS 集群准备 Horizontal Pod Autoscaler 并验证它可用于示例应用程序。

**注意**  
本主题基于 Kubernetes 文档中的 [Horizontal Pod Autoscaler 演练](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)。
+ 您拥有现有 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` 客户端。

## 运行 Horizontal Pod Autoscaler 测试应用程序
<a name="hpa-sample-app"></a>

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

**注意**  
本示例基于 Kubernetes 文档中的 [Horizontal Pod Autoscaler 演练](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)。

1. 使用以下命令部署一个简单的 Apache Web 服务器应用程序。

   ```
   kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
   ```

   向此 Apache Web 服务器容器组（pod）提供 500 millicpu 的 CPU 限制，并在端口 80 上提供服务。

1. 为 `php-apache` 部署创建 Horizontal Pod Autoscaler 资源。

   ```
   kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
   ```

   此命令创建的 Autoscaler 将部署的 CPU 利用率定为 50%，最少有一个容器组（pod），最多有 10 个容器组（pod）。当平均 CPU 负载低于 50% 时，Autoscaler 尝试减少部署中的容器组（pod）数量，最少要保留一个。当负载大于 50% 时，Autoscaler 尝试增加部署中的容器组（pod）数量，最多增加到十个。有关更多信息，请参阅 Kubernetes 文档中的 [HorizontalPodAutoscaler 是如何工作的？](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#how-does-a-horizontalpodautoscaler-work)。

1. 使用以下命令描述 Autoscaler 以查看其详细信息。

   ```
   kubectl get hpa
   ```

   示例输出如下。

   ```
   NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
   php-apache   Deployment/php-apache   0%/50%    1         10        1          51s
   ```

   如您所见，当前 CPU 负载是 `0%`，因为服务器上尚没有负载。容器组（pod）数量已处于最低界限（1 个），因此无法横向缩减。

1.  通过运行容器为 Web 服务器创建负载。

   ```
   kubectl run -i \
       --tty load-generator \
       --rm --image=busybox \
       --restart=Never \
       -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
   ```

1. 要监视部署的向外扩展情况，请在与执行上一步骤的终端不同的终端上定期运行以下命令。

   ```
   kubectl get hpa php-apache
   ```

   示例输出如下。

   ```
   NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
   php-apache   Deployment/php-apache   250%/50%   1         10        5          4m44s
   ```

   可能需要一分钟以上的时间才能增加副本计数。只要实际 CPU 百分比高于目标百分比，副本计数就会增加（最大值为 10）。在此情况下，此百分比为 `250%`，因此 `REPLICAS` 数会继续增加。
**注意**  
可能需要在几分钟后，您才能看到副本计数达到其最大值。例如，如果只需 6 个副本即可让 CPU 负载小于或等于 50％，则负载将不会超过 6 个副本。

1. 停止负载。在正在生成负载的终端窗口中，按住 `Ctrl+C` 键停止负载。在观察扩缩的终端中再次运行以下命令，您会看到副本数缩减回 1。

   ```
   kubectl get hpa
   ```

   示例输出如下。

   ```
   NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
   php-apache   Deployment/php-apache   0%/50%    1         10        1          25m
   ```
**注意**  
默认缩减时间范围为 5 分钟，因此，在您看到副本计数再次达到 1 之前也需要一段时间，甚至在当前 CPU 百分比为 0% 时也是如此。时间范围可以修改。有关更多信息，请参阅 Kubernetes 文档中的 [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)。

1. 完成示例应用程序的试验之后，删除 `php-apache` 资源。

   ```
   kubectl delete deployment.apps/php-apache service/php-apache horizontalpodautoscaler.autoscaling/php-apache
   ```