备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?

戳蓝字“CSDN云计算”关注我们哦!
640?wx_fmt=jpeg
作者 |   沧漠
责编 | 阿秃

导读:Kubernetes 的出现使得广大开发同学也能运维复杂的分布式系统,它大幅降低了容器化应用部署的门槛,但运维和管理一个生产级的高可用 Kubernetes 集群仍十分困难。本文将分享蚂蚁金服是如何有效可靠地管理大规模 Kubernetes 集群的,并会详细介绍集群管理系统核心组件的设计。

Kubernetes 以其超前的设计理念和优秀的技术架构,在容器编排领域拔得头筹。越来越多的公司开始在生产环境部署实践 Kubernetes,在阿里巴巴和蚂蚁金服 Kubernetes 已被大规模用于生产环境。

640?
系统概览

Kubernetes 集群管理系统需要具备便捷的集群生命周期管理能力,完成集群的创建、升级和工作节点的管理。在大规模场景下,集群变更的可控性直接关系到集群的稳定性,因此管理系统可监控、可灰度、可回滚的能力是系统设计的重点之一。

除此之外,超大规模集群中,节点数量已经达到 10K 量级,节点硬件故障、组件异常等问题会常态出现。面向大规模集群的管理系统在设计之初就需要充分考虑这些异常场景,并能够从这些异常场景中自恢复。

设计模式

基于这些背景,我们设计了一个面向终态的集群管理系统。系统定时检测集群当前状态,判断是否与目标状态一致,出现不一致时,Operators 会发起一系列操作,驱动集群达到目标状态。

这一设计参考控制理论中常见的负反馈闭环控制系统,系统实现闭环,可以有效抵御系统外部的干扰,在我们的场景下,干扰对应于节点软硬件故障。
640?wx_fmt=png

架构设计

640?wx_fmt=png

如上图,元集群是一个高可用的 Kubernetes 集群,用于管理 N 个业务集群的 Master 节点。业务集群是一个服务生产业务的 Kubernetes 集群。SigmaBoss 是集群管理入口,为用户提供便捷的交互界面和可控的变更流程。

元集群中部署的 Cluster-Operator 提供了业务集群集群创建、删除和升级能力,Cluster-Operator 面向终态设计,当业务集群 Master 节点或组件异常时,会自动隔离并进行修复,以保证业务集群 Master 节点达到稳定的终态。这种采用 Kubernetes 管理 Kubernetes 的方案,我们称作 Kube on Kube 方案,简称 KOK 方案。

业务集群中部署有 Machine-Operator 和节点故障自愈组件用于管理业务集群的工作节点,提供节点新增、删除、升级和故障处理能力。在 Machine-Operator 提供的单节点终态保持的能力上,SigmaBoss 上构建了集群维度灰度变更和回滚能力。

640?
核心组件

集群终态保持器

基于 K8s CRD,在元集群中定义了 Cluster CRD 来描述业务集群终态,每个业务集群对应一个 Cluster 资源,创建、删除、更新 Cluster 资源对应于实现业务集群创建、删除和升级。Cluster-Operator watch Cluster 资源,驱动业务集群 Master 组件达到 Cluster 资源描述的终态。

业务集群 Master 组件版本集中维护在 ClusterPackageVersion CRD 中,ClusterPackageVersion 资源记录了 Master 组件(如:api-server、controller-manager、scheduler、operators 等)的镜像、默认启动参数等信息。

Cluster 资源唯一关联一个 ClusterPackageVersion,修改 Cluster CRD 中记录的 ClusterPackageVersion 版本即可完成业务集群 Master 组件发布和回滚。

节点终态保持器

Kubernetes 集群工作节点的管理任务主要有:

  • 节点系统配置、内核补丁管理;
  • docker / kubelet 等组件安装、升级、卸载;
  • 节点终态和可调度状态管理(如关键 DaemonSet 部署完成后才允许开启调度);
  • 节点故障自愈。

为实现上述管理任务,在业务集群中定义了 Machine CRD 来描述工作节点终态,每一个工作节点对应一个 Machine 资源,通过修改 Machine 资源来管理工作节点。

