一、前言

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

二、Gateway API

Ingress API 是 K8s 中针对服务网关的抽象,也是目前 K8s 社区中使用最为广泛的网关资源,其中最具代表性的有 Nginx Ingress Controller。但是 Ingress 资源也存在一些问题,主要是 Ingress 定义比较单一,不能很好的满足一些复杂的网络需求。很多场景下 Ingress 控制器都需要通过定义 Annotations 或者 CRD 的方式来进行扩展,比如,Istio 就扩展了 Virtual Service、DestinationRule 资源。

为了解决上述问题,推动社区使用统一的标准,SIG-NETWORK 社区提出了 Gateway API 资源,它是 Kubernetes 中的一个 API 资源集合,包括 GatewayClass、Gateway、HTTPRoute、TCPRoute、Service 等,这些资源共同为各种网络用例构建模型。目前 Istio、Nginx、Kong 等诸多社区开源项目都已经实现了该接口。而 Kruise Rollout 作为渐进式交付框架,理所当然的需要支持,如下是使用 Gateway API 进行金丝雀发布的例子:


apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:name: echoserver
spec:hostnames:- test.app.domainrules:- backendRefs:- group: ""name: echoserverport: 80
---
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
spec:objectRef:...strategy:canary:steps:- weight: 20pause: {}trafficRoutings:- service: echoservergateway:httpRouteName: echoserver

三、StatefulSet & Advanced StatefulSet 分批发布

Kruise Rollout 在 v0.1.0 版本已经支持了无状态应用(Deployment 和 CloneSet)的分批发布能力,而有状态的应用同样有类似的诉求。社区 StatefulSet 本身支持发布过程中保留旧版本 Pod 数量的能力(Order 小于 Partition 的 Pod 保留旧版本),所以 Kruise Rollout 通过该特性也可以非常方便的集成有状态工作负载(包括:Kruise 扩展 的 Advanced StatefulSet)。如下是一个分三批发布的例子:


apiVersion: apps/v1
kind: StatefulSet
metadata:name: echoserver
spec:replicas: 5template:spec:containers:- name: echoserverimage: cilium/echoserver:latest
---
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:name: rollouts-demo
spec:objectRef:workloadRef:apiVersion: apps/v1kind: StatefulSetname: echoserverstrategy:canary:steps:- replicas: 1pause: {}- replicas: 2pause: {duration: 60}- replicas: 2

四、Rollout 批次打标能力

Kruise Rollout 在设计之初就考虑了很多易用性的问题,它可以与社区很多优秀部署方案快速集成,比如:用户可以使用 Helm 完成应用的 Rollout 交付。随着 Kruise Rollout 使用的用户以及规模的增大,对易用性方面又提出了新的要求,例如:

  • 金丝雀发布过程中,发现业务监控有些许的异常,希望能快速的过滤出第一批发布的 Pod 排查问题

  • 容器平台产品规划有发布详情页,希望能够精准的展示每次批次的 Pod,以及 Rollout 的进度、过程

为了满足上述需求,Kruise Rollout 新增了“Pod 批次打标”能力,在 Rollout 过程中能够对每一批次的 Pod 打上对应批次的 Label[apps.kruise.io/rollout-batch-id]={Value为对应的批次,如:1,2,3...},用法如下:


apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:name: rollouts-demo
spec:...# requiredrolloutID: v1 
  • rolloutID 是针对每次发布的一个发布 ID。该字段由上层 PaaS 平台或用户填写,可以是任意的字符串,前后两次发布需要不同,例如:webserver-20220728120533。为什么一定需要 rolloutID?主要是由于 CloneSet 支持原地升级,针对这种场景 Pod 上面包含的发布批次 Label 有可能是上次发布留下的,所以与 rolloutID 共同使用可以标记此次发布的任意批次。

五、KubeVela 基于 Kruise Rollout 实现金丝雀发布能力

KubeVela[2]是一款基于 OAM 模型的云原生应用管理平台,具有完善的应用交付、应用分发以及多集群管理等能力。目前 Kruise Rollout 已经集成到 KubeVela 之中,通过 trait 的方式可以非常便捷的实现 Helm Charts 金丝雀发布能力,详情请参考文末文档[3],如下:


apiVersion: core.oam.dev/v1beta1
kind: Application
spec:components:- name: canary-demotype: webserviceproperties:image: barnett/canarydemo:v1traits:- type: kruise-rolloutproperties:canary:steps:# The first batch of Canary releases 20% Pods, and 20% traffic imported to the new version, require manual confirmation before subsequent releases are completed- weight: 20trafficRoutings:- type: nginx

六、最后

