Kruise Rollout:灵活可插拔的渐进式发布框架

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布,以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停,并提供旁路的无感对接、兼容已有的多种工作负载(Deployment、CloneSet、DaemonSet)。近期也在《2022 开放原子全球开源峰会》上面做了主题分享,以下是主要内容。

作者:赵明山(立衡)


前言


Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布,以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停,并提供旁路的无感对接、兼容已有的多种工作负载(Deployment、CloneSet、DaemonSet)。


近期也在《2022 开放原子全球开源峰会》上面做了主题分享,以下是主要内容。


什么是渐进式交付?


1.png


渐进式发布主要区别于全量、一次性发布。它主要包含以下特点:


  • 增量的发布过程:通俗讲就是我们可以将一次发布分成多个批次,并且可以控制每个批次的开始与停止。 


  • 实例与流量双重维度的灰度:比如社区常见的金丝雀发布、A/B Testing 发布、蓝绿发布。


  • 阶段可验证性:就是发布的每个批次,可以验证发布的正确性、是否符合预期。 


下面我们来看一个实际的例子。


2.png


假如线上是 X 版本,现在需要发布到 Y 版本。首先,会将发布分为多个批次(比如,第一批只发布十个实例);然后,灰度一定规则的流量到 Y 版本,比如:像淘宝每次重大发布,会使用 A/B Testing 的方式,只将公司员工灰度到新版本;最后,验证新版本的健康情况,验证 OK 后,可以重复上述的过程,完成剩余的批次。如果在这个过程中发现了任何异常,可以快速回滚到 X 版本。通过上面这个例子,渐进式发布与全量发布相比,增加了很多中间的验证过程,渐进式发布可以说是极大的提高了交付的稳定性,尤其是针对一些大规模的场景而言,渐进式发布是非常有必要的。


渐进式发布与 K8s 工作负载之间的关系


3.png


K8s 当中所有的 Pod 都是由工作负载来管理的,其中最常见的两个工作负载就是 Deployment 和 statefulset。Deployment 对于升级而言提供了 maxUnavailable 和 maxSurge 两个参数,但是本质上来讲 Deployment 它只支持流式的一次性发布,用户并不能控制分批。StatefulSet 虽然支持分批,但是跟我们想要的渐进式发布的能力还有比较大的距离。image.gif


4.png


所以渐进式发布与工作负载从能力上讲是一种包含关系,它除了基础的 Pod 发布之外,还应该包含流量发布进度控制。既然能力上已经梳理清楚了,下面我们就要看看实现,如何去设计和实现 Rollout 能力也是非常重要的。在这我们可以考虑一个问题,从设计的角度看他们也是包含关系吗?


Rollout 方案的设计理念


准备开始做这件事情前,肯定要先调研一下社区的优秀方案,看看其他人是如何解决的。


5.pngimage.gif


Argo Rollout 是 Argo 公司推出的 Workload,它的实现思路是:重新定义一个类似于 Deployment 的工作负载,在实现 Deployment 原有能力的基础上,又扩展了 Rollout 的相关能力。它的优点是工作负载内置了 Rollout 能力,配置简单、实现也会比较简单,并且目前支持的功能也非常的丰富,支持各种发布策略、流量灰度和 metrics 分析,是一个比较成熟的项目。


但是它也存在一些问题,因为它本身就是一个工作负载,所以它不能适用于社区 Deployment,尤其是针对已经用 Deployment 部署的公司,需要一次线上迁移工作负载的工作。其次呢,现在社区的很多方案是依赖 Deployment 实现的,并且很多公司已经构建了基于 Deployment 的容器管理平台,都要进行兼容适配。所以,Argo-Rollout 更加适用于定制化能力较强的、没有存量 Deployment 的公司业务。


6.png


另一个社区项目是 Flagger,它的实现思路跟 Argo-Rollout 完全不同。它没有单独的实现一个 workload,而是在现有 Deployment 的基础之上,扩展了流量灰度、分批发布的能力。


Flagger 的优势是支持原生 Deployment 、并且与社区的 Helm、Argo-CD 等方案都是兼容的。但是也存在一些问题,首先就是发布过程中的 Double Deployment 资源的问题,因为它是先升级用户部署的 Deployment,再升级 Primary,所以在这过程中需要准备双倍的 Pod 资源。第二呢,针对一些自建的容器平台需要额外对接,因为它的实现思路是将用户部署资源都 copy 一份,且更改资源的名字以及 Label。所以,Flagger 更加适合那种规模不大、基于社区方案部署、定制化较小的公司。


7.png


另外,百花齐放是云原生的一大特点。阿里云容器团队负责整个容器平台云原生架构的演进,在应用渐进式交付领域也有强烈的需求,因此在参考社区方案以及考虑阿里内部场景的基础上,我们在设计 Rollout 过程中有以下几个目标:


1. 无侵入性:对原生的 Workload 控制器以及用户定义的 Application Yaml 定义不进行任何修改,保证原生资源的干净、一致


2. 可扩展性:通过可扩展的方式,支持 K8s Native Workload、自定义 Workload 以及 Nginx、Isito 等多种 Traffic 调度方式


