使用版本和标签安全升级 Istio 控制平面
了解如何执行网格控制平面的金丝雀升级。
与所有安全软件一样,您的服务网格也应保持最新。Istio 社区每季度发布新版本,并定期发布针对错误修复和安全漏洞的补丁版本。服务网格的运营商需要多次升级控制平面和数据平面组件。在升级时必须小心,因为错误可能会影响您的业务流量。Istio 拥有许多机制,可以安全地以受控方式执行升级,并且在 Istio 1.10 中,我们进一步改进了这种操作体验。
背景
在 Istio 1.6 中,我们添加了对使用版本遵循金丝雀模式升级服务网格的基本支持。使用这种方法,您可以并行运行多个控制平面,而不会影响现有部署,并逐渐将工作负载从旧控制平面迁移到新控制平面。
为了支持这种基于版本的升级,Istio 引入了用于命名空间的istio.io/rev
标签。这指示哪个控制平面版本应为相应命名空间中的工作负载注入 sidecar 代理。例如,istio.io/rev=1-9-5
标签指示控制平面版本1-9-5
应使用1-9-5
的代理为该命名空间中的工作负载注入数据平面。
如果要升级特定命名空间的数据平面代理,则需要更新istio.io/rev
标签以指向新版本,例如istio.io/rev=1-10-0
。手动更改(甚至尝试协调)大量命名空间的标签可能会容易出错,并导致意外停机。
引入版本标签
在 Istio 1.10 中,我们使用一项名为版本标签的新功能改进了基于版本的升级。版本标签减少了运营商必须进行的更改次数才能使用版本并安全地升级 Istio 控制平面。您可以将标签用作命名空间的标签,并将版本分配给该标签。这意味着您在升级时无需更改命名空间上的标签,并且可以最大程度地减少手动步骤和配置更改。
例如,您可以定义一个名为prod-stable
的标签并将其指向控制平面的1-9-5
版本。您还可以定义另一个名为prod-canary
的标签,该标签指向1-10-0
版本。您的集群中可能有很多重要的命名空间,您可以使用istio.io/rev=prod-stable
标签标记这些命名空间。在其他命名空间中,您可能愿意测试 Istio 的新版本,您可以将该命名空间标记为istio.io/rev=prod-canary
。该标签将间接将这些命名空间分别与prod-stable
的1-9-5
版本和prod-canary
的1-10-0
版本关联。
确定新控制平面适合其余prod-stable
命名空间后,您可以更改标签以指向新版本。这使您可以将标记为prod-stable
的所有命名空间更新到新的1-10-0
版本,而无需对命名空间上的标签进行任何更改。更改标签以指向其他版本后,您需要重新启动命名空间中的工作负载。
对新控制平面版本进行升级感到满意后,您可以删除旧的控制平面。
稳定版本标签的实际应用
要为版本1-9-5
创建一个新的prod-stable
标签,请运行以下命令
$ istioctl x revision tag set prod-stable --revision 1-9-5
然后,您可以使用istio.io/rev=prod-stable
标签标记您的命名空间。请注意,如果您安装了 Istio 的default
版本(即没有版本),则首先必须删除标准注入标签
$ kubectl label ns istioinaction istio-injection-
$ kubectl label ns istioinaction istio.io/rev=prod-stable
您可以使用以下命令列出网格中的标签
$ istioctl x revision tag list
TAG REVISION NAMESPACES
prod-stable 1-9-5 istioinaction
标签是使用MutatingWebhookConfiguration
实现的。您可以验证是否已创建相应的MutatingWebhookConfiguration
$ kubectl get MutatingWebhookConfiguration
NAME WEBHOOKS AGE
istio-revision-tag-prod-stable 2 75s
istio-sidecar-injector 1 5m32s
假设您正在尝试基于 1.10.0 对控制平面的新版本进行金丝雀测试。首先,您将使用版本安装新版本
$ istioctl install -y --set profile=minimal --revision 1-10-0
您可以创建一个名为prod-canary
的新标签,并将其指向您的1-10-0
版本
$ istioctl x revision tag set prod-canary --revision 1-10-0
然后相应地标记您的命名空间
$ kubectl label ns istioinaction-canary istio.io/rev=prod-canary
如果列出网格中的标签,您将看到两个指向两个不同版本的稳定标签
$ istioctl x revision tag list
TAG REVISION NAMESPACES
prod-stable 1-9-5 istioinaction
prod-canary 1-10-0 istioinaction-canary
您使用istio.io/rev=prod-canary
标记的任何命名空间都将由与prod-canary
稳定标签名称相对应的控制平面注入(在此示例中,它指向1-10-0
版本)。准备就绪后,您可以将prod-stable
标签切换到新的控制平面,方法如下:
$ istioctl x revision tag set prod-stable --revision 1-10-0 --overwrite
任何时候将标签切换到指向新版本时,都需要重新启动任何相应命名空间中的工作负载以获取新版本的代理。
当prod-stable
和prod-canary
都不再指向旧版本时,可以安全地删除旧版本,如下所示
$ istioctl x uninstall --revision 1-9-5
总结
使用版本可以更安全地对 Istio 控制平面进行金丝雀更改。在具有大量命名空间的大型环境中,您可能更愿意使用我们在本博文中介绍的稳定标签,以减少移动部件的数量并简化您可能围绕更新 Istio 控制平面构建的任何自动化。请查看1.10 版本以及新的标签功能,并给我们反馈!