金丝雀发布指在原有部署版本可用的情况下,同时部署新版本应用作为金丝雀,测试新版本的性能。在保证整体系统稳定的情况下,帮助您尽早发现问题和修复问题。本文介绍如何使用金丝雀模式增强升级稳定性。
前提条件
已创建ASM企业版或旗舰版实例,且版本为1.16.4.91及以上版本。具体操作,请参见创建ASM实例。
已创建ACK集群,并添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
已部署Bookinfo应用。具体操作,请参见在ASM实例关联的集群中部署应用。
功能介绍
阿里云服务网格ASM支持基于修订与标签的升级模式,以更稳定安全的方式执行新版本控制面的金丝雀升级。在新升级模式中,数据面的网格代理将与其使用的特定控制面版本相关联。这使得新版本能够以较低的风险在集群中部署,直到您明确选择之前,没有代理连接到新版本。同时也允许逐渐将工作负载迁移到新的控制面,每个独立的控制面被称为修订版并具有istio.io/rev
标签。
为了支持这种基于修订的升级,Istio为命名空间引入了一个istio.io/rev
标签。它可以指示哪个控制面版本应该为相应命名空间中的工作负载注入Sidecar代理。例如,标签istio.io/rev=1-17-2
表示为该命名空间中的工作负载注入1.17.2版本的Sidecar代理。
在金丝雀升级过程中,您可以通过将部分服务先升级的方式来验证目标版本是否符合预期,若验证结果不符合预期,可以快速进行回滚来保证服务的稳定性。版本验证符合预期后,可以将金丝雀版本切换为当前版本,并通过滚动更新方式将所有工作负载升级到最新版本,完成数据面的升级,并卸载老版本完成所有升级步骤。
准备工作
由于在金丝雀升级中,验证阶段需要显式地通过命名空间标签来指定注入的Sidecar代理版本,因此金丝雀升级具有对注入策略的前置要求。请按照以下步骤确认注入策略配置是否满足金丝雀升级条件。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在注入策略配置页面的注入策略配置管理区域,确认Pod所在命名空间的标签需要满足条件为包含 istio-injection: enabled。
说明istio-injection: enabled
与istio.io/rev: stable
具有相同的语义。在金丝雀升级过程中,将使用istio.io/rev: stable
为对应命名空间中的Pod注入稳定版本网格代理,使用istio.io/rev: canary
为对应命名空间中的Pod注入金丝雀版本的网格代理。升级完成后,即使不将
istio.io/rev:stable
替换回istio-injection: enabled
,也可以正常注入,因为这两个标签的语义完全一致。升级前的状态如下所示:
步骤一:升级ASM控制面
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在升级管理页面,单击金丝雀升级页签,在控制面页签下选择金丝雀版本和新建负载均衡CLB实例,单击确认,然后在确认升级?对话框,单击确定。
金丝雀升级最多跨一个次要版本升级,本示例的ASM实例版本为1.16,最高可升级到1.17或者1.18。本文以升级到v1.17.2.37为例进行说明。金丝雀升级的目标版本部署时会创建与之关联的一个CLB实例,若无特别需求,CLB实例选择默认的规格即可。关于CLB实例的计费说明,请参见CLB计费概述。
金丝雀版本的部署是一个异步的过程,大致需要几分钟,请等待相关组件部署完成。新版本部署完成后,界面显示如下。
此时状态如下所示:
步骤二:升级reviews-v2的注入代理到新版本
步骤一通过金丝雀升级方式部署了一个v1.17.2版本的Istio控制面。下文以在Bookinfo应用的reviews-v2版本更新其注入的网格代理版本到v1.17为例,验证该版本是否符合预期。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在全局命名空间页面的自动注入列,查看default命名空间对应的标签是否为
istio-injection: enabled
。若标签为
istio-injection: enabled
,表明注入的是1.16版本的网格代理。在全局命名空间页面的自动注入列,单击default命名空间对应的切换为注入1-17-2版本,在确认对话框,单击确定。
default全局命名空间的标签将切换为
istio.io/rev: canary
,并立即将数据面default命名空间标签也同步成istio.io/rev: canary
。此时全局命名空间页面显示default注入的是1.17版本的网格代理。命名空间default下新创建的工作负载(Pod)将注入1.17版本的网格代理。其他命名空间的标签未更改,依然注入当前1.16版本的网格代理。说明上述步骤是为一个在升级前已经开启自动注入的命名空间切换注入的Sidecar网格代理版本。对于升级前尚未开启Sidecar网格代理注入的命名空间,您可以正常地为其开启自动注入。注入时,请按需选择注入的Sidecar网格代理版本。服务网格将根据您选择的版本,为命名空间打上
istio.io/rev:stable
或istio.io/rev:canary
的标签。滚动更新reviews-v2工作负载。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在无状态页面的操作列,单击reviews-v2对应的
,然后在重新部署对话框,单击确定。
在无状态页面,单击reviews-v2,在容器组页签,查看滚动更新后的reviews-v2对应的Pod是否启动成功,以及新的Pod是否注入了1.17对应的Sidecar代理版本。
可以看到滚动更新后的reviews-v2对应的Pod启动成功,且新的Pod成功注入了v1.17版本的Sidecar网格代理。
打开浏览器,访问Bookinfo页面,检查流量是否符合预期。
如下图所示,可以正常访问到reviews-v2版本,符合预期。
此时状态如下所示:
步骤三:回滚reviews-v2为1.16版本
若步骤二验证失败,或者因为其他原因需要进行回滚,请参照以下步骤。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在全局命名空间页面的自动注入列,单击default命名空间对应的切换为注入1-16-4版本,然后在确认对话框,单击确定。
回滚前的命名空间标签为
istio.io/rev: canary
,default注入的是1.17版本的网格代理。回滚后的标签将切换为
istio.io/rev: stable
,并且数据面default命名空间标签也同步为istio.io/rev: stable
,default注入的是1.16版本的网格代理。在容器服务控制台重新部署reviews-v2工作负载。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面上方,命名空间选择default,然后在操作列,单击reviews-v2对应的
,在重新部署对话框,单击确定。在无状态页面,单击reviews-v2名称,在容器组页签查看滚动更新后的reviews-v2对应的Pod是否启动成功,新的Pod是否注入了1.16对应的Sidecar代理版本。
可以看到滚动更新后的reviews-v2对应的Pod启动成功,且新的Pod注入了1.16对应的Sidecar代理版本。
步骤四:撤销升级
回滚成功后,您可以撤销金丝雀升级,将ASM实例更新为最初的1.16版本。
撤销升级前,请确保所有命名空间都已注入稳定Sidecar代理版本,否则无法撤销。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在升级管理页面的金丝雀升级页签,单击撤销升级,然后在确认撤销升级吗?对话框,单击确定。
单击撤销升级后,将会删除升级中的灰度版本的控制面组件(即示例中的1.17版本),只保留稳定版本的控制面组件(即示例中的1.16版本)。
此时状态如下所示:
步骤五:重新升级及验证
此时整个ASM实例处于步骤一之前待升级的状态。本示例仅验证reviews-v1、reviews-v2和reviews-v3三个工作负载。请您根据实际情况,参照上述步骤对任意的工作负载进行升级验证,直至您认为验证通过。
步骤六:验证符合预期,切换为正式版本
通过上述步骤,已验证review-v1、review-v2可以使用1.17(新版本)的网格代理,并且功能符合预期。此时,您可以选择是否将1.17版本切换为正式版本。
一旦进行版本切换,意味着升级已经进入旧版本下线阶段。您只能将现有工作负载全部切换成新的1.17版本的Sidecar网格代理,无法再撤销升级。请确保在新版本部署阶段完成全部验证工作。
在版本切换后,带有
istio.io/rev: stable
和istio-injection: enabled
标签的命名空间将注入新的1.17版本的Sidecar网格代理,而istio.io/rev: canary
标签将失去作用。因此,在版本切换时,ASM会自动将所有istio.io/rev: canary
标签切换为istio.io/rev: stable
。请您在升级管理页面的金丝雀升级页签,单击版本切换时进行确认。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在升级管理页面的金丝雀升级页签,单击版本升级,在确认版本切换吗对话框,仔细阅读提示内容,确认无误后单击确定。
切换成功后,已经注入的1.16版本的网格代理依然保留,对应的工作负载不受影响。但重新部署的Pod将全部注入1.17版本的Sidecar代理。切换更新完成后的界面如下。
此时状态如下所示:
步骤七:数据面升级
此时ASM的版本为1.17,命名空间标签istio.io/rev=stable
、istio.io/rev=1-17-2
或istio-injection=enabled
都注入1.17版本的Sidecar网格代理。通过滚动更新工作负载,可以升级注入的Sidecar网格代理到当前新版本1.17,以此完成数据面升级。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在升级管理页面的金丝雀升级页签,单击数据面页签,按需升级ASM网关或工作负载。
升级ASM网关:在ASM网关区域的操作列,单击目标网关对应的滚动升级,在确认执行滚动升级吗?对话框,单击确定,将ASM网关升级到到1.17新版本。
升级工作负载:在待升级工作负载区域,切换命名空间,然后在操作列,单击目标工作负载对应的滚动升级,在确认执行滚动升级吗?对话框,单击确定,将工作负载升级到到1.17新版本。
说明列表中不会显示已完成升级的ASM网关或工作负载。
您也可以在左侧导航栏,单击网格状态,查看全局未升级的工作负载或网关实例。
此时升级完数据面之后的状态如下所示。
步骤八:下线旧版本
当数据面所有工作负载升级完成后,您可以将老版本1.16进行下线操作。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在升级管理页面的金丝雀升级页签,单击下线旧版本,在确认下线旧版本控制面吗?对话框,单击确定。
此时状态如下所示。