课程目标:
1.了解工作负载更新和回滚机制
2.了解应用探针健康检查机制
3.了解应用弹性伸缩原理
目录:
1.工作负载更新和回滚机制详解
2.应用探针健康检查机制详解
3.应用弹性伸缩原理详解
之前的课程,我们了解了应用在K8S中的基本类型和概念,包括无状态工作负载(deployment) 、有状态工作负载(StatefulSet)等。
本次课程将会带领大家深入理解应用在k8s生产环境的最佳实践,包括应用更新与回滚,应用健康检查,弹性伸缩等特性。
1.工作负载更新和回滚机制详解
无状态工作负载(deployment)更新
Deployment可以设置不同的更新策略,有如下两种:
1.Recreate:停止所有旧版本然后部署新版本(最好只在开发环境使用)
2.RollingUpdate:滚动升级,即逐步创建新Pod再删除l旧Pod,为默认策略。
Deployment可以通过maxSurge和maxUnavailable两个参数控制升级过程中重新创建Pod的比例:
maxSurge: 与Deployment中spec.replicas相比,可以有多少个Pod存在,默认值是25%,比如spec.replicas为4,那升级过程中就不能超过5个Pod存在,即按1个的步伐升级。
maxUnavailable: 与Deployment中spec.replicas相比,可以有多少个Pod失效,也就是删除的比例,默认值是25%,比如spec.replicas为4,那升级过程中就至少有3个Pod存在,即删除Pod的步伐是1。
无状态工作负载(deployment)回滚
在更新出问题之后,可能需要对应用进行回滚。k8s支持根据deployment的历史版本进行回滚
有状态工作负载(StatefulSet)更新
StatefulSet可以设置不同的更新策略,有如下两种:
OnDelete:用户必须手动删除Pod以便让控制器创建新的Pod
RollingUpdate:滚动更新过程也跟Deployment大致相同,区别在于:
滚动更新的过程是有序的(逆序),index从N-1到0逐个依次进行,并且下一个Pod创建必须是前一个Pod Ready为前提,下一个Pod删除必须是前一个Pod shutdown并完全删除为前提。
支持部分实例滚动更新,部分不更新,通过.spec.updateStrategy.rollingUpdate.partition来指定一个index分界点。所有id大于等于partition指定的值的Pods将会进行滚动更新;所有id小于partition指定的值得Pods将保持不变。
有状态工作负载(StatefulSet)回滚
statefulset和deployment 一样也支持回滚操作,statefulset也保存了历史版本,和deployment一样利用.spec.revisionHistoryLimit字段设置保存多少个历史版本。
提示:因为statefulset 的使用对象是有状态服务,大部分有状态副本集都会用到持久存储,statefulset下的每个pod正常情况下都会关联一个pv对象,对 statefulset对象回滚非常容易,但其使用的pv中保存的数据无法回滚,所以在生产环境中进行回滚时需要谨慎操作。
2.应用探针健康检查机制详解
容器健康检查
liveness probe (工作负载存活探针)︰指示容器是否正在运行。如果存活态探测失败,则 kubelet会杀死容器,并且容器将根据其重启策略进行重启。如果容器不提供存活探针,则默认状态为Success。
readiness probe (工作负载业务探针)︰用于检查用户业务是否就绪,如果未就绪,则不转发流量到当前实例。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。
探针检查机制:
Kubernetes支持如下三种探测机制:
HTTP GET:向容器发送HTTP GET请求,如果Probe收到2xx或3xx,说明容器是健康的。
TCP Socket:尝试与容器指定端口建立TCP连接,如果连接成功建立,说明容器是健康的。
Exec: Probe执行容器中的命令并检查命令退出的状态码,如果状态码为0则说明容器是健康的。
延时时间 (initialDelaySeconds ) :延迟检查时间,单位为秒,此设置与业务程序正常启动时间相关。例如,设置为30,表明容器启动后30秒才开始健康检查,该时间是预留给业务程序启动的时间。
超时时间( periodSeconds ):例如,设置为10,表明执行健康检查的超时等待时间为10秒,如果超过这个时间,本次健康检查就被视为失败。若设置为0或不设置,默认超时等待时间为1秒。
3.应用弹性伸缩原理详解
弹性伸缩概述
弹性伸缩是根据业务需求和策略,经济地自动调整弹性计算资源的管理服务。
弹性伸缩能力分为如下两个维度:
工作负载弹性伸缩:即调度层弹性,主要是负责修改负载的调度容量变化。例如,HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。
节点弹性伸缩:即资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或CCI等资源的方式进行调度容量的补充。CCE容器实例弹性到CCI服务的方法请参见CCE容器实例弹性伸缩到CCI服务。
两个维度的弹性组件与能力可以分开使用,也可以结合在一起使用。
AutoScaler节点伸缩原理解析
Autoscaler是Kubernetes提供的集群节点弹性伸缩组件,根据Pod调度状态及资源使用情况对集群的节点进行自动扩容缩容。
Autoscaler(简称CA)的主要流程包括两部分:
ScaleUp流程:CA会每隔15s检查一次所有不可调度的Pod,根据用户设置的策略,选择出一个符合要求的节点组进行扩容。
ScaleDown流程:CA每隔10s会扫描一次所有的Node,如果该Node上所有的Pod Requests少于用户定义的缩容百分比时,CA会模拟将该节点上的Pod是否能迁移到其他节点,如果可以的话,当满足不被需要的时间窗以后,该节点就会被移除。
HPA工作负载伸缩原理解析
HPA(Horizontal Pod Autoscaler)是用来控制Pod水平伸缩的控制器,HPA周期性检查Pod的度量数据,计算满足HPA资源所配置的目标数值所需的副本数量,进而调整目标资源(如Deployment)的replicas字段。想要做到自动弹性伸缩,先决条件就是能感知到各种运行数据,例如集群节点Pod、容器的CPU、内存使用率等等。而这些数据的监控能力Kubernetes也没有自己实现,而是通过其他项目来扩展Kubernetes的能力,CCE提供如下两个插件来实现该能力:
Prometheus是一套开源的系统监控报警框架,能够采集丰富的Metrics(度量数据),目前已经基本是Kubernetes的标准监控方案。Metrics Server是Kubernetes集群范围资源使用数据的聚合器。
Metrics Server从kubelet公开的Summary API中采集度量数据,能够收集包括了Pod、Node、容器、Service等主要Kubernetes核心资源的度量数据,且对外提供一套标准的API。
使用HPA(Horizontal Pod Autoscaler)配合Metrics Server可以实现基于CPU和内存的自动弹性伸缩,再配合Prometheus还可以实现自定义监控指标的自动弹性伸缩。
使用HPA+CA实现工作负载和节点联动弹性伸缩
弹性伸缩最主要的就是使用HPA (Horizontal Pod Autoscaling)和CA (Cluster AutoScaling)两种弹性伸缩策略,HPA负责工作负载弹性伸缩,也就是应用层面的弹性伸缩,CA负责节点弹性伸缩,也就是资源层面的弹性伸缩。
通常情况下,两者需要配合使用,因为HPA需要集群有足够的资源才能扩容成功,当集群资源不够时需要CA扩容节点,使得集群有足够资源;而当HPA缩容后集群会有大量空余资源,这时需要CA缩容节点释放资源,才不至于造成浪费。
创建HPA示例
可以看到,TARGETS的期望值是70%。而实际是0%,这就意味着HPA会做出缩容动作,期望副本数量=(0+0+0+0)/70=0,但是由于最小副本数为1,所以Pod数量会调整为1。等待一段时间。可以看到Pod数量变为1
查看HPA详情。可以在Events里面看到这样一条记录。这表示HPA在21秒前成功的执行了缩容动作。新的Pod数量为1,原因是所有度量数量都比目标值低。
本课总结:
liveness probe:工作负载存活探针,指示容器是否正在运行。如果存活态探测失败,则 kubelet会杀死容器,并且容器将根据其重启策略进行重启。如果容器不提供存活探针,则默认状态为Success。
readiness probe:工作负载业务探针,指示容器是否准备好为请求提供服务。只有当Pod中的容器都处于就绪状态时kubelet才会认定该Pod处于就绪状态。该信号的作用是控制哪些Pod应该作为service的后端。如果Pod处于非就绪状态,那么它们将会被从service的load balancer中移除。
Cluster AutoScaler:简称CA,Autoscaler是Kubernetes提供的集群节点弹性伸缩组件,根据Pod调度状态及资源使用情况对集群的节点进行自动扩容缩容。
Horizontal Pod Autoscaler:简称HPA,是用来控制Pod水平伸缩的控制器,HPA周期性检查Pod的度量数据,计算满足HPA资源所配置的目标数值所需的副本数量,进而调整目标资源(如Deployment)的replicas字段。
参考链接:
相关内容的华为云官网链接:
https://support.huaweicloud.com/usermanual-cce/cce_01_0279.html
https://support.huaweicloud.com/usermanual-cce/cce_01_0006.html
Kubernetes官方文档: https://kubernetes.io/zh/docs/concepts/workloads/
CCE云容器引擎官方首页: https://www.huaweicloud.com/product/cce.html