使用服务网格ASM的金丝雀模式提升升级稳定性

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 阿里云服务网格ASM支持基于修订与标签的升级模式,以更稳定安全的方式执行新版本控制面的金丝雀升级。在这个新升级模式中,数据面的网格代理将与他们使用的特定控制面版本相关联。这使得新版本能够以较低的风险在集群中部署, 直到用户明确选择之前,没有代理连接到新版本。同时也允许逐渐将工作负载迁移到新的控制面,每个独立的控制面被称为“修订版”并具有istio.io/rev标签。为了支持这种基于修订的升级,Istio为命名空间引入了一个istio.io/rev标签。它可以指示哪个控制面版本应该为相应命名空间中的工作负载注入Sidecar代理。例如,标签istio.io/rev=1-17-2表示为该命名

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

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

前提条件

操作步骤

前置步骤:确认注入策略

由于在金丝雀升级中,验证阶段需要显式地通过命名空间标签来指定注入的Sidecar代理版本,因此金丝雀升级具有对注入策略的前置要求。

  1. 进入 Sidecar管理(数据面)> 注入策略配置,找到 注入策略配置管理
  2. 确认注入策略的第一项(即Pod所在命名空间的标签需要满足)为包含istio-injection: enabled

image.png

注: istio-injection: enabled 与 istio.io/rev: stable具有相同的语义。在金丝雀升级过程中,我们将使用istio.io/rev: stable为对应命名空间中的Pod注入稳定版本网格代理,使用istio.io/rev: canary为对应命名空间中的Pod注入金丝雀版本的网格代理。
升级完成后,即使不将istio.io/rev:stable替换回istio-injection: enabled ,也可以正常注入,因为这两个标签的语义完全一致。

升级前的状态如下所示:

image.png

步骤一:升级ASM 控制面

在ASM 实例控制台下,进入 “升级管理” 菜单下,选择 “金丝雀升级” , 可以看到如下界面:

image.png

金丝雀升级最多跨一个次要版本升级,当前实例为1.16,则最高可升级到1.17或者1.18。选择要升级的目标版本,比如本示例中升级到v1.17.2.37。

选择确定要升级的版本后,点击“确认” 按钮,则会部署对应的金丝雀目标版本。金丝雀升级的目标版本部署时会创建与之关联的一个CLB 实例,若没特别需求,CLB 实例选择默认的规格即可。请注意, 新增的CLB实例对应的计费说明参考:https://help.aliyun.com/document_detail/27539.html?spm=5176.13895322.0.0.48e25fcfo3Khca

金丝雀版本的部署是一个异步的过程,大致需要几分钟, 需要等待相关组件部署完成。

image.png

新版本部署完成之后, 状态如下:

image.png

此时状态如下所示:

image.png

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

在步骤一中,我们通过金丝雀升级方式部署了一个v1.17.2版本的Istio控制面。接下来,我们需要验证这个版本是否符合预期。
以下步骤将在前面已部署好的Bookinfo 例子下的reviews-v2 版本更新其注入的网格代理版本到v1.17 。

1) 进入网格实例 > 全局命名空间,找到default命名空间,此时命名空间标签为默认的istio-injection: enabled,说明此时注入的是1.16版本的网格代理。

image.png

2) 点击切换为注入1-17-2版本, default全局命名空间的标签将切换为istio.io/rev: canary,并立即将数据面default命名空间标签也同步成istio.io/rev: canary。此时界面显示default注入的是1.17版本的网格代理。

image.png

3) 此时,命名空间default 下新创建的工作负载(pod) 将注入1.17版本的网格代理。 其他命名空间的标签未更改,依然注入当前1.16版本的网格代理。

其它路径:金丝雀版本下为命名空间开启自动注入
上面演示的步骤是为一个在升级前已经开启自动注入的命名空间切换注入的Sidecar网格代理版本。对于升级前尚未开启Sidecar网格代理注入的命名空间,我们可以正常地为其开启自动注入,注入时,将选择注入的Sidecar网格代理版本。服务网格将根据您选择的版本,为命名空间打上istio.io/rev:stable或是istio.io/rev:canary的标签。

image.png

5) 通过容器服务控制台“重新部署”菜单滚动更新review-v2 工作负载:

