Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统 (2)

● 竞价实例在被系统回收前的2-5分钟(不同云服务商配置的时间不一致),都会发出回收信号、或者以虚拟机元数据信息的方式体现出来 ,TKE 基于云原生的优雅终止以及 Workload Controller 维持应用期望状态的特性,有效降低了回收的风险,在感知回收信号后,可以优雅终止竞价实例上运行的应用副本,同时自动创建新的副本来满足业务期望状态。

● TKE将维持期望状态的能力从应用层扩展到了资源层,用户无需关心资源购买过程,只需定义期望资源的状态(规格、可用区、计费类型)等,spot-controller 会自动供应资源直至满足客户期望。

成本控制系统概述

Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统


上图是整个成本控制系统的架构图。

在介绍系统各组件前,先提一下位于架构图最下面的资源池这一层,其中最主要的一种资源是竞价实例(Spot),各个主流云厂商都有提供,所谓竞价实例(Spot)。

竞价实例是用户可以直接购买的, 而碎片资源,则是指一些长期闲置的资源碎片,由于规格原因一直未被申请到,这些资源往往需要具有IaaS层操作权限,所以比较适合云厂商来使用,作为普通用户,使用竞价实例池即可。

整个系统由三部分组成,tke-spot-agent、cost-wehbhook+ cost-scheduler,以及 spot controller,这三部分是完全松耦合的,比如部分业务在前期只使用了 tke-spot-agent.

● the-spot-agent 以 deamonset 的方式运行在每台 Node 节点,用于监听竞价实例的回收信号,从而实将节点Disable以禁止调度新的 POD,优雅驱逐 POD 等。

● cost-webhook+cost-scheduler 是中心化的,每个集群只需部署一套,用于拦截用户请求,将用户请求通过自定义调度器调度,满足指定比例的 Pod 被调度到竞价实例。

● spot-controller 也是中心化的,每个集群一套,用于处理用户配置的CRD资源,调用云厂商提供的购买机器的云API进行机型的购买,用户得以按照一个简单的描述文件声明集群所需竞价实例的配比,从而控制成本。

通过以上三个组件,分别实现了竞价实例被回收前的优雅处理、用户对不同业务场景下将Pod按比例调度到竞价实例上的成本感知调度、对用户的成本声明进行协调控制。

tke-spot-agent - 业务的优雅终止以及平滑迁移

上文提到,竞价实例在被系统会收前的2-5分钟(不同云服务商配置的时间不一致),都会发出回收信号、或者以虚拟机元数据信息的方式体现出来,针对这个云厂商普遍存在的友好预警机制,我们可以提供一种守护服务,时刻监听这个来自IaaS层的预警信息,提前做一些处理,将业务应用容器无损的迁移到其他虚拟机上。
从架构上来讲,这种守护服务,最优的方式是以中心化的形式运行在集群中,也就是一个 Kubernetes 集群只需运行一个这样的 Pod,最多通过选举机制启动一个standby 容器做高可用,然而这样的前提是,Iaas 层的预警机制能够以统一的消息发送过来,目前各大云厂商也只有极少数提供了这样的发生消息的机制,只是在虚拟机元数据信息中做了体现,而且该信息只能在虚拟机的节点上查询,考虑到当前阶段的普遍适用性,我们目前将该服务以 Kubernetes daemonsets 的方式部署在每一台spot机型上。

云厂商虚拟机的元数据信息,可以在虚拟机上以HTTP的方式获取,该守护服务启动后,不断的监听该spot虚拟机的元数据信息,当发现回收信息后,首先调用Kubernetes API将该虚拟机的调度状态设置为不可调度,防止新的Pod被调度到这台即将被回收的虚拟机上。紧接着,守护服务通过Kubernetes API获取到当前节点上所有的Pod,对这些Pod发起驱逐命令,Kubernetes为每个Pod配置了默认优雅退出时间,这个值是30s,有些业务应用的场景可能在30秒内难以处理完手头的事情,守护服务在向Kubernetes API server发起请求时,可以携带一个叫做DeleteOptions的Kubernetes资源属性,可以将优雅退出的时间进行用户自定义,当然,这个时间,设置为大于IaaS层对Spot虚拟机回收时间(2-5分钟)就没有意义了,Pod还没有优雅退出,虚拟机可能就已经被回收了。

这里需要额外提到的是,业务应用如何感知到spot实例即将被回收呢?这就要从Kubernetes的设计说起,Kubelet在真正删除Pod之前,会在Pod上设置一个删除标记的起始时间,表示这个时刻收到了删除该Pod的请求,并会给Pod的容器进程发送一个SIGTerm信号,告诉业务进程该Pod即将被删除,而业务进程要做的,就是实现一行代码,去监听这个信号,这也算是云原生应用的基本要求了,对于云原生应用而言,云资源是不稳定的。

cost webhook + cost scheduler - 灵活的业务调度形式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwfwy.html