3. 易用性:对用户而言开箱即用,能够非常方便的与社区 Gitops 或自建 PaaS 结合使用


Kruise Rollout 工作机制与演进


8.png


Kruise Rollout API 设计是非常简单的,主要包含以下四个部分:


  • ObjectRef:用于表明 Kruise Rollout 所作用的工作负载,例如:Deployment Name 


  • Strategy:定义了 Rollout 发布的过程,如上是一个金丝雀发布的示例,第一批发布 5% 的实例,并且灰度 5% 流量到新版本,待人工确认后,再进行后续发布 


  • TrafficRouting:流量灰度所需要的资源 Name,例如:Service、Ingress 或 Gateway API 


  • Status:用来展示 Rollout 的过程以及状态 


接下来介绍一下 Kruise Rollout 的工作机制。


image.gif9.png


首先,用户基于容器平台做一次版本发布(一次发布从本质上讲就是将 K8s 资源 apply 到集群中)。


  • Kruise Rollout 包含一个 webhook 组件,它会拦截用户的发布请求,然后通过修改 workload strategy 的方式 Pause 住 workload 控制器的工作。


  • 然后,就是根据用户的 Rollout 定义,动态的调整 workload 的参数,比如:partition,实现 workload 的分批发布。


  • 等到批次发布完成后,又会调整 ingress、service 配置,将特定的流量导入到新版本。


  • 最后,Kruise Rollout 还能够通过 prometheus 中的业务指标判断发布是否正常。比如说,对于一个 web 类 http 的服务,可以校验 http 状态码是否正常。 


上面的过程,就完成了第一批次的灰度,后面的批次也是类似的。完整的 Rollout 过程结束后,kruise 会将 workload 等资源的配置恢复回来。 所以说,整个 Rollout 过程,是与现有工作负载能力的一种协同,它尽量复用工作负载的能力,又做到了非 Rollout 过程的零入侵。


Kruise Rollout 工作机制就先介绍到这里,下面我简单介绍一下 OpenKruise 社区。


10.png


最后


随着 K8s 上面部署的应用日益增多,如何做到业务快速迭代与应用稳定性之间的平衡,是平台建设方必须要解决的问题。Kruise Rollout 是 OpenKruise 在渐进式交付领域的新探索,旨在解决应用交付领域的流量调度以及分批部署问题。Kruise Rollout 目前已经正式发布 v0.2.0 版本,并且与社区 OAM KubeVela 项目进行了集成,vela 用户可以通过 Addons 快速部署与使用 Rollout 能力。此外,也希望社区用户能够加入进来,我们一起在应用交付领域做更多的扩展。


扫码加入社区交流钉钉群


12.jpeg


此处,查看 OpenKruise 项目 github 主页!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
0
1
12691
分享
相关文章
4步实现C++插件化编程,轻松实现功能定制与扩展(2)
本文是《4步实现C++插件化编程》的延伸,重点介绍了新增的插件“热拔插”功能。通过`inotify`接口监控指定路径下的文件变动,结合`epoll`实现非阻塞监听,动态加载或卸载插件。核心设计包括`SprDirWatch`工具类封装`inotify`,以及`PluginManager`管理插件生命周期。验证部分展示了插件加载与卸载的日志及模块状态,确保功能稳定可靠。优化过程中解决了动态链接库句柄泄露问题,强调了采纳用户建议的重要性。
33 4
4步实现C++插件化编程,轻松实现功能定制与扩展(2)
OpenKruise社区Rollouts组件重磅更新:即插即用的蓝绿发布能力
Kruise Rollouts作为OpenKruise社区提供的旁路组件,其能对原始工作负载进行增强。蓝绿发布是Kruise Rollouts在0.6.0版本中新引入的能力。
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
788 69
组件间通信的方式有哪些优劣势
组件间通信方式多样,包括直接引用、事件触发、状态管理等。直接引用简单直观但耦合度高;事件触发灵活解耦但过度使用会增加调试难度;状态管理适用于复杂应用,维护全局状态,但学习成本较高。
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
170 0
适应多样化需求:WASM 插件在全链路灰度发布中的应用
MSE(微服务引擎)在微服务全链路灰度场景下提供了一套成熟的功能,支持内容规则和百分比规则的灰度路由策略。
61685 27
KubeNest - 运维特征(Trait)配置化开发框架设计及实践
Trait配置化开发框架,提供了云原生应用在不同运行环境下使用不同运维能力可插拔架构,同时该框架首创去Operator的开发模式(配置化),能够极大缩短开发人员学习、开发成本,提高运维效率,减少资源浪费,同时还能保障数据一致性、安全可靠。目前该方案已经经过双十一的验证,能够保障云原生应用的多云异构资源的部署运维稳定性。
521 2
KubeNest - 运维特征(Trait)配置化开发框架设计及实践
【系统架构】组件与(模块化和应用集成)的区别
【系统架构】组件与(模块化和应用集成)的区别
408 0
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
1264 0
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格

云原生

+关注