使用 Helm 升级
请遵循本指南使用 Helm 升级和配置环境模式安装。本指南假设您已使用先前版本的 Istio 执行了 使用 Helm 的环境模式安装。
了解 ambient 模式升级
所有 Istio 升级都涉及升级控制平面、数据平面和 Istio CRD。由于环境数据平面分布在 两个组件 中,即 Ztunnel 和网关(包括 Waypoints),因此升级这些组件需要分步骤进行。此处简要介绍了控制平面和 CRD 的升级,但与 Sidecar 模式中升级这些组件的过程 基本相同。
与 Sidecar 模式类似,网关可以利用 版本标签 对(网关)升级(包括 Waypoints)进行细粒度控制,包括随时回滚到 Istio 控制平面的先前版本。但是,与 Sidecar 模式不同,Ztunnel 作为 DaemonSet 运行(每个节点一个代理),这意味着 Ztunnel 升级至少会影响整个节点。虽然在许多情况下这可能是可以接受的,但具有长期 TCP 连接的应用程序可能会中断。在这种情况下,建议在升级特定节点的 Ztunnel 之前使用节点隔离和驱逐。为简单起见,本文档将演示 Ztunnel 的就地升级,这可能涉及短暂的停机时间。
先决条件
准备升级
在升级 Istio 之前,建议您下载新版本的 istioctl,并运行 istioctl x precheck
以确保升级与您的环境兼容。输出应类似于以下内容
$ istioctl x precheck
✔ No issues found when checking the cluster. Istio is safe to install or upgrade!
To get started, check out <https://istio.ac.cn/latest/docs/setup/getting-started/>
现在,更新 Helm 存储库
$ helm repo update istio
组织您的标签和修订版
为了以受控的方式升级环境模式下的网格,建议您的网关和命名空间使用 istio.io/rev
标签指定版本标签,以控制将使用哪些网关和控制平面版本来管理工作负载的流量。建议将您的生产集群划分为多个标签以组织您的升级。给定标签的所有成员将同时升级,因此明智的做法是从风险最低的应用程序开始升级。我们不建议通过标签直接引用版本进行升级,因为此过程很容易导致意外升级大量代理,并且难以分割。要查看集群中使用的标签和版本,请参阅有关升级标签的部分。
选择修订版名称
版本标识 Istio 控制平面的唯一实例,允许您在单个网格中同时运行控制平面的多个不同版本。
建议版本保持不变,即,一旦使用特定版本名称安装了控制平面,则不应修改安装,并且不应重复使用版本名称。另一方面,标签是可变的指向版本的指针。这使集群操作员能够在无需调整任何工作负载标签的情况下通过将标签从一个版本移动到另一个版本来执行数据平面升级。所有数据平面将仅连接到一个控制平面,该控制平面由 istio.io/rev
标签(指向版本或标签)指定,或者如果不存在 istio.io/rev
标签,则由默认版本指定。升级数据平面只需更改其指向的控制平面,方法是修改标签或编辑标签。
由于版本旨在保持不变,因此建议选择一个与要安装的 Istio 版本相对应的版本名称,例如 1-22-1
。除了选择新的版本名称外,您还应记下当前的版本名称。您可以通过运行以下命令找到它
$ kubectl get mutatingwebhookconfigurations -l 'istio.io/rev,!istio.io/tag' -L istio\.io/rev
$ # Store your revision and new revision in variables:
$ export REVISION=istio-1-22-1
$ export OLD_REVISION=istio-1-21-2
升级控制平面
基础组件
在部署新版本的控制平面之前,必须先升级集群范围的自定义资源定义 (CRD)
$ helm upgrade istio-base istio/base -n istio-system
Istiod 控制平面
Istiod 控制平面管理和配置在网格内路由流量的代理。以下命令将安装控制平面的新实例,与当前实例并存,但不会引入任何新的网关代理或 Waypoints,也不会接管现有网关代理或 Waypoints 的控制权。
如果您自定义了 Istiod 安装,则可以重用先前升级或安装的 values.yaml
文件,以保持控制平面的一致性。
$ helm upgrade istiod istio/istiod -n istio-system --wait
$ helm install istiod-"$REVISION" istio/istiod -n istio-system --set revision="$REVISION" --set profile=ambient --wait
CNI 节点代理
Istio CNI 节点代理负责检测添加到环境网格的 Pod,通知 Ztunnel 应在添加的 Pod 中建立代理端口,并在 Pod 网络命名空间内配置流量重定向。它不是数据平面或控制平面的一部分。
版本 1.x 的 CNI 与版本 1.x+1 和 1.x 的控制平面兼容。这意味着只要版本差异在小版本范围内,则必须先升级控制平面,然后再升级 Istio CNI。
$ helm upgrade istio-cni istio/cni -n istio-system
升级数据平面
Ztunnel DaemonSet
Ztunnel DaemonSet 是节点代理组件。版本 1.x 的 Ztunnel 与版本 1.x+1 和 1.x 的控制平面兼容。这意味着只要版本差异在小版本范围内,则必须先升级控制平面,然后再升级 Ztunnel。如果您之前自定义了 Ztunnel 安装,则可以重用先前升级或安装的 values.yaml
文件,以保持您的 数据平面 一致性。
$ helm upgrade ztunnel istio/ztunnel -n istio-system --wait
$ helm upgrade ztunnel istio/ztunnel -n istio-system --set revision="$REVISION" --wait
手动部署网关图表(可选)
使用 手动部署 的 Gateway
必须使用 Helm 单独升级
$ helm upgrade istio-ingress istio/gateway -n istio-ingress
使用标签升级 Waypoints 和网关
如果您遵循最佳实践,则所有网关、工作负载和命名空间都使用默认版本(实际上是名为 default
的标签),或者使用 istio.io/rev
标签并将值设置为标签名称。您现在可以通过将它们的标签移动到指向新版本(一次一个),将所有这些升级到 Istio 数据平面的新版本。要列出集群中的所有标签,请运行以下命令
$ kubectl get mutatingwebhookconfigurations -l 'istio.io/tag' -L istio\.io/tag,istio\.io/rev
对于每个标签,您可以通过运行以下命令升级标签,将 $MYTAG
替换为您自己的标签名称,将 $REVISION
替换为您自己的版本名称
$ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{$MYTAG}" --set revision="$REVISION" -n istio-system | kubectl apply -f -
这将升级引用该标签的所有对象,除了使用 手动网关部署模式 的对象(在下面处理)和 Sidecar(在环境模式中未使用)。
建议您在升级下一个标签之前密切监控使用升级后的数据平面的应用程序的运行状况。如果您发现问题,可以回滚标签,将其重置为指向旧版本的名称
$ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{$MYTAG}" --set revision="$OLD_REVISION" -n istio-system | kubectl apply -f -
手动升级网关(可选)
使用 手动部署 的 Gateway
必须使用 Helm 单独升级
$ helm upgrade istio-ingress istio/gateway -n istio-ingress
卸载之前的控制平面
如果您已将所有数据平面组件升级为使用 Istio 控制平面的新版本,并且满意您不需要回滚,则可以通过运行以下命令删除控制平面的先前版本
$ helm delete istiod-"$REVISION" -n istio-system