上一期我们提到,kubernetes可以通过ExecAction, TcpSocketAction和HttpGetAction三种动作,来监控一个容器是否存活,是否处于就绪状态可以对外提供服务。
我们还提到另一个话题——容器的弹性伸缩。
让我们回忆起小X学习容器的初心:
由于某晗和某亦凡官宣了恋情,某社交平台的服务器扛不住崩溃了,重构后号称可以支持5个明星同时出轨的流量。
实际上,哪怕是这样一篇“情况通报”,都可以让承载业务的VM或容器的CPU占比超过警戒线。
这就需要Kubernetes的一个重要功能——弹性伸缩。
学过自动控制的同学,都知道这么一张图:
以特某拉的定速巡航功能为例,当车辆上坡时,电机的电流增加,转速下降,监控系统监控到这一点,提升给电机供电的有效电压 (实际上是占空比duty cycle,方老师是学自动化出身,学过电力拖动课的同学不要在这杠),从而让电机输出更大的功率,能够支撑车辆克服空气阻力的同时,还能以同样的速度爬坡。
同样地,当某晗和吴某凡宣布两个人在一起的时候,渣浪提供服务的container的CPU使用率会提升。此时,kubernetes检测到这一现象,分配更多的pod,分担业务访问,直到发生5名明星出轨到达规格上限,流量过大被迫熔断。
学过自动化的同学可能知道,检测电机电压和电流的手段是传感器。那么,有没有一种传感器可以安装在容器集群中,检测每个容器的工作状态呢?
答案是肯定的:
这就是容器性能监控的盗火者——Prometheus。
当然,我们需要在开发应用时,考虑到弹性伸缩,在性能关键埋点调用Prometheus的库函数方便调用。
以JAVA为例,https://github.com/prometheus/client_java 这个地方可以看到详细的使用文档。当然,除了JAVA以外,Prometheus还提供了python、go、ruby、Node.js等多种语言可以使用的SDK库。
Prometheus能监控CPU利用率、应用延迟、网络带宽等关键参数,将应用的性能数据(metrics)记录在一个时间序列数据库(TSDB)中。
但是,Prometheus采集的数据,Kubernetes并不能正确地接管处理,中间还需要一个胶合层,或者说,适配层,它的名字叫k8s-prometheus-adpater,可以将Prometheus采集的性能数据传递给kubernetes的容器调度模块HPA(Horizontal Pod Autoscaler)。
如果将prometheus比作传感器,那么,HPA就是自动控制系统的控制器。它能够根据用户定制的策略,驱动kubelet执行容器的伸缩。这样,我们就得到了下面这张图:
再让我们对比开头的图:
我们可以看出,控制器 = HPA,被控对象 = Pod,测量装置 = Prometheus。
给定量是HPA的配置,扰动是外界波动的的请求(比如,有5名明星同时出轨),输出量是稳定的客户响应时延。
通过Prometheus和HPA的配合,我们建立在k8s上的系统就能够经受5名明星同时出轨的考验啦!
今天还遗留了一个问题。学过自动控制的同学都知道,控制器的核心是控制算法,如PID(比例,积分和微分)算法。那么,HPA作为Kubernetes弹性伸缩的控制器,它的控制算法是什么样的呢?
请看下期分解。