云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
5442 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

25|生产稳定的秘密武器:如何实施金丝雀发布?

你好,我是王炜。
上一节课,我们介绍了什么是蓝绿发布以及如何实施蓝绿发布。蓝绿发布是一种通过资源冗余来换取回滚效率的发布方式,结合 Argo Rollout ,能够很方便地实现自动化的流量切换。
但是它的缺点也是比较明显的:当新环境准备好之后,流量将进行全量切换,无法对新环境进行小规模的流量验证。
为了更好地了解新环境的性能和潜在的问题,最好的办法是让新的环境接收一小部分生产流量。通常,我们会把一定比例的生产流量转发到新的环境,以此来验证新环境的表现。这种发布方式就叫做金丝雀发布,又叫做灰度发布
在矿物开采早期,由于缺少有毒气体探测器,矿工下井之后的死亡率非常高。后来,人们发现金丝雀鸟对有害气体非常敏感,于是把金丝雀鸟投入到矿井中充当探测器的角色,以此来保护矿工。
新环境就像金丝雀鸟,首当其冲“探测”生产环境的潜在问题,以此来提升发布的安全性。
在这节课,我会先通过一个例子来说明如何以手动的方式来实施金丝雀发布,然后,我会结合 Argo Rollout 这款工具来进一步介绍如何自动化金丝雀发布过程。
在开始今天的学习之前,你需要具备以下前提条件。
按照第 2 讲的内容在本地配置好 Kind 集群,安装 Ingress-Nginx,并暴露 80 和 443 端口。
配置好 Kubectl 使其能够访问 Kind 集群。
按照第 24 讲的内容安装好 Argo Rollout 以及 kubectl 插件。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • FelixFly
    老师,请教一个问题,若是单一链路有10个微服务,可以直接实现某一个金丝雀服务调用么?还是说这10个微服务都需要部署金丝雀

    作者回复: 可以实现,需要配合 Service Mesh 做动态的路由,本质上是在请求里面带上特殊的标识。

    归属地:安徽
    3
  • 邵涵
    几个问题: 1. 使用Rollout的自动化金丝雀发布流程中,金丝雀环境里的pod数量也是和生产环境中的pod一样多?如果是,那有没有让生产环境pod数量递减、金丝雀环境pod递增的方式?就像deployment本身的更新那样渐进式更新pod、pod总量几乎不变 2. 如果只使用header的转发规则,不使用百分比权重的方式,那在strategy.canary.steps下,是就只定义pause就可以了? 3. 自动化金丝雀发布过程中,Argo Rollout自动为金丝雀环境创建的ingress,在其nginx.ingress.kubernetes.io/canary-weight将为0之后,会被删除吗?还是留给下次金丝雀发布复用? 4. 对于手动金丝雀发布的例子,我实验的结果是后创建的金丝雀环境的ingress不起作用,一直都是蓝色的,只有删掉生产环境的ingress,金丝雀环境的ingress才起作用,但也就都是绿色的了,没有蓝色了,这个原因大概可能是什么?

    作者回复: 1. Rollout 的发布过程和创建了两个 Deployment 有点类似,你可以通过 HPA 来控制副本数,参考:https://argoproj.github.io/argo-rollouts/features/hpa-support/。 2. 可以这样做。 3. 可以通过实验验证一下,抱歉我没有留意这个细节。 4. 检查 ingress 对象中定义的注解和你实际部署 nginx-ingress 实例是否一致(kubernetes.io/ingress.class: nginx),另外 ingress-nginx 的部署版本是否大于课程部署的版本。

    归属地:北京
    2
  • 木杉
    其实流程看起来很简单,但实际上需要考虑的东西还有很多,灰度发布并不是单单在cicd一侧就可以解决的,比如按照简单的50%-50%流量区分新老版本,1个浏览器的前端请求会在2个版本上换来换去,而不是同一个浏览器的请求始终路由到同一版本,会导致1个用户在2个版本不停切来切去,引发很多问题,前端是这样,后端也如此。

    作者回复: 是的,一般配合条件路由策略使用。

    归属地:广东
    1
  • 邵涵
    “在手动实施蓝绿发布的过程中,如何将金丝雀环境提升为生产环境?” 这里是说手动实施“金丝雀发布”吗?如果是的话,那么一个比较快速的方式可能是将生产环境的ingress的service改为金丝雀环境的service,并将金丝雀环境的ingress的canary-weight降为0,将原生产环境的deployment的replicas降为0。不过这样做存在的问题是下次执行金丝雀发布时,不能用完全相同的标签去创建金丝雀环境的service、deployment

    作者回复: 正确,操作起来是非常麻烦的。

    归属地:北京
    1
  • Noel ZHANG
    看起来这两个service是并列的交替职责的关系,并不是demo-canary的就一定分担canary pods的流量。是这样么?

    作者回复: 是的,取决于 ingress 的流量调度。

    归属地:江苏
    1
  • ghostwritten
    1. 蓝绿发布相对于金丝雀发布(灰度发布)缺点是流量将进行全量切换时无法对新环境进行小规模的流量验证。 2. 手动进行金丝雀发布部署对象是deployment,重点是在Ingress配置策略。 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-ingress-canary annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" nginx.ingress.kubernetes.io/canary-by-header: "X-Canary" 3. 自动化金丝雀发布重点是crd——Rollout 对象。可以自定义配置发布策略。 strategy: canary: canaryService: canary-demo-canary stableService: canary-demo canaryMetadata: labels: deployment: canary stableMetadata: labels: deployment: stable trafficRouting: nginx: stableIngress: canary-demo additionalIngressAnnotations: canary-by-header: X-Canary steps: - setWeight: 20 - pause: {} - setWeight: 50 - pause: duration: 30s - setWeight: 70 - pause: duration: 30s 4. 重点金丝雀配置理解: canaryService 表示金丝雀 Service 的名称,我们会在稍后创建它。 stableService 表示生产环境 Service 的名称,同样也需要在稍后创建。 canaryMetadata 和 stableMetadata 字段表示在金丝雀发布时,会将额外的标签增加到 Pod 中,它可以区分不同环境的 Pod。 trafficRouting.nginx 字段表示使用 Ingress-Nginx 来管理流量 trafficRouting.nginx.stableIngress 字段用来指定 Ingress 名称,这个 Ingress 需要我们提前创建。trafficRouting.nginx.additionalIngressAnnotations 字段用来配置特定的金丝雀流量识别策略,这里的含义是当请求头出现 X-Canary 时,就将流量转发到金丝雀环境中。 此外,还有一项重要的配置:canary.steps,它是用来描述如何进行自动化金丝雀发布。在这个例子中,自动化金丝雀的配置如下。 将金丝雀环境的流量比例配置为 20%。 暂停金丝雀发布,直到手动批准。 将金丝雀环境的流量比例配置为 50%,并持续 30 秒 。将金丝雀环境的流量比例配置为 70%,并持续 30 秒。

    作者回复: 👍🏻很棒的总结。

    归属地:北京
    1
  • Sophia-百鑫
    老师好,如果canary 发布完成后,发现prod 环境有问题,需要立即回滚版本。这时的应急处理我能想到的是 修改rollout.yaml 中image 版本和修改steps 中发布策略,setWeight:100%,其他步骤都删掉。 是这样吗?是否还有其他方法?

    作者回复: 可以在 ago rollout 控制台直接回滚

    归属地:上海
  • 老师,用你的例子在华为云集群做验证,创建并查询 rollout 时报error creating canary ingress `canary-demo-canary-demo-canary`: ingresses.extensions "canary-demo-canary-demo-canary" is forbidden: service "canary-demo-canary" not found,能否提供一下些排查思路?canary-demo-canary我已经创建过了

    作者回复: 看这个报错可能和华为云有一些特殊机制有关,我暂时也没有排查思路。金丝雀实验不依赖云厂商的服务,你可以尝试本地的 KiND 集群来实验,另外也可以提交一个工单让云厂商帮忙排查。

    归属地:天津
  • yuer
    老师,原生的k8s实现金丝雀的发部方式,也可以通过写脚本完成自动化发部。

    作者回复: 可以的,只是比较麻烦,而且自己写的脚本不一定能很好地支持幂等。

    归属地:北京
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部