使用金丝雀模式增强升级稳定性

金丝雀发布指在原有部署版本可用的情况下,同时部署新版本应用作为金丝雀,测试新版本的性能。在保证整体系统稳定的情况下,协助尽早发现问题和修复问题。本文介绍如何使用金丝雀模式增强升级稳定性。

适用范围

工作原理

阿里云服务网格ASM支持基于修订与标签的升级模式,以更稳定安全的方式执行新版本控制面的金丝雀升级。在新升级模式中,数据面的网格代理将与其使用的特定控制面版本相关联。这使得新版本能够以较低的风险在集群中部署,直到明确选择之前,没有代理连接到新版本。同时也允许将工作负载逐步迁移到新的控制面,每个独立的控制面被称为修订版并具有istio.io/rev标签。

为了支持这种基于修订的升级,Istio为命名空间引入了一个istio.io/rev标签。它可以指示哪个控制面版本应该为相应命名空间中的工作负载注入Sidecar代理。例如,标签istio.io/rev=1-23-6表示为该命名空间中的工作负载注入1.23.6版本的Sidecar代理。

在金丝雀升级过程中,可通过将部分服务先升级的方式来验证目标版本是否符合预期,若验证结果不符合预期,可以快速进行回滚来保证服务的稳定性。版本验证符合预期后,可以将金丝雀版本切换为当前版本,并通过滚动更新方式将所有工作负载升级到最新版本,完成数据面的升级,并卸载旧版本完成所有升级步骤。

准备工作

由于在金丝雀升级中,验证阶段需要显式地通过命名空间标签来指定注入的Sidecar代理版本,因此金丝雀升级具有对注入策略的前置要求。请按照以下步骤确认注入策略配置是否满足金丝雀升级条件。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择数据面组件管理 > 注入策略配置

  3. 注入策略配置页面的注入策略配置管理区域,确认Pod所在命名空间的标签需要满足条件包含 istio-injection: enabledDingtalk_20230724162312.png

    说明

    istio-injection: enabledistio.io/rev: stable具有相同的语义。在金丝雀升级过程中,将使用istio.io/rev: stable为对应命名空间中的Pod注入稳定版本网格代理,使用istio.io/rev: canary为对应命名空间中的Pod注入金丝雀版本的网格代理。

    升级完成后,即使不将istio.io/rev:stable替换回istio-injection: enabled,也可以正常注入,因为这两个标签的语义完全一致。

    升级前的状态如下所示:

    image

步骤一:升级ASM控制面

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 升级管理页面,单击金丝雀升级页签,在控制面页签下选择金丝雀版本新建负载均衡CLB实例,单击确认,然后在确认升级?对话框,单击确定

    金丝雀升级最多跨一个次要版本升级,本示例的ASM实例版本为1.22,最高可升级到1.23。本文以升级到v1.23.6为例进行说明。金丝雀升级的目标版本部署时会创建一个与之关联的CLB实例,若无特别需求,CLB实例选择默认的规格即可。关于CLB实例的计费说明,请参见CLB计费概述

    金丝雀版本的部署是一个异步的过程,大致需要几分钟,请等待相关组件部署完成。新版本部署完成后,界面显示如下。

    Snipaste_2025-10-28_10-10-05

    此时状态如下所示:

    image

步骤二:升级reviews-v2的注入代理到新版本

步骤一通过金丝雀升级方式部署了一个v1.23.6版本的Istio控制面。下文以在Bookinfo应用的reviews-v2版本更新其注入的网格代理版本到v1.23为例,验证该版本是否符合预期。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 全局命名空间

  3. 全局命名空间页面的自动注入列,查看default命名空间对应的标签是否为istio-injection: enabled

    若标签为istio-injection: enabled,表明注入的是1.22版本的网格代理。

  4. 全局命名空间页面的自动注入列,单击default命名空间对应的切换为注入1-23-6版本,在确认对话框,单击确定

    default全局命名空间的标签将切换为istio.io/rev: canary,并立即将数据面default命名空间标签也同步成istio.io/rev: canary。此时全局命名空间页面显示default注入的是1.23版本的网格代理。命名空间default下新创建的工作负载(Pod)将注入1.23版本的网格代理。其他命名空间的标签未更改,依然注入当前1.22版本的网格代理。

    说明

    上述步骤是为一个在升级前已经开启自动注入的命名空间切换注入的Sidecar网格代理版本。对于升级前尚未开启Sidecar网格代理注入的命名空间,可正常地为其开启自动注入。注入时,请按需选择注入的Sidecar网格代理版本。服务网格将根据选择的版本,为命名空间打上istio.io/rev:stableistio.io/rev:canary的标签。

  5. 滚动更新reviews-v2工作负载。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面的操作列,单击reviews-v2对应的更多 > 重新部署,然后在重新部署对话框,单击确定

  6. 无状态页面,单击reviews-v2,在容器组页签,查看滚动更新后的reviews-v2对应的Pod是否启动成功,以及新的Pod是否注入了1.23对应的Sidecar代理版本。

    Snipaste_2025-10-a-03-28

    可以看到滚动更新后的reviews-v2对应的Pod启动成功,且新的Pod成功注入了v1.23版本的Sidecar网格代理。

  7. 打开浏览器,访问Bookinfo页面,检查流量是否符合预期。

    如下图所示,可以正常访问到reviews-v2版本,符合预期。访问bookinfo页面.png

    此时状态如下所示:

    image

