背景介绍
为避免过期版本实例存在的安全和稳定性风险,同时保证您业务的连贯性,服务网格CSM支持对实例进行金丝雀升级,您可以在升级过程中仅变更部分数据面进行效果验证。验证符合预期后再进行全量升级,如果不符合预期,CSM支持对此次升级进行回滚。
相关概念
概念 | 说明 |
---|---|
金丝雀升级 | 通过先运行一个金丝雀部署的新控制平面来完成 Istio 的升级,从而允许您在将所有流量迁移到新版本之前以一小部分工作负载监视升级的效果。金丝雀升级过程中支持回退。 |
控制平面 | 控制平面(Control Plane)是一组系统服务,这些服务配置网格或者网格的子网来管理工作负载实例之间的通信。 单个网格中控制平面的所有实例共享相同的配置资源。 |
数据平面 | 数据平面(Data Plane)当前常见的Sidecar模式, 通常是与主应用程序一起运行以提供附加功能的容器。 在 Istio 中,它同时运行一个Envoy代理 Pod,可以进行流量治理,安全策略管理,可观测上报等,无需对业务进行侵入性修改。 |
升级时机
istio开源社区在不断迭代,天翼云应用服务网格会不定期跟进社区的功能更新和漏洞修复。服务网格实例版本过于落后时,可能会存在安全和稳定性风险,建议您及时进行升级操作。
大版本的更新需要您主动进行升级,及时升级可以:
- 降低安全和稳定性风险:CSM版本的迭代,会及时跟进修复社区已知的安全及稳定性漏洞,给你的业务带来安全和稳定性的提升。
- 享受更好的维护支持:对于落后太多的实例版本(往往是3个大版本以上),CSM不再提供维护和技术支持,使用新版本能够让您享受更好的技术支持和答疑服务。
- 使用新版本的前沿功能:随着社区Istio版本的演进,新版本包含新的功能和改进,CSM也将适配新版本,可以使用更丰富的功能,跟进最新的性能优化也有助于您减少资源消耗。
升级注意事项和说明
注意事项
- 网格升级需要您手动重启数据面Pod以完成新版本Sidecar的重新注入,建议您在业务低峰期进行升级操作。
- 手动升级CSM网关将触发滚动重启。
- 升级期间请勿进行灰度发布、流量规则配置、主从集群新增删除等操作。
- 基于安全原因,CSM保留以下权利:
- 强制升级过期版本实例(在实例版本过期后的某个时间,强制升级实例到支持中的最早版本),建议您参照下文提前主动升级实例。
- 对于紧急安全漏洞,可以在不发送通知的情况下,系统不定期发布热更新版本,并自动更新。自动热更新时,数据面网关和Sidecar代理版本保持不变。
- 金丝雀升级仅支持跨越最多两个大版本,超出这个范围请先升级到中间版本后再继续升级。例如1.19无法直接升级到1.22,需要先升级到1.20或者1.21,再继续升级到1.22。
金丝雀升级注入sidecar版本机制
服务网格实例进行金丝雀升级过程中,会同时有两个版本的控制面共存。
CSM基于命名空间中的标签注入的Sidecar版本。控制标签为 istio.io/rev
,目前仅支持指定default和canary,当设置为default时,注入当前版本,当设置为canary时,注入金丝雀版本。
当两个版本同时存在时,Namespace标签下业务注入的Sidecar版本的映射关系说明如下:
注意同一命名空间下,不能同时存在
istio-injection
和istio.io/rev
两个标签,此时注入行为可能产生不可预测的后果。
准备工作
由于在金丝雀升级中,验证阶段需要显式地通过命名空间标签来指定注入的Sidecar代理版本,因此金丝雀升级具有对注入策略的前置要求。请按照以下步骤确认注入策略配置是否满足金丝雀升级条件。
-
登录CSM控制台,选定您的网格实例进入网格管理页面。
-
在左侧栏,sidecar管理中,选中注入策略管理
-
确认pod所在命名空间的标签需要满足条件是否选定了“包含 istio-injection: enabled”
以bookinfo demo为例,正式开始升级前,大致的架构如下:
开始金丝雀升级
- 登录CSM控制台,选定您的网格实例进入网格管理页面。
- 在左侧栏,网格实例中,选中网格实例升级
- 选择金丝雀版本,点击开始金丝雀升级。
注意金丝雀升级最多支持跨两个版本,当前CSM维护的版本基本可以满足升级的需求。如果您的CSM版本落后过多,无法使用金丝雀升级功能,请退订掉后重新选择网格版本开通。
金丝雀版本的部署是一个异步的过程,大致需要几分钟,请等待相关组件部署完成。此时页面不可操作,请耐心等候部署结果。
新版本部署完成后,界面显示如下。
完成后,大致的架构如下:
进行金丝雀升级验证
上述步骤实施成功后,主集群会同时存在两个版本的控制面。此时您可以通过全局命名空间的istio.io/rev标签,决定让数据面注入哪个版本的sidecar。以ratings为例,让其注入1.20.0的sidecar,验证升级后的功能。
-
登录CSM控制台,选定您的网格实例进入网格管理页面。
-
在左侧栏,网格实例中,选中全局命名空间
-
选择ratings所在的命名空间,移除istio-injection标签,新增istio.io/rev标签,选中canary值(表示注入最新的版本)。
更新成功后,可以看到default的标签已经变为只有istio.io/rev: canary
- 滚动更新ratings:
-
登录CCSE控制台,选中主集群
-
在左侧栏中选择工作负载 -> 无状态
-
在ratings的操作列中,点击重新部署
-
选择滚动更新后点击确定
-
重启后确认新负载的注入镜像,版本号是否为1.20.0
此时,架构大致如下:
回滚工作负载版本
若升级验证失败,或者因为其他原因需要进行回滚,请参照以下步骤。
- 登录CSM控制台,选定您的网格实例进入网格管理页面。
- 在左侧栏,网格实例中,选中全局命名空间
- 选择ratings所在的命名空间,将istio.io/rev标签,改为default值(表示注入旧版本)。
- 后续步骤与上述流程一样,此处不在赘述。
回滚金丝雀升级
当所有临时升级的工作负载都回滚后,您可以选择把整次金丝雀升级回滚掉。
操作步骤如下
-
登录CSM控制台,选定您的网格实例进入网格管理页面。
-
在左侧栏,网格实例中,选中网格实例升级
-
选择金丝雀版本,点击开始回滚升级。
注意回滚前请确保所有命名空间都已注入稳定Sidecar代理版本,否则无法撤销。
回滚后,新控制面会被清理,只保留稳定版本的控制面。
此时大致架构如下,后续您可以择期重新进行金丝雀升级,重复上述步骤进行控制面部署,工作负载验证等步骤即可。
确认升级
若上述步骤验证符合预期,您可以进入正式切换升级的流程。步骤如下:
-
登录CSM控制台,选定您的网格实例进入网格管理页面。
-
在左侧栏,网格实例中,选中网格实例升级
-
选择金丝雀版本,点击开始确认升级。
注意
一旦进行版本切换,意味着升级已经进入旧版本下线阶段。您只能将现有工作负载全部切换成新的版本的Sidecar网格代理,无法再撤销升级。请确保在新版本部署阶段完成全部验证工作。
在版本切换后,带有
istio.io/rev: default
和istio-injection: enabled
标签的命名空间将注入新的版本的Sidecar网格代理,而istio.io/rev: canary
标签将失去作用。因此,在版本切换时,CSM会自动将所有istio.io/rev: canary
标签切换为istio.io/rev: default
。
确认升级的动作耗时较久,请耐心等候页面执行完成。
执行成功后页面进入旧版本下线阶段
此时部分工作负载已经切换到新版本,存量工作负载依然注入旧版本,但是命名空间的istio.io/rev标签已经切换为default,并且重启负载后,即可注入新版本sidecar。注意一旦确认升级,本次金丝雀升级就无法回退。
重启数据面
在卸载控制面前,您可以点击数据面标签,对存量的工作负载进行重启。具体步骤如下:
-
登录CSM控制台,选定您的网格实例进入网格管理页面。
-
在左侧栏,网格实例中,选中网格实例升级
-
选择金丝雀发布,点击数据面。
-
进入页面后,您可以依据集群和命名空间筛选仍为升级的工作负载,逐一进行滚动更新。
可以看到,ratings已经更新到1.20版本不会再出现在列表中。
当所有工作负载都更新后,总体框架如下:
下线旧版本
所有数据面都重启过后,网格内不在存在注入旧版本sidecar,此时您可以下线旧版本,把旧版本控制面卸载,具体操作如下:
- 登录CSM控制台,选定您的网格实例进入网格管理页面。
- 在左侧栏,网格实例中,选中网格实例升级
- 选择金丝雀发布,点击卸载控制面。
- 弹窗中点击确认即可。
卸载成功后整体框架如下: