深度 | 蚂蚁金服自动化运维大规模 Kubernetes 集群的实践之路

简介: 此文章分享了蚂蚁金服如何自动化运维大规模 Kubernetes 集群的实践干货。"大规模 Kubernetes 集群"主要体现在几十个 Kubernetes 集群,十万级别的 Kubernetes Worker 节点。

导读

此文章分享了蚂蚁金服如何自动化运维大规模 Kubernetes 集群的实践干货。

"大规模 Kubernetes 集群"主要体现在几十个 Kubernetes 集群,十万级别的 Kubernetes Worker 节点。

蚂蚁金服使用 Operator 的模式去运维 Kubernetes 集群,能便捷、自动化的管理 Kubernetes 集群生命周期,做到 " Kubernetes as a Service " 。

此文适合 Kubernetes 爱好者,Kubernetes 架构师,以及 PE/SRE 阅读。

前序知识

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

image.png

如上图,一个 Kubernetes 集群由 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 插件等。

Operator 介绍

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

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

image.png

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

apiVersion: etcd.database.coreos.com/v1beta2
kind: EtcdCluster
metadata:
  name: xxx-etcd-cluster
spec:
  size: 5

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

背景

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

我们将运维 Kubernetes 的工作拆分两部分,一部分是运维 Kubernetes 集群的 Master 组件(etcd, Apiserver, controller-manager, scheduler等),一部分是运维 Kubernetes Worker 节点。我们总结了这两部分运维的难点。

难点1:运维 Kubernetes 集群 Master 角色
如何快速新建、下线一个 Kubernetes 集群 (初始化、删除 Master 角色)。由于蚂蚁业务的快速增长,我们随时面临着需要在新机房新建、下线一个 Kubernetes集群;CI 和测试也有快速新建、删除一个 Kubernetes 集群的需求。

如何管理几十个 Kubernetes 集群 Master 组件版本。比如我们需要升级某几个Kubernetes 集群的 Apiserver,Scheduler 等组件。

如何自动化处理几十个 Kubernetes 集群 Master 组件发生的故障。

如何能获取几十个 Kubernetes 集群 Master 组件的统一视图。我们希望有一个统一的接口,一下就能获取每个 Kubernetes 集群 Master 角色的版本、状态等信息。

难点2:运维 Kubernetes Worker 节点
如何快速上线、下线 Kubernetes Worker 节点。上线时,我们需要保证 Kubernetes Worker 节点所需要的on-host软件版本、配置正确。

如何升级十万级别的 Kubernetes Worker 节点上的 on-host 软件。如我们需要将所有Work节点的 docker、cni 版本升级到某个版本。

如何优雅的执行灰度发布 Kubernetes Worker 节点上的软件包。在 on-host 软件新版本上线前,我们需要对它做小范围的灰度发布,即挑选 N 台 Worker 节点发布新版本软件包,执行验证,最后根据验证结果决定是否全规模的发布新版本,或者回滚这个灰度发布。

如果自动化处理十万级别的 Kubernetes Worker 节点可能出现的 on-host 软件故障。比如 dockerkubelet 发生 panic,我们是否能自动化得处理。

实现方案

在蚂蚁,我们使用 Kube-on-Kube-Operator 和 Node-Operator 组合使用解决上述的难题。

首先,我们需要借助工具,使用Kubernetes官方提供的方案( Static Pod 方式)部署“ Kubernetes 元集群”(后面简称元集群)到 “元集群”的 Master 节点上。

然后,我们将 Kube-on-Kube-Operator 部署到 “ Kubernetes 元集群”。我们将一个 Kubernetes 集群所需的一系列 Master 组件当成一个复杂的应用。当我们需要一个“ Kubernetes 业务集群”(后面简称业务集群),我们只需要向元集群 Apiserver 提交用于描述“ Kubernetes 业务集群”的 Cluster CRD Resource (下文会介绍我们如何设计 CRD 结构),Kube-on-Kube-Operator 就为我们准备好了一个可以工作的“Kubernetes 业务集群”("业务集群" Master 组件都已经Ready,需要扩容 Worker 节点)。

之后我们在“ Kubernetes 业务集群”上,部署上 Node-Operator。Node-Operator 负责 Worker 节点的生命周期。当我们需要扩容一个 Worker 节点,我们只需要提交描述 Worker 节点的元数据( IP, Hostname, 机器运维登录方式等)的 Machine CRD Resource (下文会介绍我们如何设计 CRD 结构),Node-Operator 就会将 Worker 节点初始化完成,并成功加入到 “ Kubernetes 业务集群” 中。

