简介: 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 如何实现应用的可用性防护?的更多相关文章

  1. DDOS攻击原理及防护方法论

      从 07年的爱沙尼亚DDOS信息战,到今年广西南宁30个网吧遭受到DDOS勒索,再到新浪网遭受DDOS攻击无法提供对外服务500多分钟. DDOS愈演愈烈,攻击事件明显增多,攻击流量也明显增大,形 ...

  2. 如何防护DDOS攻击策略

    DDoS是目前最凶猛.最难防御的网络攻击之一.现实情况是,这个世界级难题还没有完美的.彻底的解决办法,但采取适当的措施以降低攻击带来的影响.减少损失是十分必要的.将DDoS防御作为整体安全策略的重要部 ...

  3. 从保障淘宝到全球市场“第一阵营”,阿里云的DDoS防护之路走了多远?

    2年前,不少技术圈的朋友,读过论坛里的一篇解读文章:DDoS,阿里为什么要走自己的一条路(https://bbs.aliyun.com/read/271764.html?pos=13),文章讲述了阿里 ...

  4. PHP远程DoS漏洞深入分析及防护方案

    PHP远程DoS漏洞 4月3日,有人在PHP官网提交PHP 远程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代号69364.由于该漏 ...

  5. 阿里云应用高可用 AHAS 正式商用,可一键提升云上应用可用性

    在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战. 7月17日,阿里云应用高可用服务AHAS 正式商用,包含架构感知.流控降 ...

  6. XSS 前端防火墙 —— 天衣无缝的防护

    上一篇讲解了钩子程序的攻防实战,并实现了一套对框架页的监控方案,将防护作用到所有子页面. 到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribut ...

  7. 细数iOS上的那些安全防护

    细数iOS上的那些安全防护  龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...

  8. 关于web软件信息安全问题防护资料的整理 (一)

    之前意识到了安全问题的重要性,于是就在网上找了一下安全问题的解决办法(主要是web应用以及政府网站方面的),问了一下同学的公司是怎么保证安全的,跟我说用的是shiro安全机制这个貌似好多公司都在用,网 ...

  9. 利用其它带文件防护功能的软件防止*.asp;*.jpg写入文件。

    此木马是一个.NET程序制作,如果你的服务器支持.NET那就要注意了,,进入木马有个功能叫:IIS Spy,点击以后可以看到所有站点所在的物理路径.以前有很多人提出过,但一直没有人给解决的答案.. 防 ...

  10. Activity劫持实例与防护手段

    原文地址:Activity劫持实例与防护手段 作者:cjxqhhh (本文只用于学习技术,提高大家警觉,切勿用于非法用途!)   什么叫Activity劫持   这里举一个例子.用户打开安卓手机上的某 ...

随机推荐

  1. 关于全景(360)图片拼接的方法(Opencv3.0 Stitcher)----续(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  2. 关于dapper in查询很慢

    dynamicParams.Add("sitecode", new string[]{ "abc","efd","ert" ...

  3. Linux快速入门(一)Linux基础知识

    我的环境:Ubuntu(后面涉及到的Linux均为Debian系列) Linux不同发行版的包管理方式 (1)Redhat系列:Redhat系列的包管理方式采用的是基于RPM包的YUM包管理方式 (2 ...

  4. Jmeter前言

    前言 为什么要撰写这样一个教程呢? 深入学习Jmeter 温故而知新.尽管我已经使用JMeter很长时间,但还有许多元件我并不十分了解,因此,编写教程的过程成为了我的学习过程,通过反复回顾和整理知识, ...

  5. KingbaseES V8R3 集群运维案例--sys_rewind恢复备库节点

    ​ 案例说明: 在KingbaseES V8R3集群执行failover切换后,原主库被人为误(未配置recovery.conf)启动:或者人为promote备库为主库后.需要将操作节点再重新加入集群 ...

  6. Python爬取腾讯视频电影名称和链接(一)

    1 import requests 2 import json 3 from bs4 import BeautifulSoup #网页解析获取数据 4 import sys 5 import re 6 ...

  7. 记打包的2个错误-项目BotBattle

    目录 记打包项目的 2 个错误 0.概述 1.spring-boot-maven-plugin 版本 1.1 问题 1.2 添加版本号 2.总项目 2.1 问题 2.2 核验主类 2.3backend ...

  8. 10 JavaScrit定时器

    10 JavaScrit定时器 在JS中, 有两种设置定时器的方案: // 语法规则 t = setTimeout(函数, 时间) // 经过xxx时间后, 执行xxx函数 // 5秒后打印我爱你 t ...

  9. #二分图匹配#UVA1194 Machine Schedule

    题目 有两台机器 \(A,B\) 分别有 \(n,m\) 种模式. 现在有 \(k\) 个任务.对于每个任务 \(i\) ,给定两个整数 \(a_i\) 和 \(b_i\)​, 表示如果该任务在 \( ...

  10. #高斯消元,概率期望,动态规划#洛谷 3211 [HNOI2011]XOR和路径

    题目 分析 由于不同二进制位互不影响,所以考虑按位处理 设\(dp[i]\)表示第\(i\)个点某一位为1的概率,那么 \[dp[i]=\frac{1}{deg[i]}(\sum_{(i,u)=0}d ...