Machine CRD 定义如下图所示,spec 中描述了节点需要安装的组件名和版本,status 中记录有当前这个工作节点各组件安装运行状态。除此之外,Machine CRD 还提供了插件式终态管理能力,用于与其它节点管理 Operators 协作,这部分会在后文详细介绍。

640?wx_fmt=png

工作节点上的组件版本管理由 MachinePackageVersion CRD 完成。MachinePackageVersion 维护了每个组件的 rpm 版本、配置和安装方法等信息。一个 Machine 资源会关联 N 个不同的 MachinePackageVersion,用来实现安装多个组件。

在 Machine、MachinePackageVersion CRD 基础上,设计实现了节点终态控制器 Machine-Operator。Machine-Operator watch Machine 资源,解析 MachinePackageVersion,在节点上执行运维操作来驱动节点达到终态,并持续守护终态。

节点终态管理

随着业务诉求的变化,节点管理已不再局限于安装 docker / kubelet 等组件,我们需要实现如等待日志采集 DaemonSet 部署完成才可以开启调度的需求,而且这类需求变得越来越多。

如果将终态统一交由 Machine-Operator 管理,势必会增加 Machine-Operator 与其它组件的耦合性,而且系统的扩展性会受到影响。因此,我们设计了一套节点终态管理的机制,来协调 Machine-Operator 和其它节点运维 Operators。

设计如下图所示:

640?wx_fmt=png

  • 全量 ReadinessGates: 记录节点可调度需要检查的 Condition 列表;
  • Condition ConfigMap: 各节点运维 Operators 终态状态上报 ConfigMap;

协作关系:

  1. 外部节点运维 Operators 检测并上报与自己相关的子终态数据至对应的 Condition ConfigMap;
  2. Machine-Operator 根据标签获取节点相关的所有子终态 Condition ConfigMap,并同步至 Machine status 的 conditions 中;
  3. Machine-Operator 根据全量 ReadinessGates 中记录的 Condition 列表,检查节点是否达到终态,未达到终态的节点不开启调度。

节点故障自愈

我们都知道物理机硬件存在一定的故障概率,随着集群节点规模的增加,集群中会常态出现故障节点,如果不及时修复上线,这部分物理机的资源将会被闲置。

为解决这一问题,我们设计了一套故障发现、隔离、修复的闭环自愈系统。

如下图所示,故障发现方面,采取 Agent 上报和监控系统主动探测相结合的方式,保证了故障发现的实时性和可靠性(Agent 上报实时性比较好,监控系统主动探测可以覆盖 Agent 异常未上报场景)。故障信息统一存储于事件中心,关注集群故障的组件或系统都可以订阅事件中心事件拿到这些故障信息。

640?wx_fmt=png

节点故障自愈系统会根据故障类型创建不同的维修流程,例如:硬件维系流程、系统重装流程等。

维修流程中优先会隔离故障节点(暂停节点调度),然后将节点上 Pod 打上待迁移标签来通知 PaaS 或 MigrateController 进行 Pod 迁移,完成这些前置操作后,会尝试恢复节点(硬件维修、重装操作系统等),修复成功的节点会重新开启调度,长期未自动修复的节点由人工介入排查处理。

640?wx_fmt=png

风险防范

在 Machine-Operator 提供的原子能力基础上,系统中设计实现了集群维度的灰度变更和回滚能力。此外,为了进一步降低变更风险,Operators 在发起真实变更时都会进行风险评估,架构示意图如下。

640?wx_fmt=png

高风险变更操作(如:删除节点、重装系统)接入统一限流中心,限流中心维护了不同类型操作的限流策略,若触发限流,则熔断变更。

为了评估变更过程是否正常,我们会在变更前后,对各组件进行健康检查,组件的健康检查虽然能够发现大部分异常,但不能覆盖所有异常场景。所以,风险评估过程中,系统会从事件中心、监控系统中获取集群业务指标(如:Pod 创建成功率),如果出现异常指标,则自动熔断变更。

640?
结束语

