百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

渐进式发布对比:Kruise Rollouts vs Flux Flagger vs Argo Rollouts

ccwgpt 2024-10-29 13:23 93 浏览 0 评论

原生 Kubernetes Deployment 支持滚动更新(RollingUpdate) 策略,该策略在更新期间提供一组基本的安全保证(就绪探测)。但是,滚动更新策略面临许多限制:

  • 对滚动更新速度的掌控不足
  • 无法精确控制流量分发到新版本
  • 就绪探针验证不够灵活和深入
  • 无法查询外部指标以验证更新
  • 无法自动中止和回滚更新

由于这些原因,在大规模大批量生产环境中,滚动更新通常存在较大风险,需要引入控制能力更强的渐进式交付能力。

渐进式交付

渐进性交付最早起源于大型、复杂的工业化项目,它试图将复杂的项目进行分阶段拆解,通过持续进行小型闭环迭代降低交付成本和时间。随着云原生架构不断发展,渐进性交付被广泛应用在互联网业务应用中,开发者通过GitOps、CI/CD方式集成渐进式交付框架,让新功能交付以流水线的方式分批执行,利用A/B 测试、金丝雀发布等技术精细化控制每一批次的流量策略,充分保障应用发布的稳定性。

渐进式交付是在受控和渐进中发布产品更新的过程方式,从而降低释放的风险,通常将自动化和检测分析相结合以实现自动升级或回滚。

渐进式交付通常被描述为持续交付的演变,通过限制将新版本暴露给一部分用户,观察和分析正确的行为,然后逐步增加对越来越广的受众的曝光率,同时持续不断验证正确性。

这里的核心理念可以总结为部署过程控制、验证分析、流量调度控制能力,通过增强这三种能力来实现可控的正确的交付。

在落地层面,渐进式交付通常体现为金丝雀发布(也称灰度发布)。

常见的部署策略

回顾常见的部署策略,有助于理解不同交付过程的区别和云原生渐进式交付的方案。

  1. 重建(Recreate):重新创建部署会在启动新版本之前删除应用程序的旧版本。因此,这可确保应用程序的两个版本永远不会同时运行,但在部署期间会出现停机。
  2. 滚动更新(RollingUpdate):慢慢地用新版本替换旧版本。随着新版本的出现,旧版本会按比例缩减,以保持应用程序的总数,这是 Deployment 对象的默认策略。但滚动更新有一个问题,在开始滚动更新后,流量会直接流向已经启动起来的新版本,但是这个时候,新版本是不一定可用的,比如需要进一步的测试才能确认。那么在滚动更新期间,整个系统就处于非常不稳定的状态,如果发现了问题,也比较难以确定是新版本还是老版本造成的问题。
  3. 蓝绿部署(Blue-Green):蓝绿部署同时部署了应用程序的新版本和旧版本,新版本上线过程中,不会修改老版本的任何内容,在部署期间老版本状态不受影响应用始终在线。这允许在将实时流量切换到新版本之前针对新版本运行测试,并且只要老版本的资源不被删除,可以在任何时间迅速切回到老版本。但蓝绿部署要求在升级过程中,同时运行两套程序,对基础资源的要求就是日常所需的二倍。
  4. 金丝雀部署(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...

取消回复欢迎 发表评论: