渐进式发布对比:Kruise Rollouts vs Flux Flagger vs Argo Rollouts
ccwgpt 2024-10-29 13:23 93 浏览 0 评论
原生 Kubernetes Deployment 支持滚动更新(RollingUpdate) 策略,该策略在更新期间提供一组基本的安全保证(就绪探测)。但是,滚动更新策略面临许多限制:
- 对滚动更新速度的掌控不足
- 无法精确控制流量分发到新版本
- 就绪探针验证不够灵活和深入
- 无法查询外部指标以验证更新
- 无法自动中止和回滚更新
由于这些原因,在大规模大批量生产环境中,滚动更新通常存在较大风险,需要引入控制能力更强的渐进式交付能力。
渐进式交付
渐进性交付最早起源于大型、复杂的工业化项目,它试图将复杂的项目进行分阶段拆解,通过持续进行小型闭环迭代降低交付成本和时间。随着云原生架构不断发展,渐进性交付被广泛应用在互联网业务应用中,开发者通过GitOps、CI/CD方式集成渐进式交付框架,让新功能交付以流水线的方式分批执行,利用A/B 测试、金丝雀发布等技术精细化控制每一批次的流量策略,充分保障应用发布的稳定性。
渐进式交付是在受控和渐进中发布产品更新的过程方式,从而降低释放的风险,通常将自动化和检测分析相结合以实现自动升级或回滚。
渐进式交付通常被描述为持续交付的演变,通过限制将新版本暴露给一部分用户,观察和分析正确的行为,然后逐步增加对越来越广的受众的曝光率,同时持续不断验证正确性。
这里的核心理念可以总结为部署过程控制、验证分析、流量调度控制能力,通过增强这三种能力来实现可控的正确的交付。
在落地层面,渐进式交付通常体现为金丝雀发布(也称灰度发布)。
常见的部署策略
回顾常见的部署策略,有助于理解不同交付过程的区别和云原生渐进式交付的方案。
- 重建(Recreate):重新创建部署会在启动新版本之前删除应用程序的旧版本。因此,这可确保应用程序的两个版本永远不会同时运行,但在部署期间会出现停机。
- 滚动更新(RollingUpdate):慢慢地用新版本替换旧版本。随着新版本的出现,旧版本会按比例缩减,以保持应用程序的总数,这是 Deployment 对象的默认策略。但滚动更新有一个问题,在开始滚动更新后,流量会直接流向已经启动起来的新版本,但是这个时候,新版本是不一定可用的,比如需要进一步的测试才能确认。那么在滚动更新期间,整个系统就处于非常不稳定的状态,如果发现了问题,也比较难以确定是新版本还是老版本造成的问题。
- 蓝绿部署(Blue-Green):蓝绿部署同时部署了应用程序的新版本和旧版本,新版本上线过程中,不会修改老版本的任何内容,在部署期间老版本状态不受影响,应用始终在线。这允许在将实时流量切换到新版本之前针对新版本运行测试,并且只要老版本的资源不被删除,可以在任何时间迅速切回到老版本。但蓝绿部署要求在升级过程中,同时运行两套程序,对基础资源的要求就是日常所需的二倍。
- 金丝雀部署(Canary):金丝雀部署将一部分用户公开给新版本的应用程序,同时将其余流量提供给旧版本。一旦验证新版本正确,新版本就可以逐渐替换旧版本。通常金丝雀发布也称为灰度发布。
Kubernetes原生已经支持重建和滚动更新,接下来我们介绍三种与Kubernetes适配的支持金丝雀部署策略的云原生渐进式发布方案,都支持Ingress、GatewayAPI等流量控制能力以及多样的验证分析能力,支持完整的容器应用的渐进式发布能力,但在实现原理和细节上还是有一定区分。
Kruise Rollouts
Kruise Rollouts是一个 Bypass(旁路) 组件,提供高级渐进式交付功能,帮助实现应用程序的平稳和受控的更新部署,支持金丝雀、多批次和A/B测试交付模式,同时兼容 Gateway API 和各种 Ingress 实现,容易集成到现有基础设施中。
支持Deployment、CloneSet、StatefulSet、Advanced StatefulSet、Advanced DaemonSet 的多批次更新策略,也支持 Deployment 的金丝雀(Canary)更新策略。
金丝雀发布策略
CRD配置
apiVersion: rollouts.kruise.io/v1beta1
kind: Rollout
metadata:
name: rollouts-demo
spec:
workloadRef:
apiVersion: apps/v1
kind: Deployment
name: workload-demo
strategy:
canary:
enableExtraWorkloadForCanary: true
steps:
- traffic: 20%
trafficRoutings:
- service: service-demo
ingress:
classType: nginx
name: ingress-demo
从上面的配置可以看到,CRD将原生Deployment包在了内部,符合Kubernetes控制器模式,用新的Rollout控制器增强Deployment的能力,内部还是调度Deployment控制实现对ReplicaSet的控制,然后通过ReplicaSet控制Pod,即:
Rollout->Deployment->ReplicaSet->Pod
相当于起了多个Deployment来实现版本控制和更新,因此,也称为Bypass(旁路)模式。
具体执行过程如下:
当workload-demo应用更新时:
- workload-demo工作负载将被暂停,不会更新任何Pod;
- 将创建一个新的金丝雀Deployment,其副本数为workload-demo的“20%”(总计将有120%的Pods);
- 20%的流量将被引导到新的金丝雀Deployment的Pods。
当认为金丝雀验证已经通过并确认进行下一步时:
- workload-demo工作负载将使用本机滚动更新策略进行升级;
- 流量将恢复到原始的负载均衡策略;
- 金丝雀Deployment和Pods将被删除。
多批次发布策略(金丝雀变体)
apiVersion: rollouts.kruise.io/v1beta1
kind: Rollout
metadata:
name: rollouts-demo
spec:
workloadRef:
apiVersion: apps/v1
kind: Deployment
name: workload-demo
strategy:
canary:
enableExtraWorkloadForCanary: false
steps:
- replicas: 1
- replicas: 50%
- replicas: 100%
当workload-demo应用更新时:
- 在第一批中,将更新1个Pod,而replicas-1个Pod仍然保持在稳定版本,需要手动确认到下一批。
- 在第二批中,将更新50%的Pod,而50%的Pod仍然保持在稳定版本,需要手动确认到下一批。
- 在第三批中,将更新100%的Pod,而0个Pod仍然保持在稳定版本。
多批次发布策略与金丝雀发布策略不同,在发布过程中不会创建额外的Deployment。
Flux Flagger
Flux Flagger支持Kubernetes Deployment 和 DaemonSet的金丝雀、蓝绿发布。当部署应用程序的新版本时,Flagger会逐渐将流量转移到canary,同时监测请求成功率以及平均响应持续时间。支持通过自定义指标、验收测试和负载测试来扩展canary分析,以加强验证应用发布的过程。
金丝雀发布策略
CRD配置
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: podinfo
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: podinfo
service:
port: 9898
analysis:
interval: 1m
threshold: 10
maxWeight: 50
stepWeight: 5
metrics:
- name: request-success-rate
thresholdRange:
min: 99
interval: 1m
- name: request-duration
thresholdRange:
max: 500
interval: 1m
webhooks:
- name: load-test
url: http://flagger-loadtester.test/
metadata:
cmd: "hey -z 1m -q 10 -c 2 http://podinfo-canary.test:9898/"
方案也是Bypass(旁路),但提供了更多的验证分析能力,包括metric、webhook等,对于在发布过程中持续检测服务正常非常有用。
Flux的母公司Weaveworks很不幸在2024年年初倒闭了,曾在 2017 年提出了 GitOps 理念,并开源了Flux项目,非常可惜,Flux后续的路很难预料。
ArgoCD Rollouts
ArgoCD Rollouts与之前两个不同,它相当于Deployment的增强替代版,Argo Rollouts 控制器直接管理 ReplicaSet 的创建、扩展和删除,而不是管理Deployment。这些 ReplicaSet 由Rollouts资源中的字段定义,字段使用与Deployment相同的容器模板。
当 spec.template 更新后,会触发 Argo Rollouts 控制器执行更新流程,将创建新的 ReplicaSet。控制器将使用字段中的策略(spec.strategy)来确定从旧 ReplicaSet 到新 ReplicaSet 的更新,一旦新的 ReplicaSet 创建并扩展完成(并可选择通过 Analysis),控制器会将其标记为“stable”。
如果从 stable 的 ReplicaSet 过渡到新的 ReplicaSet 期间发生其他更改(即在更新过程中再次更新应用程序版本),则以前新的 ReplicaSet 将按比例缩小,并且控制器将尝试继续推进更新字段的 ReplicasSet,这和Deployment的逻辑是一样的。
金丝雀发布策略
CRD
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: example-rollout
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
minReadySeconds: 30
revisionHistoryLimit: 3
strategy:
canary: #Indicates that the rollout should use the Canary strategy
maxSurge: "25%"
maxUnavailable: 0
steps:
- setWeight: 10
- pause:
duration: 1h # 1 hour
- setWeight: 20
- pause: {} # pause indefinitely
上面的图片显示了一个金丝雀,有两个阶段(10%和33%的流量流向新版本),但这只是一个例子。使用 Argo Rollouts,您可以根据您的用例定义确切的阶段数量和流量百分比。
总结
组件 | Kruise Rollouts | Flux Flagger | Argo Rollouts |
核心概念 | 增强现有的工作负载 | 管理您的工作负载 | 替换您的工作负载 |
架构 | Bypass | Bypass | 新的工作负载类型 |
插拔和热切换 | 是 | 否 | 否 |
发布类型 | 多批次、金丝雀、A/B测试 | 金丝雀、蓝绿、A/B测试 | 多批次、金丝雀、蓝绿、A/B测试 |
工作负载类型 | Deployment、StatefulSet、CloneSet、Advanced StatefulSet、Advanced DaemonSet | Deployment、DaemonSet | Agro-Rollout |
流量类型 | Ingress、GatewayAPI、CRD(需要 Lua 脚本) | Ingress、GatewayAPI、APISIX、Traefik、SMI 等等 | Ingress、GatewayAPI、APISIX、Traefik、SMI 等等 |
迁移成本 | 无需迁移工作负载和Pods | 必须迁移Pods | 必须迁移工作负载和Pods |
HPA 兼容性 | 是 | 否 | 是 |
相关推荐
- 滨州维修服务部“一区一策”强服务
-
今年以来,胜利油田地面工程维修中心滨州维修服务部探索实施“一区一策”服务模式,持续拓展新技术应用场景,以优质的服务、先进的技术,助力解决管理区各类维修难题。服务部坚持问题导向,常态化对服务范围内的13...
- 谷歌A2A协议和MCP协议有什么区别?A2A和MCP的差异是什么?
-
在人工智能的快速发展中,如何实现AI模型与外部系统的高效协作成为关键问题。谷歌主导的A2A协议(Agent-to-AgentProtocol)和Anthropic公司提出的MCP协议(ModelC...
- 谷歌大脑用架构搜索发现更好的特征金字塔结构,超越Mask-RCNN等
-
【新智元导读】谷歌大脑的研究人员发表最新成果,他们采用神经结构搜索发现了一种新的特征金字塔结构NAS-FPN,可实现比MaskR-CNN、FPN、SSD更快更好的目标检测。目前用于目标检测的最先...
- 一文彻底搞懂谷歌的Agent2Agent(A2A)协议
-
前段时间,相信大家都被谷歌发布的Agent2Agent开源协议刷屏了,简称A2A。谷歌官方也表示,A2A是在MCP之后的补充,也就是MCP可以强化大模型/Agent的能力,但每个大模型/Agent互为...
- 谷歌提出创新神经记忆架构,突破Transformer长上下文限制
-
让AI模型拥有人类的记忆能力一直是学界关注的重要课题。传统的深度学习模型虽然在许多任务上取得了显著成效,但在处理需要长期记忆的任务时往往力不从心。就像人类可以轻松记住数天前看过的文章重点,但目前的...
- 不懂设计?AI助力,人人都能成为UI设计师!
-
最近公司UI资源十分紧张,急需要通过AI来解决UI人员不足问题,我在网上发现了几款AI应用非常适合用来进行UI设计。以下是一些目前非常流行且功能强大的工具,它们能够提高UI设计效率,并帮助设计师创造出...
- 速来!手把手教你用AI完成UI界面设计
-
晨星技术说晨星技术小课堂第二季谭同学-联想晨星用户体验设计师-【晨星小课堂】讲师通过简单、清晰的语言描述就能够用几十秒自动生成一组可编辑的UI界面,AIGC对于UI设计师而言已经逐步发展成了帮助我们...
- 「分享」一端录制,多端使用的便捷 UI 自动化测试工具,开源
-
一、项目介绍Recorder是一款UI录制和回归测试工具,用于录制浏览器页面UI的操作。通过UIRecorder的录制功能,可以在自测的同时,完成测试过程的录制,生成JavaScr...
- APP自动化测试系列之Appium介绍及运行原理
-
在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。Appium介绍Appium概念Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序...
- 【推荐】一个基于 SpringBoot 框架开发的 OA 办公自动化系统
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍oasys是一个基于springboot框架开发的OA办公自动化系统,旨在提高组织的日常运作和管理...
- 自动化实践之:从UI到接口,Playwright给你全包了!
-
作者:京东保险宋阳1背景在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的...
- 销帮帮CRM移动端UI自动化测试实践:Playwright的落地与应用
-
实施背景销帮帮自2015年成立以来,移动端UI自动化测试的落地举步维艰,移动端的UI自动化测试一直以来都未取得良好的落地。然而移动互联网时代,怎样落地移动端的UI自动化测试以快速稳定进行移动端的端到端...
- 编写自动化框架不知道该如何记录日志吗?3个方法打包呈现给你。
-
目录结构1.loguru介绍1.1什么是日志?程序运行过程中,难免会遇到各种报错。如果这种报错是在本地发现的,你还可以进行debug。但是如果程序已经上线了,你就不能使用debug方式了...
- 聊聊Python自动化脚本部署服务器全流程(详细)
-
来源:AirPython作者:星安果1.前言大家好,我是安果!日常编写的Python自动化程序,如果在本地运行稳定后,就可以考虑将它部署到服务器,结合定时任务完全解放双手但是,由于自动化程序与平...
- 「干货分享」推荐5个可以让你事半功倍的Python自动化脚本
-
作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)