image.png

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

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

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

image.png

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

业务集群名。

业务集群部署模式: 分为标准生产和最小化。标准生产提供Master组件都是3副本的部署,最小化则都是1个副本的部署。

业务集群 Master 节点 NodeSelector,即表示如何在元集群内如何选择业务集群Master 节点。

业务集群各 Master 组件版本,自定义参数等

业务集群所使用的 etcd 启动配置,主要涉及 etcd data volume 的设置。有ClaimTemplate 和 VolumeSource 两种模式,即使用 ClaimTemplate 模式就使用PVC 来初始化 etcd volume,而使用 VolumeSource 模式,即使用 VolumeSource 所表示的 volume 来挂载 etcd volume。

业务集群 Master 组件证书过期时间: Master 组件所使用 kubeconfig 中的证书都有过期时间,以保证安全性。而 Kube-on-Kube-Operator 会在证书过期时自动完成滚动证书、Master 组件重新加载证书等操作。

业务集群额外用户 kubeconfig:即为 “额外用户”提供的用户名和组名,签出证书,并生成 kubeconfig 保存在元集群 Secret 中供读取。

业务集群状态: 这部分信息不需要用户提交,而是由 Kube-on-Kube-Operator 自动生成,用户反馈这个业务集群的状态,参考 Pod.Status 。

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

Apiserver: 一个 Deployment 即可,因为 Apiserver 是无状态应用,副本数和Cluster CRD 描述的一致即可。除此之外,需要为Apiserver创建两个 Service:

向同个业务集群的其它 Master 组件提供服务的 Service: 建议使用元集群内的 Headless Service。

向 Kubelet、外部组件提供服务的 Service: 建议使用机房 DNS RR Service (需要自己实现 Service Controller )。

etcd: 每个 etcd 实例(标准化部署是 3 个实例,最小化是 1 个实例)都建议单独使用 Pod + PV + PVC + Headless Service 部署。每个etcd 实例的 peer id 为对应的Headless Service 域名。当某个 etcd 实例发生故障时,需要手动删除掉故障对应实例的 Pod,Kube-on-Kube-Operator watch 到 etcd Pod 的减少,会重新建立 Pod,并执行 Remove old member (被删除的 Pod ), Add new member(新建的Pod)操作,但是他们的peer id还是保持一致的。

Controller-Manager: 一个 Deployment 即可,因为 Controller-Manager 是无状态应用。副本数和 Cluster CRD 描述的一致即可。

Scheduler: 一个 Deployment 即可,因为 Scheduler 是无状态应用。副本数和Cluster CRD 描述的一致即可。

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

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

image.png

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

机器元数据: IP, Hostname, IDC 等

机器运维 ssh 登录方式和登录秘钥: 如最常见的 SSH Key;如果 Machine 是阿里云的 ECS, 那么登录方式和登录秘钥是阿里云提供的 SSH 接口和对应的鉴权信息等。

各个on-host 软件版本和自定义参数

Machine 状态: 这部分信息不需要用户提交,而是由 Node-Operator 生成,表示这个机器的当前状态,参考 Pod.Status 。

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 中。由于篇幅原因,我们不再赘述。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6天前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
6天前
|
设计模式 敏捷开发 监控
深入理解自动化测试框架的设计原则与实践
【5月更文挑战第31天】 在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将探讨自动化测试框架的设计原则,并结合实际案例分析如何构建一个高效、可扩展且易于维护的自动化测试框架。我们将透过不同的测试场景,从模块化、抽象化到数据驱动等设计模式,剖析框架构建的最佳实践。通过阅读本文,读者能够获得构建强大自动化测试框架的深刻见解,并应用于实际工作中,以提升软件测试效率和准确性。
4 0
|
6天前
|
人工智能 自然语言处理 安全
构建未来:AI驱动的自适应网络安全防御系统提升软件测试效率:自动化与持续集成的实践之路
【5月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、保障用户隐私和企业持续运营的关键。传统的安全防御手段,如防火墙和入侵检测系统,面对日益复杂的网络攻击已显得力不从心。本文提出了一种基于人工智能(AI)技术的自适应网络安全防御系统,该系统能够实时分析网络流量,自动识别潜在威胁,并动态调整防御策略以应对未知攻击。通过深度学习算法和自然语言处理技术的结合,系统不仅能够提高检测速度和准确性,还能自主学习和适应新型攻击模式,从而显著提升网络安全防御的效率和智能化水平。 【5月更文挑战第30天】 在快速迭代的软件开发周期中,传统的手动测试方法已不再适应现代高效交付的要求。本文探讨了如
|
6天前
|
敏捷开发 自然语言处理 JavaScript
探索自动化测试框架的选择标准与实践应用
【5月更文挑战第30天】 在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加快上市速度的关键。本文深入探讨了选择自动化测试框架时需考虑的标准,并通过具体案例分析如何在项目中成功实施。我们将覆盖框架选择过程中的性能、可靠性、易用性及可维护性四个核心要素,并结合业界最佳实践,提出一套实用的框架评估与应用流程。
|
6天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践深入理解PHP的命名空间与自动加载机制
【5月更文挑战第30天】 在容器化和微服务架构日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排工具。然而,随之而来的挑战是集群的监控与日志管理。本文将深入探讨 Kubernetes 集群监控的最佳实践,包括节点资源使用情况、Pods 健康状态以及网络流量分析等关键指标的监控方法。同时,我们也将讨论日志聚合、存储和查询策略,以确保快速定位问题并优化系统性能。文中将介绍常用的开源工具如 Prometheus 和 Fluentd,并分享如何结合这些工具构建高效、可靠的监控和日志管理系统。
|
6天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【5月更文挑战第30天】随着云计算和微服务架构的兴起,传统的运维模式已难以满足快速迭代和高可用性的需求。本文探讨了如何利用容器技术构建一个高效、可靠的自动化运维体系,重点分析了Docker和Kubernetes在这一过程中的关键作用,并提出了一套基于这些技术的持续集成(CI)与持续部署(CD)解决方案。通过实际案例和操作步骤的详细阐述,文章为读者提供了一种实现自动化运维的有效途径,同时对未来运维技术的发展趋势进行了展望。
|
7天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于Docker和Kubernetes的实践
【5月更文挑战第30天】 在当今的快速迭代和持续部署的软件发布环境中,自动化运维的重要性愈发凸显。本文旨在探讨如何利用容器化技术与微服务架构,特别是Docker和Kubernetes,来构建一个高效、可伸缩且自愈的自动化运维体系。通过详细分析容器化的优势及Kubernetes的集群管理机制,文章将提供一个清晰的指南,帮助读者理解并实现现代软件部署的最佳实践。
|
7天前
|
运维 监控 Devops
构建高效自动化运维系统:DevOps在企业级应用的实践
【5月更文挑战第30天】 随着信息技术的飞速发展,企业对软件交付速度和稳定性的要求越来越高。传统的运维模式已无法满足快速迭代和高效稳定的需求,因此,本文将探讨如何通过实施DevOps文化、流程和工具,构建一个高效的自动化运维系统。文章将详细描述DevOps的核心理念、关键技术组件以及如何在组织中落地实施策略,旨在帮助企业提升运维效率,加速产品的上市时间,同时保证系统的高可用性和稳定性。
|
7天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【5月更文挑战第30天】 在动态且日益复杂的云原生环境中,维持 Kubernetes 集群的高性能运行是一个持续的挑战。本文将探讨一系列针对性能监控、问题定位及优化措施的实践方法,旨在帮助运维专家确保其 Kubernetes 环境能够高效、稳定地服务于不断变化的业务需求。通过深入分析系统瓶颈,我们不仅提供即时的性能提升方案,同时给出长期维护的策略建议,确保集群性能的可持续性。
|
7天前
|
敏捷开发 监控 测试技术
探索自动化测试框架的构建与实践
【5月更文挑战第30天】 在软件开发周期中,测试环节是保证产品质量的关键步骤。随着敏捷开发和持续集成的普及,自动化测试成为提高测试效率和准确性的重要工具。本文将深入探讨自动化测试框架的构建与实践,重点分析其设计原则、关键技术选型以及实施过程中的挑战和解决方案。通过对不同自动化测试工具的比较,我们将展示如何根据项目需求定制合适的测试框架,并分享一些实用的优化技巧,以期为软件测试人员提供参考和启发。