Kruise Rollout 作为一种旁路式的渐进式交付框架,能够非常方便的与社区内优秀的应用交付平台集成。用户基本上不需要做额外的改动,只需要一份 Kruise Rollout CRD 定义即可。

欢迎大家适用,如果中间遇到任何问题可以 Issue 或者群里沟通。

参考链接:

[1] Kruise Rollout:https://github.com/openkruise/rollouts

[2] KubeVelahttps://kubevela.io/

[3] 文档:https://kubevela.net/docs/end-user/traits/rollout

Github:https://github.com/openkruise/rollouts

Official:https://openkruise.io/

Slack: Channel in Kubernetes Slack

Kruise Rollout v0.2.0 版本发布:支持 Gateway API、StatefulSet 分批发布等能力相关推荐

  1. OpenKruise v0.8.0 版本:K8s 社区首个规模化镜像预热能力

    简介:OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目.它来自 ...

  2. OpenKruise v0.5.0 版本发布,支持无损的流式分批发布策略

    作者 | 酒祝  阿里云技术专家 导读:OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment/StatefulSet 等控制 ...

  3. OpenKruise v0.9.0 版本发布:新增 Pod 重启、删除防护等重磅功能

    作者 | 王思宇(酒祝) Photo Creidt@ 王思宇(酒祝) 背景 ​ OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computin ...

  4. OpenKruise v0.8.0 版本发布:K8s 社区首个规模化镜像预热能力

    作者 | 王思宇(酒祝) 来源 | 阿里巴巴云原生公众号 背景 OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Founda ...

  5. OpenKruise v0.7.0 版本发布:新增周期任务分发控制器

    作者 | 王思宇(酒祝) 来源|阿里巴巴云原生公众号 前言 OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment/State ...

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

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

  7. OpenKruise v0.5.0 版本发布 | 云原生生态周报 Vol. 50

    作者 | 丁海洋.张晓宇.宋净超.孙健波 业界要闻 OpenKruise v0.5.0 版本发布,支持无损的流式分批发布策略 OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在 Kube ...

  8. Databend v0.9.0 版本发布

    各位社区小伙伴们,历经数月开发,Databend 于 2023 年 1 月 13 日迎来了 v0.9.0  版本的正式发布! 这次新版本是 Databend 迈向 1.0 版本的最后一个大版本,也是迄 ...

  9. PouchContainer 发布 0.3.0 版本,支持 Kubernetes 拥抱 CNCF 生态

    划重点 PouchContainer 是一款轻量级.开源的富容器技术,拥有快速高效.隔离性强.可移植性高.资源占用少等特性,可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用 ...

  10. MongoDB发布4.0版本,支持ACID事务

    MongoDB最近发布了最新的4.0版本. 毫无疑问,这一版本的主要特性是支持多文档ACID事务.MongoDB向与关系型数据库产品的融合迈出了一大步,现在支持会话的概念,并可以使用start_tra ...

最新文章

  1. freeMarker语法
  2. linux文件目录类常用命令
  3. 浏览器复制不进行url编码_谷歌浏览器测试版支持在PC上复制号码并操作关联安卓设备进行拨打...
  4. RFID和WiFi定位技术的比较
  5. 为什么不能根据返回类型来区分重载
  6. 2019 最全阿里天猫Java 3面真题,含面试题答案!
  7. FAL风控培训|如何用一张图了解所有特征工程的套路
  8. python购物车代码_python简单商城购物车实例代码
  9. 产品设计:《设计美学》
  10. java 排序sort_Java排序方法sort的使用详解(转)
  11. 【C语言】计算一元二次方程的解
  12. 前端面试题总结(js、html、小程序、React、ES6、Vue、全栈)
  13. doris 动态分区
  14. Spring Boot框架入门到进阶教程(自学版)
  15. excel表格行宽列高怎么设置_解决方案:Excel自动调整列宽和行宽什么是快捷键? [Excel设置行高度自适应]...
  16. 0428-团队项目2
  17. 安全锁界面,防止底部上滑触发人脸解锁与绘制图案锁冲突
  18. plSql使用技巧及优化
  19. 在我们睡觉的时候,程序能不能自动查 bug?
  20. 函数【七】高阶函数/内置函数

热门文章

  1. numpy学习线性回归, 并用matplotlib画动态图
  2. python处理word文档中的某页_Python快速设置Word文件中指定段落为目录标题
  3. KendoUI系列:switch 开关
  4. Sharepoint 2010 学习资源总结
  5. hihocoder 1538
  6. 【C语言刷题】汉诺塔问题
  7. 面向对象,继承封装的应用
  8. UNIX网络编程学习笔记(Racoon)
  9. Matlab中将横纵坐标改为自定义标签(set(gca,xtick)set(gca,xticklabel))
  10. Address Sanitizer(Asan)原理及相关GCC选项列表