Skip to main content
 Web开发网 » 编程语言 » Python语言

蚂蚁金服怎样实现K8S集群自动化运维?

2021年11月27日3480百度已收录

“大规模Kubernetes集群”主要体现在几十个Kubernetes集群,十万级别的Kubernetes Worker节点。蚂蚁金服使用Operator的模式去运维Kubernetes集群,能便捷、自动化的管理Kubernetes集群生命周期,做到“Kubernetes as a Service”。

前序知识

1、Kubernetes架构介绍

此章节简单介绍了Kubernetes集群的架构,主要是面向刚学习Kubernetes的同学,对于熟悉Kubernetes的同学,此章节可以跳过。

蚂蚁金服怎样实现K8S集群自动化运维?  Python自动化运维 第1张

如上图,一个Kubernete集群由Master节点和Worker节点组成。

在一个高可用Kubernetes集群下面,Master节点一般为3台,在它们上面需要运行Kubernetes Master组件。Kubernetes Master组件包括etcd、Apsierver、Scheduler和Controller-Manager。每个Master组件一般都是3个实例,以保证它们的高可用。Master节点使用Static Pod方式启动Master组件,即将每个组件的Pod描述文件放入Master节点的指定目录,Kubelet会在启动时将它们读取,并以Static Pod方式启动。

Kubernetes Worker节点为Kubernetes集群提供调度资源和应用运行环境,即所有的Pod(可以理解为应用的一个个最小化部署单元)都运行在Worker节点上。一个Worker节点将Pod运行上去需要一些on-host软件,包括: kubelet、Runtime Service(docker、pouch等实现方案)、CNI插件等。

2、Operator介绍

我们在这里将用很少的篇幅向刚学习Kubernetes的同学介绍一下Operator。如果期望获得更详细的解读,请参考coreos上关于Operator的介绍。

一个Operator实际上是为了解决某个复杂应用在Kubernetes的自动化部署、恢复。有了Operator,用户只需要向Kubernetes Apiserver提交一个CRD Resource(yaml或者JSON,一个CRD Resource其实就是对应一个应用实例,CRD Resource用于描述这个应用实例的配置),Operator就会根据用户的需求去完成这个应用实例的初始化,在应用某个模块发生故障时,Operator也会做出自动恢复功能。Operator是用代码运维应用最好的实践之一。

蚂蚁金服怎样实现K8S集群自动化运维?  Python自动化运维 第2张

比如我们有一个etcd-operator,我们只需要用户根据需求向Kubernetes Apiserer提交如下的CRD Resource,etcd-operator就能初始化完成一个etcd集群:

apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdClustermetadata: name: xxx-etcd-clusterspec: size: 5

其中,上面的Spec.Size=5代表了我们需要一个由5个etcd节点组成的etcd集群。etcd-operator会根据上面的配置,初始化完成etcd集群。相应的,如果你又需要另一个3节点的etcd集群,你只需要提交新的一个Spec.Size=3的CRD Resource即可。

背景在蚂蚁金服,我们面临着需要运维几十个Kubernetes集群,以及十万级别以上的Kubernetes Worker节点的难题。

我们将运维Kubernetes的工作拆分两部分:

我们总结了这两部分运维的难点:

难点1:运维Kubernetes集群Master角色

难点2:运维Kubernetes Worker节点

实现方案在实现方案的选择上,我们使用了Kube-on-Kube-Operator和Node-Operator组合的方式来解决上述的难题:

蚂蚁金服怎样实现K8S集群自动化运维?  Python自动化运维 第3张

“元集群”只用于管理所有“业务集群”所需的Master组件。“业务集群”是真正提供给业务方运行Pod的Kubernetes集群。也就说,在蚂蚁金服我们只有一个“元集群”, 在这个“元集群”中,我们使用Kube-on-Kube-Operator自动化管理了蚂蚁金服所有的“Kubernetes 业务集群”的Master组件。

当然,“元集群”也会部署Node-Operator,用于“元集群”Worker节点的上下线,“元集群”的Worker节点也是各个“业务集群”的Master节点。

1、Kube-on-Kube-Operator

Kube-on-Kube-Operator用于Watch Cluster CRD Resource的变更,将“Cluster”所描述表示的Kubernetes业务集群的所有Master组件达到最终状态。如下图,是“元集群”和它所管理的两个“Kubernetes 业务集群”的最终状态:

蚂蚁金服怎样实现K8S集群自动化运维?  Python自动化运维 第4张

Cluster CRD的定义包含如下一些信息:

一个业务集群的Master组件部署实际是元集群中的一系列Resource组成,即包括Deployment、Secret、Pod、PVC等组合使用。各Master组件所需要的部署Resource如下:

Kube-on-Kube-Operator除了能够部署上述的Master组件之外,还能维护任何扩展组件,如kube-proxy、kube-dns等。只需要用户提供扩展组件部署模板和扩展插件版本,Kube-on-Kube-Operator能渲染出部署Resource,并保持这些部署Resource到最终态。由于篇幅原因,我们这里不再赘述。

2、Node-Operator

Node-Operator用于Watch Machine CRD Resource的变更,将“Machine”所描述表示的Worker节点上的on-host软件(docker、kubelet、cni)达到最终态,最终能让“Machine”所对应的“Node”在Kubernetes集群中达到“Ready”状态。架构图如下:

蚂蚁金服怎样实现K8S集群自动化运维?  Python自动化运维 第5张

Machine CRD的定义包含如下一些信息:

Node-Operator用Watch Machine对应Node的状态,当发生一些能处理的Condition(比如kubelet运行中进程消失了)时,Node-Operator会做出恢复处理;Node-Operator会Watch ClusterPackageVersion CRD的变更,这个CRD表示整个Kubernetes集群kubelet、docker等组件的默认版本,Node-Operator会根据ClusterPackageVersion描述的信息,控制各个节点的kubelet、docker等组件的版本;Node-Operator还支持控制某些组件灰度发布到某些节点中,用户只要提交描述这个灰度发布的CRD到Apiserver,Node-Operator会有序的执行灰度发布,并将发布状态反馈到CRD中。由于篇幅原因,我们不再赘述。

写在最后在运维大规模Kubernetes集群的实践中,我们摈弃了传统的模式,使用了Operator模式和面向Apiserver编程。Kubernetes集群的上下线、升级实现了“Kubernetes as a Service”,就像向云厂商买一个服务一样简单。而Worker节点的运维,使用Operator模式能够让我们统一管理元数据,自动化初始化、恢复Worker节点所需组件。

评论列表暂无评论
发表评论
微信