本文主要和大家分享了现阶段蚂蚁金服 Kubernetes 集群管理系统的核心设计,核心组件大量使用 Operator 面向终态设计模式。这套面向终态的集群管理系统在今年备战双 11 过程中,经受了性能和稳定性考验。

一个完备的集群管理系统除了保证集群稳定性和运维效率外,还应该提升集群整体资源利用率。接下来,我们会从提升节点在线率、降低节点闲置率等方面出发,来提升蚂蚁金服生产集群的资源利用率。

关注『阿里巴巴云原生』公众号,回复关键词“1024”,可获取本文 PPT。

640?
Q & A

Q1:目前公司绝大多数应用已部署在 Docker 中 ,如何向 K8s 转型?是否有案例可以借鉴?
A1:我在蚂蚁工作了将近 5 年,蚂蚁的业务由最早跑在 xen 虚拟机中,到现在跑在 Docker 里由 K8s 调度,基本上每年都在迭代。K8s 是一个非常开放的 “PaaS” 框架,如果已经部署在 Docker 中,符合“云原生”应用特性,迁移 K8s 理论上会比较平滑。蚂蚁由于历史包袱比较重,在实践过程中,为了兼容业务需求,对 K8s 做了一些增强,保证业务能平滑迁移过来。

Q2:应用部署在 K8s 及 Docker 中会影响性能吗?例如大数据处理相关的任务是否建议部署到 K8s 中?
A2:我理解 Docker 是容器,不是虚拟机,对性能的影响是有限的。蚂蚁大数据、AI 等业务都已经在迁移 K8s 与在线应用混部。大数据类对时间不敏感业务,可以很好地利用集群空闲资源,混部后可大幅降低数据中心成本。

Q3:K8s 集群和传统的运维环境怎么更好的结合?现在公司肯定不会全部上 K8s。
A3:基础设施不统一会导致资源没有办法统一进行调度,另外维护两套相对独立的运维系统,代价是非常大的。蚂蚁在迁移过程中实现了一个“Adapter”,将传统创建容器或发布的指令转换成 K8s 资源修改来做“桥接”。

Q4:Node 监控是怎么做的,Node 挂掉会迁移 Pod 吗?业务不允许自动迁移呢?
A4:Node 监控分为硬件、系统级、组件级,硬件监控数据来自 IDC,系统级监控使用内部自研监控平台,组件(kubelet/pouch 等)监控我们扩展 NPD,提供 exporter 暴露接口给监控系统采集。Node 出现异常,会自动迁移 Pod。有些带状态的业务,业务方自己定制 operator 来实现 Pod 自动迁移。不具备自动迁移能力的 Pod, 超期后会自动销毁。

Q5:整个 K8s 集群未来是否会对开发透明,使用代码面向集群编程或编写部署文件,不再需要按容器去写应用及部署,是否有这种规划?
A5:K8s 提供了非常多构建 PaaS 平台的扩展能力,但现在直接面向 K8s 去部署应用的确非常困难。我觉得采用某种 DSL 去部署应用是未来的趋势,K8s 会成为这些基础设施的核心。

Q6:我们目前采用 kube-to-kube 的方式管理集群,kube-on-kube 相比 kube-to-kube 的优势在哪?在大规模场景下,K8s 集群的节点伸缩过程中,性能瓶颈在哪?是如何解决的?
A6:目前已经有非常多的 CI/CD 流程跑在 K8s 之上。采用 kube-on-kube 方案,我们可以像管理普通业务 App 那样管理业务集群的管控。节点上除运行 kubelet pouch 外,还会额外运行很多 daemonset pod,大规模新增节点时,节点组件会对 apiserver 发起大量 list/watch 操作,我们的优化主要集中在 apiserver 性能提升,和配合 apiserver 降低节点全量 list/watch。

Q7:沧漠你好,因为我们公司还没有上 K8s,所有我想请教以下几个问题:K8s 对我们有什么好处?能够解决当前的什么问题?优先在哪些业务场景、流程环节使用?现有基础设施能否平滑切换到 Kubernetes?
A7:我觉得 K8s 最大的不同在于面向终态的设计理念,不再是一个一个运维动作。这对于复杂的运维场景来说,非常有益。从蚂蚁的升级实践看,平滑是可以做到的。

