田奇,腾讯云高级工程师,专注大规模离在线混部,弹性伸缩,云原生成本优化,熟悉Kubernetes,关注云原生大数据、AI。
王孝威,腾讯云容器产品经理,热衷于为客户提供高效的 Kubernetes 使用方式,为客户极致降本增效服务。
随着 Kubernetes 的普及,企业已经普遍接受了容器,正在向云原生演进。但是当前的 Kubernetes 只解决云原生的第一步(Day 1),就是利用容器编排调度和声明式API等,来解决资源获取、应用部署、高可用容灾、基础运维等难题。但是目前采纳 Kubernetes 的企业也遇到了前往高级阶段的问题,运营庞大复杂的 Kubernetes 集群是非常困难的,例如:
以上这些问题都需要在运营 Kubernetes 的第二步(Day 2)来解决:
降低用户的运营复杂度,为 Kubernetes 插上智能引擎,减轻客户的运营负担,是 TKE 一直以来致力的事情。在前几期的“降本增效”系列文章中,我们谈到了成本控制系统、常用的利用率提升工具、资源利用率现象剖析、理解和应用弹性。TKE 在用户需求的基础上,提出容器智能 ProphetPilot,本文将从背景现状、产品功能、分层模型阐述 ProphetPilot 相关概念。
当前 TKE 上有很多关于弹性、资源利用率、成本节约、负载感知调度组件,比如 HPA、HPC、VPA、CA、在离线混部等产品,更多可查看资源利用率提升工具大全。虽然目前 TKE 为客户带来了丰富的降本增效产品选择,但是存在以下几个方面的不足;
下图对比了各个组件之间的联系,主要从 Observer、Analyzer、Action 来说明各个维度的关系:
ProphetPilot 主要解决 Observer 和 Analyzer 两大部分,其功能可贯穿弹性和混部所有组件,针对开源组件无法满足需求的场景,TKE 采用自研 Executor,来满足快速发展的业务需求:
推荐是整个成本管理中心的大脑,它会衡量 Cost(成本) 、 Efficiency(效率,主要指的是资源利用率)、Reliability(可用性、稳定性) 的关系。例如:
成本分析重点在于从成本的角度观察集群的成本使用情况,因为现有的 Kubernetes 集群中,只能看到资源的使用情况,而无法分析和观察更具体的成本维度的数据。主要功能点包含:
不管是否自动执行策略,在 ProphetPilot 发现集群中某些配置不合理,或某些动作需要执行时,都会提供相关的提示和告警。此外,每一次策略推荐,动作执行,都会进行数据保存,方便用户查看历史事件,以及事件触发的原因,方便进行历史回溯。
策略是推荐中心推荐的方案执行的方式,ProphetPilot 将提供多种策略,主要分成四种类型:
执行引擎就是执行的具体动作,例如 HPA、VPA、在离线混部等动作,更多可查看:资源利用率提升工具大全。
随着云原生、微服务架构的普及,一套企业应用往往涉及到多个微服务,服务之间存在微妙的依赖关系,理解应用的微服务之间的关系,可以让弹性伸缩拥有更加全面的视角,防止单一的局部视角,导致扩容了 Workload 也没有达到真实的效果,从而浪费了资源和成本。
比如下图中,传统的弹性伸缩往往只根据资源使用率,当 CPU 使用率很高的时候,触发该 Workload 的扩容,但是 CPU 使用率高,可能只是假象,在下述列子中,NGINX 日志写的速率,Kafka 生产者写入 Kafka 集群的速率,日志偏移更改速率,消费速率,以及 ES 索引计算效率都有关联性;找到更关键的指标比如 Kafka 的生产速率就是比 CPU 更好的扩缩容指标:
ProphetPilot 理解应用层不同的应用特征,市面上的这些中间件、数据库等基础产品都可以作为应用划分,而服务本身也可以根据重要程度,为应用划分出不同的等级,微服务之间的调用关系,则可以通过 ServiceMesh 进行获取,从而在应用层建立起 Workload 的相关性依赖图,做到业务的整体扩缩,而不是 Workload 的单独扩缩。
当前的 Kubernetes 只解决企业云原生的第一步(Day 1),让企业能够利用容器以及 Kubernetes 编排调度,来解决资源获取、应用部署、高可用容灾、运维等难题,但是它在资源模型上,还处在初级阶段,比如研发需要评估服务到底需要多少资源,然后填写 Request,最终 Kubernetes 按照 Request 做静态资源调度,将 Pod 调度到合适的Node 上。
这样做将面临以下问题:
当前的普遍做法是做超售,一般是两个维度:
而要解决这个问题,根本原因就在于当前的体系是按照 静态资源调度,而非动态资源调度,如果我们按照容器的 Usage(可以加上一定的缓冲区间) 资源去调度,而不是按照容器的 Request 资源去调度,那么我们就能做到真实的按量付费,就是真实的 Serverless 所宣称的按量计费。
ProphetPilot 会统一进行数据计算,准确推荐出容器的资源消耗,并给出合适的资源配置建议;让容器的 Request 逼近 Usage,从而让调度器按照 Usage 调度资源。
容器在单机层面,会根据分配的资源 Request 和 Limit 来做资源分配调度和资源隔离,虽然可以在一定程度上做到资源的隔离,做到资源的共享和复用,但是 Kubernetes 提供的这个资源模型目前还是比较基础和简单的模型;
Kubernetes 直接使用 Request 来调度,对 Node 进行装箱,在单机层面,Linux 采用 Cgroup 的 CPU Share 模式来为容器分配 CPU 资源,按照 CPU Share 权重划分 CPU 时间片,如果将一个 Node 按照 Request 装满,则 Node 的 CPU 资源将按照 CPU Share 加权划分给所有的容器;看起来是一个完美的计算模型,但是其实内核并不能完美的处理所有场景下的资源争抢。
比如,在离线混部场景下,离线业务利用多核并行计算提高计算资源利用率,若没有进行独占绑核划分,此时在线业务如果有流量高峰,就会受到离线业务的干扰,从而影响在线业务的SLA;内核层解决这个问题,需要非常雄厚的技术实力,往往还是得进行应用优先级划分,进行取舍,才能让资源利用率提升的同时,高优保证高优先级应用,而丢弃低优先级应用,所以,划分应用优先级,或许是未来的方向,这个不仅仅是应用层,从应用层,到 Kubernetes,再到内核层,这个体系需要疏通,当前的 Kubernetes 使用的默认优先级只有三种,未来可能会支持更多优先级。
(图片来源 https://mp.weixin.qq.com/s/Cbck85WmivAW0mtMYdeEIw)
ProphetPilot 允许用户定义多种负载优先级,从而能够针对不同优先级应用采取不同的服务保证;值得注意的是,过多的优先级,会导致 容器驱逐产生级联效应,所谓级联效应是指,一个容器因为在当前节点资源不足被驱逐,然后被调度到另一个节点,结果导致另一个节点上更低优先级的 Pod 被驱逐,要避免这种情况,ProphetPilot 将采取弹性实例,从而防止级联驱逐发生。
同时,有些客户希望在离线混部的时候,离线应用不能无限制被驱逐,要求离线应用必须有一定的 SLA,保证其在规定时间内跑完,对于这种需求,我们采用动态优先级调度和弹性实例结合的方式,在离线 Pod 被第一次驱逐后,就会考虑其驱逐次数和计算时间,如果计算发现继续驱逐的话,无法保障 SLA,则进行优先级提高调度,如果还是没有资源,则进行弹性公有云实例。
在云计算普及的今天,云厂商提供了一系列可供选择的 IaaS 计算资源、存储资源、网络资源,比如就腾讯云的CVM来说,就有几百种产品规格,智能容器模型在资源层应该选择出最适合的 IaaS 资源,从而保证容器能够稳定、高效、最低成本的方式运行。
腾讯云云服务器提供了按量付费、预付费、竞价实例三种计费模式,不同的计费模式有不同的使用场景;ProphetPilot 能够分析客户集群历史的实例计费模式,结合集群资源的未来走势和用户对于成本的诉求,推荐不同的计费实例;
机型主要是CPU、内存、磁盘等配置,包括硬件型号以及规格大小,ProphetPilot 通过评估集群节点资源,以及业务规模,未来增长趋势,在满足业务资源需求的前提下,通过搜索不同机型配置和价格空间,最后推荐出合理的机型配比;
云的当前演进模式是 混合云,而客户 IDC 和 公有云的弹性资源拉通,评估 IDC 资源是否充足,是否需要开启弹性到公有云,以及弹出何种 IaaS 资源实例,是企业目前的难题,当前的模式往往还是传统的提前按规划批量采购模式,企业一部分资源是 IDC,一部分资源在公有云,还是存在资源闲置问题;打通混合云网络后,企业将能够实现真实的随时按需弹性。
总之,在资源层面,ProphetPilot 会分析用户集群的节点规格分布,资源使用效率,最终推荐客户最合适的计费模式、节点规格配置。
Kubernetes 集群资源利用率低的本质是 Request 机制,即资源的预留和占位机制。业务为了保证自己服务的稳定性,通常习惯申请较大的 Request,势必会造成较大的资源浪费。如果能按照 Usage 来调度资源、调整负载,甚至是按照 Usage 来付费,做到真正的按需使用,这是成本管理终极形态,也是 ProphetPilot 的目标状态,让业务无需管理和配置任何资源的同时,保障服务的稳定性,实现“用完即走,随用随取”。
如果您有任何建议或诉求,欢迎通过小助手与我们联系。
往期精选推荐