image.png

6) 检查滚动更新后的review-v2 对应的POD 是否启动成功, 以及新的pod 是否注入了1.17对应的Sidecar代理版本。

image.png

可以看到成功注入了v1.17版本的Sidecar网格代理,符合预期。

7) 打开浏览器,访问bookinfo 页面 ,检查流量是否符合预期,应当仍然可以正常访问到review-v2 版本。

image.png

此时, 状态如下所示:

image.png

步骤三:回滚review-v2 为 1.16 版本

若第二步验证失败,或者其他原因我们需要进行回滚,我们可以按照如下操作执行。若验证成功,我们则可以进一步扩大验证的范围。

1) 进入网格实例 > 全局命名空间,找到default命名空间,此时命名空间标签为istio.io/rev: canary,显示注入的是1.17版本的网格代理。

image.png

点击切换为注入1-16-4版本, default全局命名空间的标签将切换为istio.io/rev: stable,并立即将数据面default命名空间标签也同步成istio.io/rev: stable。此时界面显示default注入的是1.16版本的网格代理。

image.png

2) 通过容器服务控制台“重新部署”菜单滚动更新review-v2 工作负载:

image.png

3) 检查滚动更新后的review-v2 对应的POD 是否启动成功, 以及新的pod 是否注入了1.16对应的Sidecar代理版本。

image.png

步骤四:撤销升级

1) 等回滚之后,我们可以撤销金丝雀升级,将ASM 实例更新为最初的1.16 状态。

image.png

点击“撤销升级”按钮, 之后将会删除掉升级中的灰度版本的控制面组件(即示例中的1.17版本), 只保留稳定版本的控制面组件(即示例中的1.16版本)。

注: 如果您选择“撤销升级”,则需首先确保所有命名空间都已注入稳定Sidecar代理版本(例子中是1.16版本),否则无法撤销。

此时状态如下所示:

image.png

步骤五、重新升级及验证

此时, 整个ASM实例处于步骤一之前待升级的状态。下面的内容将需要重新执行步骤一, 以使得ASM集群处于升级控制面灰度版本中。

并按照步骤二的内容重新执行来验证注入新版本的代理是否符合预期。例如, 使用容器服务控制台的重新部署,重新部署reviews-v1 、reviews-v2以及reviews-v3无状态工作负载。可以观察到reviews-v1、reviews-v2以及reviews-v3的Pod都注入了1.17版本的Sidecar网格代理。

注: 本例中仅验证reviews-v1、reviews-v2reviews-v3 三个工作负载。根据您的需要,您也可以仿照上述步骤对任意的工作负载进行升级验证,直至您认为验证通过。

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

通过上述步骤后,我们验证了review-v1、review-v2 使用1.17 (新版本)的网格代理 ,并且功能符合预期。此时,我们则可以进一步决策是否将1.17 版本切换为正式版本。

注意:

  1. 一旦进行版本切换,意味着升级已经进入旧版本下线阶段,您只能将现有工作负载全部切换成新的1.17版本的Sidecar网格代理,无法再撤销升级。请确保在“部署新版本”阶段完成全部验证工作。
  2. 在版本切换后,带有istio.io/rev: stable和istio-injection: enabled标签的命名空间将注入新的1.17版本的Sidecar网格代理,而istio.io/rev: canary标签将失去作用。因此,在版本切换时,ASM会自动将所有istio.io/rev: canary标签切换为istio.io/rev: stable。请您在点击版本切换时在界面上确认。

image.png

点击版本切换时,将有弹窗提示:在版本切换后,带有istio.io/rev: stable和istio-injection: enabled标签的命名空间将注入新的1.17版本的Sidecar网格代理,而istio.io/rev: canary标签将失去作用。因此,在版本切换时,ASM会自动将所有istio.io/rev: canary标签切换为istio.io/rev: stable。点击确认,正式进行版本切换,将1.17 切换为正式版本。

切换成功后,已经注入的1.16 版本的网格代理依然保留,对应的工作负载不受影响。但重新部署的Pod将全部注入1.17版本的Sidecar代理。
等待切换更新完成后,我们可以看到如下页面:

image.png

