上期我们提到,有了Kubernetes,开发/运维工程师可以利用Kubernetes的编排能力,定义deamonset, statefulset或deployment等类型的工作负载,来实现应用的快速部署。
以deployment为例,它可以让系统中保持一定的容器实例运行数量,如果某个容器实例由于各种原因被杀掉,只要系统中还有足够的资源用于拉起容器,kubernetes的scheduler就会拉起新的容器来顶替它。由于容器拉起的速度大大高于虚拟机,基于容器部署的系统可用性更高,性能也更稳定。
然而,对于访问量突增的场景,当运维管理员收到告警信息时,手工拉起一批容器的时候,往往突增的业务高峰已经过去,用户已经感知到了系统容量不足 (如前端nginx返回http 503等错误码)。
因此,kubernetes引入了一个特性:Autoscaling (弹性伸缩)。
与我们在《虚拟化与云计算硬核技术内幕(29) —— 健康码与孙大圣(下)》中提到过的虚拟机的弹性伸缩类似地,容器也可以基于Pod的运行状态,实现弹性伸缩。
Pod的弹性伸缩有两种方式:
无论是HPA还是VPA,都会依赖于容器集群的性能监控功能作为弹性伸缩的输入。
让我们回顾这张图:
图中,假设该系统(system)为一个线性时不变系统(不理解这个术语的同学,自己看《工程控制论》去),其output,原本由Input一个因素决定。在闭环自动控制系统中,对output进行采样(sampling),经过传感器(sensor)后的反馈量(feedback)与参考量(reference)进行减法计算后,得到系统偏差Error。系统偏差经过Controller的计算(如著名的PID算法)得到系统输入Input。由于Controller可以通过PID一类算法自动调节Input,即使存在扰动(Perturbation),最终的Output也是基本恒定的。
让我们把控制论中上述的这些概念应用到分布式系统中,我们可以发现,性能监控系统实际上相当于这张图中的sensor,是构成闭环反馈的关键。
在Kubernetes中,最初的HPA V1只能监控CPU利用率和内存利用率来进行Pod的伸缩。显然,CPU利用率和内存利用率并不能准确反映系统负载的真实水平。因此,我们还需要更好的性能监控器,作为sensor来更精准全面地监控系统的载荷。
在Kubernetes 1.7中,引入了Metrics Aggregator,允许利用第三方性能监控器作为sensor,如下图中的Prometheus:
Prometheus 实际上是一个包括监控客户端(性能埋点)、采集器、时序数据库(TSDB,可以通过PromQL查询)和告警器(可适配各种第三方告警方式)的一个强大的性能监控套件。它为Kubernetes的弹性伸缩提供的Prometheus Adapter,实际上也是通过PromQL对Promtheus的时序数据库进行查询,并将数据以metrics的方式上报给Kubernetes的HPA控制器。
从图中我们可以看到,基于Kubernetes强大的功能,我们不仅限于可以监控到Pod的CPU和RAM占用率这种基础的指标,还可以监控更多复杂的指标,从而让Kubernete上部署的应用性能稳定的同时,还可以适应应用负载的突增。
今日份故事:
Prometheus (普罗米修斯)在古希腊神话中,象征着革命者。普罗米修斯与智慧女神雅典娜 (Athana)共同创造了人类,并从太阳车中盗取了来自天国的火种,为人间提供高效的能源利用方式,从而被宙斯惩罚,承受日复一日的被秃鹫啄食肝脏的痛苦,直至火神赫拉克勒斯射死秃鹫,砸碎锁链救出普罗米修斯。
据考证,普罗米修斯的故事实际发生于公元前1200年前后,也就是我国的商朝后期。约3000年以后,美国政治家和科学家富兰克林继承普罗米修斯的遗志,开启了对电能的利用,也让人类文明翻开了新的一页。
然而,电能的利用,在垄断资本及其鹰犬政客手中,也成为了维护黑暗统治的工具,直至第一次世界大战爆发。
一战以后,欧洲大地遍地创伤,苏联的列宁喊出了“社会主义就是苏维埃加电气化”的口号。在第聂伯河的岸边,在里海的沿岸,在巴库的油田,奥斯特洛夫斯基们用自己的血汗建成了第一个社会主义制度下的工业国家。
二战之后,世界进入了冷战时期,冷战时期崛起的工业国家——中华人民共和国,也涌现了一批工业建设中的英雄人物,如这位——
冷战结束之后,世界的工业潮流从电气化演进到了信息化和数字化,也迎来了计算机科学与工程的飞速发展。在下一个专题中,我们将带大家走进计算机硬件和软硬件融合的世界。
今天是3月5日,谨以此文纪念雷锋同志,学习雷锋的集体主义精神!