作者|赵明山(立衡)

前言

OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,是阿里内部生产环境大规模应用的基于 Kubernetes 之上的标准扩展组件,也是紧贴上游社区标准、适应互联网规模化场景的技术理念与最佳实践。
 
OpenKruise 在 2021.9.6 发布了最新的 v0.10.0 版本新增了弹性拓扑管理和应用安全防护等能力,本文将为大家揭晓 OpenKruise 是如何实现应用的可用性防护能力。

背景

在文章开始部分,我想先聊聊到底什么是“应用的可用性防护”。例如,在 Kubernetes 上面部署的 ETCD 服务,时刻要保证可用的实例数不小于 N(受限于 raft 协议的选举机制)。很多同学都会想到 Deployment 中可以设置 maxUnavailable,那不就行了吗?再说了,还会有 RS Controller 在做副本控制呢?仔细想想,Deployment 的 MaxUnavailable 是在应用滚动发布的过程中保证最小的 Pod 数量,而 RS Controller 控制器则是尽快让应用实际的福本数等于预期的副本数,并不能保证应用每时每刻的最小可用副本数。

针对上述场景,Kubernetes 原生提供的 PodDisruptionBudget(PDB)通过限制同时中断 Pod 的数量,来保证应用的高可用性。但是,当前 PDB 的能力并不全面,它只能防护 Pod Eviction 场景(例如:kubectl drain node 驱逐 node 上面的 Pod)。在如下“并发 Pod 更新/驱逐/删除”场景中,即便有 PDB 防护依然将会导致业务中断、服务降级:

  • 应用 owner 通过 Deployment 正在进行版本升级,与此同时集群管理员由于机器资源利用率过低正在进行 node 缩容
  • 中间件团队利用 SidecarSet 正在原地升级集群中的sidecar版本(例如:ServiceMesh envoy),同时 HPA 正在对同一批应用进行缩容
  • 应用 owner 和中间件团队利用 CloneSet、SidecarSet 原地升级的能力,正在对同一批 Pod 进行升级

PodUnavailableBudget 提升应用的高可用性

Kubernetes 原生 PDB 为什么只能防护 Pod Eviction 的场景呢?首先,让我们来看看它的实现原理:PDB 通过 selector 选择了一批防护的 Pod 列表,minAvailable 则表明最小可用的 Pod 数量,pdb-controller 根据前面两个值以及线上 Pod 的 ready 状态,计算出当前时刻最多允许中断的 Pod 数量 PodDisruptionAllowd。k8s pod evictionRestful API 接口则会根据 pdb PodDisruptionAllowd 来决定接口成功还是返回 400 报错。到了这里终于真相大白了,pdb 通过 evictionRestful API 接口来实现 pod 的防护能力,所以它只能适用于 Pod Eviction 场景。

OpenKruise PodUnavailableBudget(PUB)安全防护的整体思路与 PDB 其实也大致相同,不过在关键的防护路径上面做了一些调整。Voluntary Disruption(诸如:集群管理员驱逐 Node、并发升级 Pod)主动导致 Pod 不可用的场景其实可以归纳为以下三类:

  • Modification Pod.Spec 定义(CloneSet、SidecarSet 原地升级 container)
  • Delete Pod(Deployment 等控制器滚动升级 Pod、直接 Delete Pod)
  • Eviction API(kubectl drain node 驱逐 Pod)

OpenKruise 基于 Kubernetes Adminssion Webhook 机制添加针对 Pod Update/Delete/Eviction 的 webhook 逻辑,根据 pub 的 PodUnavailableAllowed 来实现更加全面的应用 Pod 安全防护机制,逻辑架构如下:

应用场景

  • 无状态应用:比如想至少有 60% 的副本 Available
    • 解决办法:创建 PUB Object,指定 minAvailable 为 60%,或者 maxUnavailable 为 40%
apiVersion: apps.kruise.io/v1alpha1
kind: PodUnavailableBudget
metadata:name: web-server-pubnamespace: web
spec:targetRef:apiVersion: apps.kruise.io/v1alpha1kind: CloneSetname: web-serverminAvailable: 60%
  • 有状态应用:最少可用的实例数不能少于某个数 N(比如受限于 raft 协议类应用的选举机制)
    • 解决办法:设置 maxUnavailable=1 或者 minAvailable=N,分别允许每次只删除一个实例或每次删除 workload.replicas - minAvailable 个实例
apiVersion: apps.kruise.io/v1alpha1
kind: PodUnavailableBudget
metadata:name: etcd-pubnamespace: etcd
spec:targetRef:apiVersion: apps.kruise.io/v1alpha1kind: StatefulSetname: etcdmaxUnavailable: 1
  • 单实例应用:终止这个实例之前必须提前通知客户并取得同意
    • 解决办法:创建 PUB Object,并设置 maxUnavailable 为 0,这样 OpenKruise 就会阻止这个实例的删除,然后去通知并征求用户同意后,再把这个 PUB 删除从而解除这个阻止,然后再去 recreate
apiVersion: apps.kruise.io/v1alpha1
kind: PodUnavailableBudget
metadata:name: gameserver-pubnamespace: game
spec:targetRef:apiVersion: apps.kruise.io/v1alpha1kind: StatefulSetname: gameservermaxUnavailable: 0