切换成功后,ASM实例的当前版本为1.17,原有的1.16 会保留,直到完成数据面的全部升级。

此时, 状态如下所示:

image.png

步骤七: 数据面升级

此时ASM的当前版本为1.17 ,命名空间标签 istio.io/rev=stable、 istio.io/rev=1-17-2 或 istio-injection=enabled 都是注入1.17 版本的Sidecar网格代理。

通过滚动更新工作负载,可以升级注入的Sidecar网格代理到当前新版本1.17 ,以此完成数据面升级。具体操作如下。
点击 “数据面” 页签,可以看到类似如下界面:

image.png

在 “待升级工作负载” 一栏下,我们可以通过切换集群和namespace, 看到未升级到新版本的工作负载。
点击对应的“滚动升级”按钮则可以将工作负载升级到到1.17 新版本。

说明: 列表中不会显示已经升级完成的工作负载。

类似地, 点击滚动即可升级到网关的新版本。

此外, 也可以在“网格状态”下查看全局还剩哪些未升级的工作负载或者网关实例。

image.png

此时, 升级完数据面之后, 状态如下所示:

image.png

步骤八:下线旧版本

当数据面所有工作负载升级完成,我们则可以将老版本1.16 进行下线操作。点击 “旧版本下线”按钮即可完成旧版本下线。

切记一定要将所有工作负载升级到新版本后,再进行旧版本下线。

image.png

此时状态如下所示:

image.png

总结

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

相关文章
|
2月前
|
Cloud Native 容器 Kubernetes
基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道
本文简要讨论了使用流量泳道来实现全链路流量灰度管理的场景与方案,并回顾了阿里云服务网格 ASM 提供的严格与宽松两种模式的流量泳道、以及这两种模式各自的优势与挑战。接下来介绍了一种基于 OpenTelemetry 社区提出的 baggage 透传能力实现的无侵入式的宽松模式泳道,这种类型的流量泳道同时具有对业务代码侵入性低、同时保持宽松模式的灵活特性的特点。同时,我们还介绍了新的基于权重的流量引流策略,这种策略可以基于统一的流量匹配规则,将匹配到的流量以设定好的比例分发到不同的流量泳道。
73490 16
基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道
|
3月前
|
运维 负载均衡 监控
如何构建Sidecarless模式的高性能服务网格
以上步骤可以帮助你构建一个Sidecarless模式的高性能服务网格。但是,请记住,每个应用都有其特定的需求和约束,你可能需要根据你的具体情况进行调整。
54 1
|
9月前
|
运维 Serverless API
两全其美,Sidecarless 与 Sidecar 模式融合的服务网格新形态
本文主要介绍 ASM 如何落地这种 Sidecarless 和 Sidecar 模式融合的服务网格新形态,以及服务网格的 Serverless 化。
52991 25
|
9月前
|
Kubernetes API 容器
基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道
基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道
10936 11
|
9月前
|
搜索推荐
Spartacus ASM 模式下用户名的大小写问题
Spartacus ASM 模式下用户名的大小写问题
Spartacus ASM 模式下用户名的大小写问题
|
10月前
|
负载均衡 安全 Cloud Native
服务网格的工作原理:解析服务网格的核心组件和通信模式
服务网格的工作原理:解析服务网格的核心组件和通信模式
75 0
|
网络协议 Linux Perl
如何构建 Sidecarless 模式的高性能服务网格
如何构建 Sidecarless 模式的高性能服务网格
|
Kubernetes 安全 测试技术
阿里云服务网格ASM的流量标签及路由功能之(3): 泳道模式下的流量管理
本文介绍如何在ASM中使用泳道模式下的流量管理功能。具体关于ASM中的全链路灰度相关概念可以参考https://help.aliyun.com/document_detail/375313.html。
517 0
阿里云服务网格ASM的流量标签及路由功能之(3): 泳道模式下的流量管理
|
Kubernetes Linux 网络安全
Service Mesh 服务网格一:Sidecar模式
Service Mesh 服务网格一:Sidecar模式
|
Cloud Native 网络协议 安全
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——6. ASM Istio 模式架构设计(下)
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——6. ASM Istio 模式架构设计(下)
《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——6. ASM Istio 模式架构设计(下)