Q8:cluster operator 是 Pod 运行,用 Pod 启动业务集群 master,然后 machine operator 是物理机运行?
A8:operator 都运行在 Pod 里面的,cluster operator 将业务集群的 machine operator 拉起来。

Q9:你好!请问一下,为应对像双十一这样的高并发场景,多少量级的元集群的规模对应管理多少量级的业务集群合适?就我的理解,cluster operator 应该是对资源的 list watch,面对大规模的并发场景,你们做了哪些方面的优化?
A9:一个集群可以管理万级节点,所以元集群理论上可以管理 3K+ 业务集群。

Q10:节点如果遇到系统内核、Docker、K8s 异常,如何从软件层面最大化保证系统正常?
A10:具备健康检查能力,主动退出,由 K8s 发现,并重新在其它节点拉起。

640?wx_fmt=png

扫描下方二维码,阅读作者大大原文哟👇👇👇

640?wx_fmt=jpeg

640?wx_fmt=jpeg
福利
扫描添加小编微信,备注“姓名+公司职位”,入驻【CSDN博客】,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg

推荐阅读:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动互联网+智能运营体系搭建=你家有金矿啊!

每个企业都有许多的数据,但能否将数据转化成商业价值,是企业非常关心的问题。阿里巴巴曾自嘲是一家坐在数据的金矿上啃着馒头的企业,前几年集团积累了很多的数据,但这些数据并没有真正应用起来,受限于几个原因&#xf…

Apache JMeter 测试webservice接口 中文乱码

文章目录1. http请求编码设置utf-82. jmeter.properties修改默认编码1. http请求编码设置utf-8 2. jmeter.properties修改默认编码 找到apache-jmeter-5.2.1\bin\jmeter.properties文件 在jmeter.properties文件中找到 #sampleresult.default.encodingISO-8859-1 替换为 samp…

【实操手册】如何把一场直播录制下来?

许多用户使用直播服务时,需要把正在直播的视频录制下来进行存储或方便后续的回看。为了满足用户需求,阿里云视频直播服务提供了直播录制功能,本文将对这两种形式的录制方法进行简单介绍。 一、按场景录制 针对不同的场景进行录制配置 • 按…

搞不清边缘计算几款产品差异?动动小手点这里!

最近阿里云新上了一款产品,边缘节点服务(简称ENS),随着产品运营推广不断深入,偶尔会遇到用户关于ENS产品与其他几款产品的疑惑,典型问题比如: ENS是部署在CDN位置,用户是不是可以直…

Apache JMeter 压测webservice接口

文章目录一、压测设置和参数说明二、服务台控制监控三、查看结果树四、查看聚合报告一、压测设置和参数说明 压测设置说明线程数并发数量,能跑多少量。具体说是一次存在多少用户同时访问。Rame-Up Period(in seconds)表示JMeter每隔多少秒发动并发。理解成准备时长…

阿里云自研新一代企业云数据库POLARDB背后的技术

从2008年到2018年,阿里巴巴的数据库技术已经发展了10年的时间,10年的时间从AliSQL到RDS,再到自研POLARDB,阿里巴巴数据库技术得到了极大的提升。那么在阿里云自研新一代企业云数据库POLARDB背后有哪些技术呢?本文中&am…

python wxpython radiobutton 能不能默认不选择_Python啥都行_Robot自动化测试

文章目录Robot介绍与环境搭建Robot特性初探Robot 技术架构WxPython GUI工具箱Robot FrameworkRIDE安装第一个案例启动RIDE自定义一个函数新建项目及测试用例导入自定义库函数使用自定义函数运行测试用例及查看其报告Robot介绍与环境搭建Robot特性初探Robot Framework是一个基于…

为什么嫁人就选程序员!

