OpenKruise 如何实现应用的可用性防护?
简介: OpenKruise 在 2021.9.6 发布了最新的 v0.10.0 版本新增了弹性拓扑管理和应用安全防护等能力,本文将为大家揭晓 OpenKruise 是如何实现应用的可用性防护能力。
前言
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-pub
namespace: web
spec:
targetRef:
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
name: web-server
minAvailable: 60%

有状态应用:最少可用的实例数不能少于某个数 N(比如受限于 raft 协议类应用的选举机制)
- 解决办法:设置 maxUnavailable=1 或者 minAvailable=N,分别允许每次只删除一个实例或每次删除 workload.replicas - minAvailable 个实例
apiVersion: apps.kruise.io/v1alpha1
kind: PodUnavailableBudget
metadata:
name: etcd-pub
namespace: etcd
spec:
targetRef:
apiVersion: apps.kruise.io/v1alpha1
kind: StatefulSet
name: etcd
maxUnavailable: 1

单实例应用:终止这个实例之前必须提前通知客户并取得同意
- 解决办法:创建 PUB Object,并设置 maxUnavailable 为 0,这样 OpenKruise 就会阻止这个实例的删除,然后去通知并征求用户同意后,再把这个 PUB 删除从而解除这个阻止,然后再去 recreate
apiVersion: apps.kruise.io/v1alpha1
kind: PodUnavailableBudget
metadata:
name: gameserver-pub
namespace: game
spec:
targetRef:
apiVersion: apps.kruise.io/v1alpha1
kind: StatefulSet
name: gameserver
maxUnavailable: 0

总结
Kubernetes 给用户带来极致弹性调度的同时也给应用的高可用性带来了一定的考验,PUB 是在 Voluntary Disruption 场景下的一种尝试,同时配合 OpenKruise 提供的防级联删除的能力相信能在一定程度上提升线上应用的稳定性。而针对更加棘手 InVoluntary Disruption(诸如:集群 Node 网络脑裂、vk 节点异常)导致 Pod 不可用等降低应用可用性的场景,OpenKruise 未来也会有更多的探索。与此同时,我们也欢迎更多的同学参与到 OpenKruise 社区来,共同建设一个场景更加丰富、完善的 K8s 应用管理、交付扩展能力,能够面向更加规模化、复杂化、极致性能的场景。
原文链接
本文为阿里云原创内容,未经允许不得转载。
OpenKruise 如何实现应用的可用性防护?的更多相关文章
- DDOS攻击原理及防护方法论
从 07年的爱沙尼亚DDOS信息战,到今年广西南宁30个网吧遭受到DDOS勒索,再到新浪网遭受DDOS攻击无法提供对外服务500多分钟. DDOS愈演愈烈,攻击事件明显增多,攻击流量也明显增大,形 ...
- 如何防护DDOS攻击策略
DDoS是目前最凶猛.最难防御的网络攻击之一.现实情况是,这个世界级难题还没有完美的.彻底的解决办法,但采取适当的措施以降低攻击带来的影响.减少损失是十分必要的.将DDoS防御作为整体安全策略的重要部 ...
- 从保障淘宝到全球市场“第一阵营”,阿里云的DDoS防护之路走了多远?
2年前,不少技术圈的朋友,读过论坛里的一篇解读文章:DDoS,阿里为什么要走自己的一条路(https://bbs.aliyun.com/read/271764.html?pos=13),文章讲述了阿里 ...
- PHP远程DoS漏洞深入分析及防护方案
PHP远程DoS漏洞 4月3日,有人在PHP官网提交PHP 远程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代号69364.由于该漏 ...
- 阿里云应用高可用 AHAS 正式商用,可一键提升云上应用可用性
在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战. 7月17日,阿里云应用高可用服务AHAS 正式商用,包含架构感知.流控降 ...
- XSS 前端防火墙 —— 天衣无缝的防护
上一篇讲解了钩子程序的攻防实战,并实现了一套对框架页的监控方案,将防护作用到所有子页面. 到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribut ...
- 细数iOS上的那些安全防护
细数iOS上的那些安全防护 龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...
- 关于web软件信息安全问题防护资料的整理 (一)
之前意识到了安全问题的重要性,于是就在网上找了一下安全问题的解决办法(主要是web应用以及政府网站方面的),问了一下同学的公司是怎么保证安全的,跟我说用的是shiro安全机制这个貌似好多公司都在用,网 ...
- 利用其它带文件防护功能的软件防止*.asp;*.jpg写入文件。
此木马是一个.NET程序制作,如果你的服务器支持.NET那就要注意了,,进入木马有个功能叫:IIS Spy,点击以后可以看到所有站点所在的物理路径.以前有很多人提出过,但一直没有人给解决的答案.. 防 ...
- Activity劫持实例与防护手段
原文地址:Activity劫持实例与防护手段 作者:cjxqhhh (本文只用于学习技术,提高大家警觉,切勿用于非法用途!) 什么叫Activity劫持 这里举一个例子.用户打开安卓手机上的某 ...
随机推荐
- electron实现静默下载(各种踩坑解决)
前车之鉴 也是阅读了很多资料和前人踩的坑,直接使用webContent.print方法进行打印.其他方式要不就是Bug多,官方修复也有问题:要不就是官方升级版本后不再支持等 不赘述 需求思路 在mai ...
- docker相关命令杂理
- 2020.11.16docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #保存现有的镜像 # docker commit -a "r ...
- C#调用C++ (使用C++/CLI)
简介 C++/CLI(C++ Common Language Infrastructure)是一种允许在 .NET 平台上创建托管代码(managed code)和非托管代码(unmanaged co ...
- Spring boot中拦截器的简单使用
1.创建自定义拦截器类:首先,你需要创建一个自定义的拦截器类,该类需要实现HandlerInterceptor接口.例如,你可以创建一个名为CustomInterceptor的类. import or ...
- #树状数组#CF461C Appleman and a Sheet of Paper
题目传送门 分析 可以发现往左翻太多相当于往右翻一点,所以如果翻的位置超过一半那么打一个取反标记再另一边翻转, 用树状数组维护当前厚度,时间复杂度 \(O(n\log^2 n)\) 代码 #inclu ...
- #线段树,倒序#CF356A Knight Tournament
题目 分析 要求覆盖必须是第一个覆盖的, 考虑最后一个覆盖的很简单做线段树区间赋值, 那么倒序区间赋值就可以了 代码 #include <cstdio> #include <ccty ...
- OpenHarmony创新赛 | 您有一份创新激励奖待领取 请查收!
2023开源和信息消费大赛 开放原子开源大赛OpenHarmony创新赛 (以下简称"OpenHarmony创新赛") 正如火如荼的进行当中 赛程也即将进入到提交作品的关键阶段 ...
- Ohos-MPChart——支持多种图表绘制的组件
简介 Ohos-MPChart是OpenAtom OpenHarmony(简称"OpenHarmony")系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视 ...
- C++调用Python-0:搭建环境
1.进入到Python安装目录 2.将Python安装目录中的 include 和 libs 文件夹放在 C++项目中 3.设置 附加包含目录 和 附加库目录.附加依赖项(python310_d.li ...
- MogDB/openGauss 开机自启动
MogDB/openGauss 开机自启动 在 centos7.6 操作系统上设置 MogDB/openGauss 开机自启动,我们先来了解一下自定义服务的配置文件组成部分,共分为[Unit].[Se ...