总结

Kubernetes 给用户带来极致弹性调度的同时也给应用的高可用性带来了一定的考验,PUB 是在 Voluntary Disruption 场景下的一种尝试,同时配合 OpenKruise 提供的防级联删除的能力相信能在一定程度上提升线上应用的稳定性。而针对更加棘手 InVoluntary Disruption(诸如:集群 Node 网络脑裂、vk 节点异常)导致 Pod 不可用等降低应用可用性的场景,OpenKruise 未来也会有更多的探索。与此同时,我们也欢迎更多的同学参与到 OpenKruise 社区来,共同建设一个场景更加丰富、完善的 K8s 应用管理、交付扩展能力,能够面向更加规模化、复杂化、极致性能的场景。

Github:https://github.com/openkruise/kruise
Official:https://openkruise.io/
Slack: Channel in Kubernetes Slack
钉钉交流群:搜索群号【23330762】可添加~

戳链接(https://github.com/openkruise/kruise),查看 OpenKruise 项目 github 主页!!

OpenKruise 如何实现应用的可用性防护?相关推荐

  1. OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力

    简介:阿里云开源的云原生应用自动化管理套件.CNCF Sandbox 项目 -- OpenKruise,今天发布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最后一个 mi ...

  2. OpenKruise v1.0:云原生应用自动化达到新的高峰

    云原生应用自动化管理套件.CNCF Sandbox 项目 – OpenKruise,近期发布了 v1.0 大版本. OpenKruise [1]  是针对 Kubernetes 的增强能力套件,聚焦于 ...

  3. OpenKruise原理介绍和安装

    一.介绍 OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如部署.发布.运维以及可用性防护. OpenKruise 提供的绝大部分能力都是基于 CR ...

  4. OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

    LFX Mentorship 计划由 Linux Foundation 组织发起,为像 OpenKruise 这样的 CNCF 托管项目提供了激励开源贡献.扶植社区发展的优秀土壤.参与其中的开发者不仅 ...

  5. 专访 OpenKruise 负责人:现在的云原生应用自动化发展到什么程度了?

    2021 年 12 月,CNCF 开源项目 OpenKruise 正式宣布了 v1.0 大版本的发布. OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦在云原生应用的自动化 ...

  6. 区块链应该如何进行防护

    区块链的诞生 "2009年1月3日第一个序号为0的创世区块诞生.几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生." 区块链的特 ...

  7. Kubernetes 进阶训练营 控制器

    控制器 前面我们一起学习了 Pod 的原理和一些基本使用,但是在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状 ...

  8. 让开源和标准成为云原生的确定性力量

    图片来源:预见2023 · 吴晓波年终秀 纵观过去几年云原生技术的发展历程,开放.标准的开源生态对云原生技术持续演进起到极大推动作用.开源生态带来了众多云原生领域技术创新,并成为技术进步的重要载体.目 ...

  9. 大促场景系统稳定性保障实践经验分享

    简介:11月11日0点刚过26秒,天猫双11的订单创建峰值就达到58.3万笔/秒,阿里云又一次扛住全球最大规模流量洪峰!58.3万笔/秒,这一数字是2009年第一次天猫双11的1457倍. 每到双11 ...

最新文章

  1. 【camera-radar】基于ROS的多传感器融合感知系统实现(雷达+相机)(3)
  2. 在node.js中复制文件的最快方法
  3. 开发日记-20190724 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 14
  4. NHibernate中的API
  5. C# 通过ImportNode AppendChild方法合并XmlDocument,XML转为DataTable
  6. macOS Mojave 升级到macOS Monterey
  7. PC顶级后次世代和主流次世代图像引擎技术规格表
  8. 自定义TimePicker样式,修改时分、分割线分隔冒号的字体、颜色高度等属性
  9. 【解决】 io.lettuce.core.RedisCommandExecutionException: ERR wrong number of arguments for 'set' command
  10. 中英文论文写作指导第一部分(文题、摘要、关键字)
  11. google 一个天生的在线超速代理。(刷票首选)
  12. c#笔记--程序集(Assembly)、模块(Module)、类型(class)、命名空间、反射
  13. 全差分运放阻抗匹配计算(三)
  14. 坚持一年背英语单词的总结
  15. AXI总线学习(AXI34)
  16. 关于window10和爱剪辑软件的兼容出错问题。
  17. 为什么推荐使用付费代理IP
  18. Android go app 安装包,GO谷歌安装器下载
  19. IPv6,到底是什么?
  20. 网站首页设计怎么排版?

热门文章

  1. Windows x64内核学习笔记(一)—— 环境与配置
  2. 6.windows线程切换_主动切换
  3. 栈的应用就进匹配_笔记
  4. Mysql 查询一天中每半小时记录的数量
  5. Spring boot日志使用
  6. MySQL普通用户修改密码
  7. MySQL添加、删除字段
  8. MySQL事务,这篇文章就够了
  9. “365算法每日学计划”:03打卡-贪心算法
  10. Java提升篇:理解String 及 String.intern() 在实际中的应用