K8S – HPA自动弹性伸缩容

上K8S并不能直接带来成本的降低,除非实现自动弹性伸缩容。

自动弹性伸缩容包含了2个层面,只有同时实现才能降低成本:

  • Pod级:根据POD的资源负载,自动增加/减少Pod数量。
  • Node级:根据Node的资源负载,自动增加/减少Node数量。

Pod级弹性依靠K8S官方自带方案HPA(Horizontal Pod Autoscaler)即可解决。

而Node级弹性则需要与IAAS平台联动实现虚拟机的动态添加与摘除,我们叫做CA(Cluster Autoscaler),开源项目已经支持了AWS/Google/Aliyun/Baiduyun等主流平台,国内云平台估计各自进行了二次开发适配自己的IAAS虚拟化平台。

我公司选择是ucloud云平台托管的K8S集群,所以只需要在ucloud后台点点鼠标把它的CA配置并部署到K8S集群里即可。

因此,这篇博客主要讲讲HPA,原生K8S自带的POD水平伸缩容方案。

搭建minikube环境

顺便说说K8S的实验环境问题。

推荐大家自己整一台虚拟机,下载一个minikube做实验,而不是安装一个复杂的K8S集群。

minikue安装步骤很简单:

  • 安装docker ce
  • 安装minikube
  • 配置minikube插件
  • 启动minikube
  • 下载kubectl二进制(minikube不包含命令行工具,所以需要单独安装,见链接

minikube提供了一个addon插件机制,很多K8S组件不用自己去创建YAML,直接安装addon即可,比如:metrics-server、dashboard只需要安装一下插件就可以使用了:

HPA依赖metrics-server提供的POD级CPU/MEM监控数据,所以必须部署metrics-server:

minikube addons enable metrics-server

记得安装完插件重新启动minikube,相关命令:

启动minikube很有学问:

  • –vm-driver:指定none才会使用docker作为runc。
  • –image-mirror:指定cn会使用国内源下载docker镜像,否则你会被墙的死去活来。

如果你遵照我说的搭建,一切都将非常顺利。

HPA资料

我从2个渠道了解了HPA:

大家读完博客之后,可以按需再详细看一遍。

使用示例

我们首先需要deployment一个应用,然后为这个deployment创建一个HPA对象,此后该HPA对象会监督该deployment的POD负载并弹性伸缩POD数量。

创建deployment

这个YAML部署了一个PHP应用,以及对应的service负载均衡:

我们重点关注到2个配置项,稍后有用:

  • replicas指定了5个POD
  • requests指定了最低要求1核CPU

目前已经拉起5个POD(因为我机器只有4核,而每个POD requests了1核,所以有部分POD资源不足无法拉起):

然而这些POD目前压根没有负载压力,属于资源浪费状态:

POD的CPU使用为0,内存占用9M,目前有3个POD在running。

如果这时候能有弹性伸缩把POD数量降下来,不就可以让出很多闲置资源了吗?

配置HPA

因此,我们为这个deployment配置1个HPA对象,让它负责弹性伸缩该部署。

这个hpa.yaml里面定义了一个HPA对象:

其位于autocaling/v1下面,类型是HorizontalPodAutoscaler,核心配置如下:

  • scaleTargetRef:指定要弹性伸缩哪个资源,这里就是指定了上述deployment。(注意:hpa必须和target处于一个namespace下面。
  • min/maxReplicas:指定伸缩之后最少以及最多的POD数量,这里指定了1~2个POD。
  • targetCPUUtilizationPercentage:指定了POD的CPU使用率阈值,一旦超过50%就新增POD,直到所有POD的平均CPU使用率低于50%或者POD数量先到达了maxReplicas。

我们可以查看HPA的信息:

TARGET说明了所有POD的平均CPU使用率以及我们指定的阈值50%之间的关系,同时也观察到HPA已经将deployment的replicas从5个调低为1个了。

我们可以查看一下实际POD信息:

说明HPA在缩容方面的确有效。

验证扩容

只需要给POD造成请求压力,令其CPU打高超过50%使用率(相对于request的1核计算),那么HPA会很快弹性扩容。

该YAML部署了一个死循环请求PHP的压测客户端:

所以,现在查看HPA已经从1个POD扩容到上限2个POD(耐心等待,因为metrics-server采集以及HPA检测资源利用率是周期性间隔的):

控制HPA行为

如果你实际使用的话,应该会感受到HPA在压力突变后响应动作是有延迟的,这是受到HPA调度算法的影响,可以通过参数调节。

有一些参数已经废弃了,我讲的都是最新的状态。

你必须付费加入我的知识星球,为有效知识付费是对作者最好的回报。

二维码见下方 或者 右侧边栏。