本文的重点是:“为什么年轻漂亮的小姑娘都瞄准了程序员小哥哥”“理发38?太奢侈了!淘宝20买套剪刀自己可以用好几年。”“衣服太贵了,我觉得优衣库的那件打折就已经很好了”“上个月的一千块钱的零花钱没花完,这个月先…

数字化转型 移动化先行 云栖大会上发布了哪些移动研发新利器?

随着企业使用互联网技术的不断深入,企业在产品研发、供应链管理、市场运营及企业内部的场景当中,生产效率得到大幅度提升。随着移动互联网技术在社会层面深度普及,移动设备的普及性使得企业成为数字化转型的最佳载体。本文以2018年云栖大会杭…

c语言cis,c语言小白学习历程第五篇

学习目标:难的咱也看不懂,先把简单的看了再说,加油L 冲冲冲!学习时间:2020年11月1日学习产出:回调函数学习:回调函数说白了就是一个通过函数指针调用的函数。如果你把函数的指针Callback(地址)作…

邱跃鹏:软硬件一体化、Serverless、智能化是云计算三大趋势

近日腾讯公司副总裁、腾讯云总裁邱跃鹏在“腾讯Techo开发者”大会上致辞。他表示,云计算未来有三大趋势,即软硬件一体化(Cloud Native Hardware)、无服务器计算(Serverless)和智能化(Smart&…

阿里云喻义:十年牧码,从码农走向工程师的进化之路

有人会问,码农和工程师有区别吗?有什么区别?相信每个人都有不同的理解。 “你敲下的每一行代码,你想过他会如何在计算机上运行吗?你想过你的这一行代码会产生多少cache miss吗?你想过你的这段代码分支预测…

idea出现 Error:(1, 16) java: 非法字符: '\u0a0d'

异常案例: 解决方案:可以将文件的编码格式由utf-16 变为utf-8就可以了。

android数字滚动动画,Android超简单实现金钱滚动效果

目录目录效果展示实现原理利用ValueAnimator将数值从0一直增长到你所需要展示的数值,然后使用TextView将增长过程中的数值不断展示即可实现金钱的滚动效果。ValueAnimator基础讲解ValueAnimator是Android中用来实现属性动画的类,它是Android3.0后才引入的…

因为信仰,油画专业的他自学开发进击阿里技术P9

大约在1年以前,阿里云视频云团队来了一位热心和气、爱好广泛的老干部新同学,他就是资深技术专家郝冲,花名和招,寓意“和气招财”。 有人说程序员只喜欢安静地写代码,和招偏偏一个户外运动爱好者。他擅长滑雪&#xff…

聚焦技术和实践,腾讯全面揭秘基础设施和大数据演进之路

“开发者是推动技术发展的主力军,数字社会向前的每一步,都离不开广大开发者。作为数字化转型助手,腾讯云将秉持“开源、共享、创新”的三大理念持续助力开发者的个人成长和价值创造。目前腾讯云已经服务了数百万开发者,给到开发者…

Apache JMeter 测试 HTTP接口

一、设置基础组件 1. Apache JMeter 测试 HTTP接口流程 原则:简单的http请求而已,例如:PostMan测试一样的 1.添加一个线程组 2给线程组添加一个取样器,用来发送HTTP请求 3.给线程组添加一个监听器(观察结果树),用来查…

MaxCompute2.0新功能介绍

在过去的两年内,MaxCompute进行了翻天覆地的重构,从1.0版本全面升级到了2.0版本。而大家或许对于MaxCompute 2.0的一些新特性并不了解,在本文中,MaxCompute技术专家秋鹏就为大家详细介绍MaxCompute 2.0的新特性。 本文主要围绕以下…

android顶部导航高度,Android特效——————底部/顶部导航条(Fragment+ViewPaper+XTabLayout)...

初次使用xtablayout和viewpaper2.所以就弄了最基础的导航条一、效果二、代码配置环境【在bulid.gradle中添加以下代码】implementation ‘androidx.viewpager2:viewpager2:1.0.0-alpha02‘implementation‘com.androidkun:XTabLayout:1.1.4‘按钮点击切换图片【几个点击按钮图片…