当我们将应用部署到AKS中以pod的形式对外提供服务时,为了确保用户可以获得良好的使用体验,我们需要关注如下两种情况:

  • POD因为不明原有挂掉,导致服务不可用
  • 当出现大量用户访问时,Pod在高负荷的情况下能否支撑我们的应用

对于Pod的高可用性我们可以使用AKS的deployment控制器来确保Pod可以持续对外提供服务,但是对于面临大量用户访问时,我们就需要扩展我们的资源来满足业务需求。
前面的文章中给大家介绍了手动扩展pod来满足业务的扩展需求,但是相信大家都已经意识到了如果我们人工监控pods,人工进行调整副本那么这个工作量无疑是巨大的,但kubernetes已经有了相应的机制来应对了。这就是我们今天要为大家介绍的水平自动扩充POD(HPA)
HPA全称Horizontal Pod Autoscaler控制器工作流程

HPA的工作流程如下:

  • 创建HPA资源对象,关联对应资源例如Deployment,设定目标CPU使用率阈值,最大,最小replica数量。
    前提:pod一定要设置资源限制,参数request,HPA才会工作。
  • HPA控制器每隔15秒钟(可以通过设置controller manager的–horizontal-pod-autoscaler-sync-period参数设定,默认15s)通过观测metrics值获取资源使用信息
  • HPA控制器将获取资源使用信息与HPA设定值进行对比,计算出需要调整的副本数量
  • 根据计算结果调整副本数量,使得单个POD的CPU使用率尽量逼近期望值,但不能照顾设定的最大,最小值。
  • 以上2,3,4周期循环

说了这么多,下面我们来看下如何配置HPA:
在配置HPA之前,我们需要先了解Node节点的配置情况
检查与配置resource limit
使用kubectl get nodes命令检查node信息(node名称)
Azure Kubernetes 水平自动扩充Pod
使用命令 kubectl describe nodes NODE_NAME 确认 Node 资源配置的状态, 因为我们之前没有配置Resource quata,因此我们需要先设定好 Resource 限制:
Azure Kubernetes 水平自动扩充Pod_第1张图片
打开我们之前创建的yaml文件,修改 Resources 配置, 其中 CPU 配置 Container 只使用 1 个 CPU 单元, Request 限制使用 0.5 个 CPU 单元:
Azure Kubernetes 水平自动扩充Pod_第2张图片
修改完成以后使用kubectl apply -f FILE_NAME重新部署对应POD
Azure Kubernetes 水平自动扩充Pod

设置水平自动扩充HPA
使用命令 kubectl autoscale deployment nginx--cpu-percent=1 --min=1 --max=10 将自动扩充设定为 CPU-percent 设定为1%, 并且将 minimum replica 数设为 1, maximum replica 数设为 10.
Azure Kubernetes 水平自动扩充Pod

配置完成以后我们使用webbench来对我们部署的NGINX网站进行压力测试:
Azure Kubernetes 水平自动扩充Pod_第3张图片
使用命令 kubectl get hpa 观察水平自动扩充状态, 请注意 Target 中有两个数字, 是 Current/Target CPU 使用率
Azure Kubernetes 水平自动扩充Pod
使用命令 kubectl get deployment 观察 deployment 数量有无增加
Azure Kubernetes 水平自动扩充Pod
使用命令 kubectl get pod 观察 pod 数量有无增加, 并且注意状态, 如果 > 1 表示水平自动扩充 (hpa) 已经成功设置且生效了
Azure Kubernetes 水平自动扩充Pod_第4张图片

清除资源
测试完成以后,我们可以使用kubect delete -f FILE_NAME 来删除对应的deployment资源:
Azure Kubernetes 水平自动扩充Pod_第5张图片
使用kubectl delete hpa nginx来删除hpa资源:
Azure Kubernetes 水平自动扩充Pod