Kubernetes服务定时伸

Kubernetes服务定时伸缩

文章目录

  • Kubernetes服务定时伸缩
    • 前言
    • 系统设计
      • 扩容服务的管理
      • 工作流程
      • kube-cronhpa-controller部署
        • 1. 安装CRD
        • 2. 安装RBAC授权
        • 3. 部署`kubernetes-cronhpa-controller`
        • 4. 验证`kubernetes-cronhpa-controller`安装状态
    • 功能介绍
    • 遇到的问题
      • 扩容的node存在污点无法flannel等插件
      • kube-cronhpa-controller时区不统一
    • 结束

前言

容器技术的发展让软件的交付和运维更加标注化,轻量化,自动化.这使得动态调整负载的容其数量成为一件非常简单的事情,在kubernetes中,只需要修改对应的replcas数目即可完成,对应到我们的paas平台上我们只改变手动伸缩进行调整也可以改变所需容器组数量即可

当负载的容量调整变得如此简单后,我们再回过头来看下应用的资源画像。对于大部分互联 的在线应用而言,负载的峰谷分布是存在一定规律的。下图是paas平台中语音识别的敷在曲线,通过观察不难发现峰值的周期是每天早上6点开始持续两个小时,再到晚上九点开始持续两个小时

工作资源池与伸缩资源池是两个不可见的空间,并且后者的node全部带有污点:

  • 工作资源池:原有的资源池,用来提供服务部署,伸缩等;
  • 伸缩资源池:用来部署定时扩容出来的服务.

当某一个服务需要扩容时会对当给前的deployment进行copy并且添加特有的容忍和亲和性,当到达指定的扩容时间deployment所管理的pod就会在伸缩资源池进行启动.

下面的yaml配置截取自

目前我们处理伸缩的资源是利用阿里云的autoscale技术实现的,目前大部分云服务提供商都支持k8snode级别的弹性伸缩,通过这种方式可以更大程度的降低我们机器的付费成本.

扩容服务的管理

在扩容之后的服务管理方面会通过监听cronhpa规则的变化以及父deployment的变化进行更新

上图的工作流程需要注意,在copy新的deployment的同时会出发autoscale,所以需要提前将云服务商提供的autoscale功能配置好

当新创建的deployment检测到资源不足是回去检查自身的亲和度以及容忍是否符合伸缩组的配置,如果符合就会将新创建的机器弹出,如果不符合则无法完成扩容,这时就需要我们根据当前的需要扩容的pod的affinity配置新的伸缩组.

kube-cronhpa-controller部署

是基于CRD的方式开发的controller,使用的方式非常简单,整体的使用习惯也尽可能的和HPA保持一致。代码仓库地址

1. 安装CRD

2. 安装RBAC授权

3. 部署

4. 验证安装状态

功能介绍

弹性伸缩自身是不限制伸缩次数以及伸缩时间的,在开源版本的文档中也给出了配置的示例,具体的调度时间可以按照如下给出的规则自定义填写.

但是实际的使用场景其实并不需要很多复杂的规则,过度的开放功能反而会给用户带来选择的烦恼,所以在paas平台中我们直接将其抽象成了如下的形式

遇到的问题

扩容的node存在污点无法flannel等插件

上文讲到所有新增的机器为了和原有的节点隔离需要包含cronhpa=paas污点,但是对于flannel等基础插件同样会因为污点的存在导致无法部署,最终使新增的node一直处于nodeReady状态,为了解决这个问题,需要修改flannel的DaemonSet在yaml中添加对应污点的容忍,或者是直接添加统配的容忍

DaemonSet的部署策略提供了两种选择,一种是OnDelete,即只有手工删除了DaemonSet创建的Pod副本,新的Pod副本才回被创建出来,如果不设置updateStrategy的值,则在Kubernetes1.6之后的版本中会被默认设置为RollingUpdate,所谓的RollingUpdate就是滚动升级

通过观察flannel的DaemonSet的升级方式是OnDelete所以在对其进行更新操作的时候并不会影响其他node的flannel,直接修改DaemonSet即可

kube-cronhpa-controller时区不统一

cronhpa作为一个定时伸缩的组件那自然就会用到时间,如果kube-cronhpa-controller容器内部的时区和主机或者是当前所在的时区不同意就会造成无法在指定时间进行伸缩的情况,官方github上提供的源码并没有指定时区为了解决这个问题,我们在部署镜像的时候需要在yaml中手动指定时区:

指定时区之后更新kube-cronhpa-controller进入容器查看时间

时间与当前时区同步即可

结束

paas平台服务定时扩容的功能介绍到这里基本就结束了,由于篇幅问题很多细节的问题没有详细介绍,有疑问的老师可以在下方评论区直接提问.

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树服务 格(istio)ServiceMesh介绍8826 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年11月20日
下一篇 2019年11月20日

相关推荐