步骤三:回滚reviews-v21.22版本

步骤二验证失败,或者因为其他原因需要进行回滚,请参照以下步骤。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 全局命名空间

  3. 全局命名空间页面的自动注入列,单击default命名空间对应的切换为注入1-22-6版本,然后在确认对话框,单击确定

    回滚前的命名空间标签为istio.io/rev: canary,default注入的是1.23版本的网格代理。

    回滚后的标签将切换为istio.io/rev: stable,并且数据面default命名空间标签也同步为istio.io/rev: stable,default注入的是1.22版本的网格代理。

  4. 在容器服务控制台重新部署reviews-v2工作负载。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面上方,命名空间选择default,然后在操作列,单击reviews-v2对应的更多 > 重新部署,在重新部署对话框,单击确定

    4. 无状态页面,单击reviews-v2名称,在容器组页签查看滚动更新后的reviews-v2对应的Pod是否启动成功,新的Pod是否注入了1.22对应的Sidecar代理版本。

      Snipaste_2025-10-a-03-28

      可以看到滚动更新后的reviews-v2对应的Pod启动成功,且新的Pod注入了1.22对应的Sidecar代理版本。

步骤四:撤销升级

回滚成功后,可撤销金丝雀升级,将ASM实例恢复为最初的1.22版本。

重要

撤销升级前,请确保所有命名空间都已注入稳定Sidecar代理版本,否则无法撤销。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 升级管理页面的金丝雀升级页签,单击撤销升级,然后在确认撤销升级吗?对话框,单击确定

    单击撤销升级后,将会删除升级中的灰度版本的控制面组件(即示例中的1.23版本),只保留稳定版本的控制面组件(即示例中的1.22版本)。

    此时状态如下所示:

    image

步骤五:重新升级及验证

此时整个ASM实例处于步骤一之前待升级的状态。本示例仅验证reviews-v1、reviews-v2reviews-v3三个工作负载。请根据实际情况,参照上述步骤对任意的工作负载进行升级验证,直至验证通过。

  1. 重新执行步骤一,使ASM集群处于升级控制面灰度版本中。

  2. 重新执行步骤二,验证注入新版本的代理是否符合预期。

    例如,通过容器服务控制台重新部署reviews-v1、reviews-v2reviews-v3无状态工作负载。可看到reviews-v1、reviews-v2以及reviews-v3Pod都注入了1.23版本的Sidecar网格代理。

步骤六:验证符合预期,切换为正式版本

通过上述步骤,已验证reviews-v1、reviews-v2reviews-v3可以使用1.23(新版本)的网格代理,并且功能符合预期。此时,可选择是否将1.23版本切换为正式版本。

重要
  • 一旦进行版本切换,意味着升级已经进入旧版本下线阶段。只能将现有工作负载全部切换成新的1.23版本的Sidecar网格代理,无法再撤销升级。请确保在新版本部署阶段完成全部验证工作。

  • 在版本切换后,带有istio.io/rev: stableistio-injection: enabled标签的命名空间将注入新的1.23版本的Sidecar网格代理,而istio.io/rev: canary标签将失去作用。因此,在版本切换时,ASM会自动将所有istio.io/rev: canary标签切换为istio.io/rev: stable。请在升级管理页面的金丝雀升级页签,单击版本切换时进行确认。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 升级管理页面的金丝雀升级页签,单击版本升级,在确认版本切换吗对话框,仔细阅读提示内容,确认无误后单击确定

    切换成功后,已经注入的1.22版本的网格代理依然保留,对应的工作负载不受影响。但重新部署的Pod将全部注入1.23版本的Sidecar代理。切换更新完成后的界面如下。

    Snipaste_2025-10-28_10-10-05

    此时状态如下所示:

    image

步骤七:数据面升级

此时ASM的版本为1.23,命名空间标签istio.io/rev=stableistio.io/rev=1-23-6istio-injection=enabled都注入1.23版本的Sidecar网格代理。通过滚动更新工作负载,可以升级注入的Sidecar网格代理到当前新版本1.23,以此完成数据面升级。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 升级管理页面的金丝雀升级页签,单击数据面页签,按需升级ASM网关或工作负载。

    • 升级ASM网关:在ASM网关区域的操作列,单击目标网关对应的滚动升级,在确认执行滚动升级吗?对话框,单击确定,将ASM网关升级到1.23新版本。

    • 升级工作负载:在待升级工作负载区域,切换命名空间,然后在操作列,单击目标工作负载对应的滚动升级,在确认执行滚动升级吗?对话框,单击确定,将工作负载升级到1.23新版本。

      数据面升级.png

      说明

      列表中不会显示已完成升级的ASM网关或工作负载。

      也可在左侧导航栏,单击网格状态,查看全局未升级的工作负载或网关实例。

      数据面升级完成后,状态如下所示。

      image

步骤八:下线旧版本

当数据面所有工作负载升级完成后,可将旧版本1.22进行下线操作。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 升级管理

  3. 升级管理页面的金丝雀升级页签,单击下线旧版本,在确认下线旧版本控制面吗?对话框,单击确定

    此时状态如下所示。

    image