本指南说明了如何在 GKE on VMware 上将 Anthos Service Mesh 从版本 1.7.3+ or a 1.8 patch release 升级到版本 1.8.6。不支持从更早版本升级。如果您有早期版本,并且需要升级,请参阅从早期版本升级。
在升级时,我们建议您进行基于修订版本的升级(也称为“Canary 升级”),在其中,当您仅对一小部分工作负载测试新版本时,新旧版本的控制平面都在运行。此方法比就地升级更安全,因为新版本的控制层面会替换先前版本。请注意,istio-ingressgateway
已就地升级,因此您应该规划好集群中断。重新部署 Anthos Service Mesh 控制层面组件大约需要 5 到 10 分钟才能完成。此外,您需要在所有工作负载中注入新的 Sidecar 代理,以便这些 Sidecar 代理通过当前 Anthos Service Mesh 版本进行更新。更新 Sidecar 代理所需的时间取决于多种因素,例如 Pod 数量、节点数量、部署扩缩设置、Pod 中断预算和其他配置设置。更新 Sidecar 代理所需的时间估计约为每分钟 100 个 Pod。
准备升级
如果您自定义了先前的安装,则在升级到 Anthos Service Mesh 时也需要使用相同的自定义设置。如果您通过向 istioctl install
添加 --set values
标志自定义安装,我们建议您将这些设置添加到 IstioOperator
YAML 文件中(尽管您可以继续使用 --set_values
标志)。要自定义安装,请在运行 istioctl install
命令时用 YAML 文件指定 -f
标志。
设置您的环境
在要安装 Anthos Service Mesh 的机器上,您需要以下工具。请注意,您只能在用户集群上安装 Anthos Service Mesh,不能在管理员集群上安装。
curl
命令行工具。- Google Cloud CLI。
安装 Google Cloud CLI 后:
使用 Google Cloud CLI 进行身份验证:
gcloud auth login
更新组件:
gcloud components update
安装
kubectl
:gcloud components install kubectl
安装所需的
kpt
版本:curl -L https://github.com/GoogleContainerTools/kpt/releases/download/v0.39.2/kpt_linux_amd64 > kpt_0_39_2 chmod +x kpt_0_39_2 alias kpt="$(readlink -f kpt_0_39_2)"
将上下文切换到用户集群:
kubectl config use-context CLUSTER_NAME
向您的用户账号(您的 Google Cloud 登录电子邮件地址)授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user=USER_ACCOUNT
下载安装文件
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.8.6-asm.8-linux-amd64.tar.gz
-
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.8.6-asm.8-linux-amd64.tar.gz.1.sig openssl dgst -verify /dev/stdin -signature istio-1.8.6-asm.8-linux-amd64.tar.gz.1.sig istio-1.8.6-asm.8-linux-amd64.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.8.6-asm.8-linux-amd64.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.8.6-asm.8
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
-
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.8.6-asm.8
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.8.6-asm.8-osx.tar.gz
-
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.8.6-asm.8-osx.tar.gz.1.sig openssl dgst -sha256 -verify /dev/stdin -signature istio-1.8.6-asm.8-osx.tar.gz.1.sig istio-1.8.6-asm.8-osx.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.8.6-asm.8-osx.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.8.6-asm.8
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
-
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.8.6-asm.8
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.8.6-asm.8-win.zip
-
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.8.6-asm.8-win.zip.1.sig openssl dgst -verify - -signature istio-1.8.6-asm.8-win.zip.1.sig istio-1.8.6-asm.8-win.zip <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.8.6-asm.8-win.zip
该命令会在当前工作目录中创建一个名为
istio-1.8.6-asm.8
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
-
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.8.6-asm.8
Linux
Mac OS
Windows
准备资源配置文件
运行 istioctl install
命令时,应在命令行中包含 revisioned-custom-ingressgateway.yaml
文件。您可以使用此文件来控制升级后切换到 istio-ingressgateway
的新版本。如要下载并配置此文件,请执行以下步骤:
切换到您要在其中下载
anthos-service-mesh
软件包的目录。下载软件包:
kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.8-asm asm
将标记设置为您要安装的 Anthos Service Mesh 版本:
kpt cfg set asm anthos.servicemesh.tag 1.8.6-asm.8
设置验证网络钩子以使用修订版本标签:
kpt cfg set asm anthos.servicemesh.rev asm-186-8
安装 Anthos Service Mesh 时,您可以在
istiod
上设置修订版本标签。您需要在验证网络钩子上设置相同的修订版本。
升级 Anthos Service Mesh
如需安装新版本的 Anthos Service Mesh,建议您遵循基于修订版本的升级过程(也称为“Canary 升级”)。使用基于修订版本的升级时,您将同时安装新版控制层面和现有控制层面。安装新版本时,您要添加可标识新控制平面版本的 revision
标签。每个修订版本都是一个完整的 Anthos Service Mesh 控制平面实现,具有自己的 Deployment 和 Service。
然后,通过在工作负载上设置相同的 revision
标签以指向新的控制平面,并执行滚动重启以使用新的 Anthos Service Mesh 版本重新注入代理,从而迁移到新版本。通过这种方法,您可以监控升级对一小部分工作负载的影响。测试应用后,您可以将所有流量迁移到新版本。此方法比执行就地升级更安全,因为新控制平面会替换先前版本的控制平面。
更新控制平面
如果需要,请切换到
istio-1.8.6-asm.8
目录。istioctl
客户端依赖于版本。请确保使用istio-1.8.6-asm.8/bin
目录中的版本。运行以下命令以部署新的控制平面。如果您要启用受支持的可选功能,请在以下命令行中添加
-f
和 YAML 文件名。如需了解详情,请参阅启用可选功能。bin/istioctl install \ --set profile=asm-multicloud \ -f asm/istio/options/revisioned-istio-ingressgateway.yaml \ --set revision=asm-186-8
--set revision
参数会向 istiod
添加一个 istio.io/rev
标签。运行该命令后,您将并排运行两个控制层面 Deployment 和 Service:
kubectl get pods -n istio-system
部署和重新部署工作负载
获取
istiod
和istio-ingressgateway
上的修订版本标签。kubectl get pod -n istio-system -L istio.io/rev
此命令的输出类似如下所示。
NAME READY STATUS RESTARTS AGE REV istio-ingressgateway-65d884685d-6hrdk 1/1 Running 0 67m istio-ingressgateway-65d884685d-94wgz 1/1 Running 0 67m istio-ingressgateway-asm-182-2-8b5fc8767-gk6hb 1/1 Running 0 5s asm-186-8 istio-ingressgateway-asm-182-2-8b5fc8767-hn4w2 1/1 Running 0 20s asm-186-8 istiod-asm-176-1-67998f4b55-lrzpz 1/1 Running 0 68m asm-178-10 istiod-asm-176-1-67998f4b55-r76kr 1/1 Running 0 68m asm-178-10 istiod-asm-182-2-5cd96f88f6-n7tj9 1/1 Running 0 27s asm-186-8 istiod-asm-182-2-5cd96f88f6-wm68b 1/1 Running 0 27s asm-186-8
请注意,您是否同时拥有新旧两版
istio-ingressgateway
。如果您在升级时添加了
revisioned-istio-ingressgateway
选项,则已完成istio-ingressgateway
的 Canary 升级。在这种情况下,您的输出会同时显示新旧两版istio-ingressgateway
。如果您在升级时未添加
revisioned-istio-ingressgateway
,则系统会完成istio-ingressgateway
的就地升级。在这种情况下,您的输出仅显示新版本。
在输出中的
REV
列下,记下新版本的修订版标签的值。在此示例中,该值为asm-186-8
。另请注意旧版
istiod
的修订版本标签中的值。 将工作负载移至新版本后,您需要使用此值删除旧版本的istiod
。在示例输出中,旧版本的修订版本标签值为asm-178-10
。
如果您同时拥有新旧两版
istio-ingressgateway
,请将istio-ingressgateway
切换到新修订版本。在以下命令中,将REVISION
的值更改为新版本修订版本标签的值。kubectl patch service -n istio-system istio-ingressgateway --type='json' -p='[{"op": "replace", "path": "/spec/selector/service.istio.io~1canonical-revision", "value": "REVISION"}]'
预期输出:
service/istio-ingressgateway patched
将修订版本标签添加到命名空间,并移除
istio-injection
标签(如果存在)。在以下命令中,将REVISION
更改为与istiod
的新修订版本匹配的值。kubectl label namespace NAMESPACE istio.io/rev=REVISION istio-injection- --overwrite
如果您在输出中看到
"istio-injection not found"
,则可以忽略它。这意味着命名空间之前没有istio-injection
标签。如果命名空间同时具有istio-injection
和修订版本标签,自动注入将失败,因此 Anthos Service Mesh 文档中的所有kubectl label
命令都包含移除istio-injection
标签。重启 pod 以触发重新注入。
kubectl rollout restart deployment -n NAMESPACE
验证 pod 是否配置为指向新版
istiod
。kubectl get pods -n NAMESPACE -l istio.io/rev=REVISION
测试您的应用,验证工作负载是否正常工作。
如果您的其他命名空间中存在工作负载,请重复上述步骤以标记命名空间并重启 Pod。
如果您确信应用按预期正常运行,请继续执行转换到新版
istiod
的步骤。如果您的应用出现问题,请按照以下步骤回滚。再次运行以下命令,确认您拥有新旧两版
istio-ingressgateway
,还是只有新版本。这决定了如何转换到新版本istio-ingressgateway
或如何回滚到旧版本。kubectl get pod -n istio-system -L istio.io/rev
完成转换
如果您确信应用按预期正常运行,请移除旧控制平面以完成到新版本的转换。
切换到
anthos-service-mesh
GitHub 代码库中的文件所在的目录。配置验证 Webhook 以使用新的控制平面。
kubectl apply -f asm/istio/istiod-service.yaml
如果您同时拥有新旧两版
istio-ingressgateway
,请删除旧的istio-ingressgateway
Deployment。要运行的命令取决于您是从 Istio 迁移还是从旧版 Anthos Service Mesh 升级:迁移
如果您是从 Istio 迁移,旧的
istio-ingressgateway
没有修订版本标签。kubectl delete deploy/istio-ingressgateway -n istio-system
升级
如果您是从旧版 Anthos Service Mesh 升级,请在以下命令中将
OLD_REVISION
替换为旧版istio-ingressgateway
的修订版本标签。kubectl delete deploy -l app=istio-ingressgateway,istio.io/rev=OLD_REVISION -n istio-system --ignore-not-found=true
删除
istiod
的旧版本。要使用的命令取决于您是从 Istio 迁移还是从旧版 Anthos Service Mesh 升级。迁移
如果您是从 Istio 迁移,旧的
istiod
没有修订版本标签。kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod -n istio-system --ignore-not-found=true
升级
如果您是从旧版 Anthos Service Mesh 升级,在以下命令中,请确保
OLD_REVISION
与旧版istiod
的修订版本标签匹配。kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-OLD_REVISION -n istio-system --ignore-not-found=true
移除旧版
IstioOperator
配置。kubectl delete IstioOperator installed-state-OLD_REVISION -n istio-system
预期输出如下所示:
istiooperator.install.istio.io "installed-state-OLD_REVISION" deleted
回滚
如果您在使用新版
istiod
测试应用时遇到问题,请按照以下步骤回滚到之前的版本:切换回旧版
istio-ingressgateway
。您使用的命令取决于您同时拥有新旧两版istio-ingressgateway
还是只有新版本。如果您同时拥有新旧两版
istio-ingressgateway
,请运行kubectl patch service
命令并将OLD_REVISION
替换为旧修订版本。kubectl patch service -n istio-system istio-ingressgateway --type='json' -p='[{"op": "replace", "path": "/spec/selector/service.istio.io~1canonical-revision", "value": "OLD_REVISION"}]'
如果您只有新版本的
istio-ingressgateway
,请运行kubectl rollout undo
命令。kubectl -n istio-system rollout undo deploy istio-ingressgateway
重新为您的命名空间添加标签,以启用旧版
istiod
的自动注入。使用的命令取决于您在旧版本使用的是修订版本标签还是istio-injection=enabled
。如果您使用修订版本标签来进行自动注入,请使用以下命令:
kubectl label namespace NAMESPACE istio.io/rev=OLD_REVISION --overwrite
如果您使用的是
istio-injection=enabled
,请使用以下命令:kubectl label namespace NAMESPACE istio.io/rev- istio-injection=enabled --overwrite
预期输出:
namespace/NAMESPACE labeled
确认命名空间上的修订版本标签与旧版
istiod
的修订版本标签一致:kubectl get ns NAMESPACE --show-labels
重启 pod 以触发重新注入,以使代理具有之前的版本:
kubectl rollout restart deployment -n NAMESPACE
如果您同时拥有新旧两版
istio-ingressgateway
,请移除新的istio-ingressgateway
Deployment。确保以下命令中的REVISION
值正确无误。kubectl delete deploy -l app=istio-ingressgateway,istio.io/rev=REVISION -n istio-system --ignore-not-found=true
移除新版
istiod
。确保以下命令中的REVISION
值正确无误。kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-REVISION -n istio-system --ignore-not-found=true
移除新版
IstioOperator
配置。kubectl delete IstioOperator installed-state-REVISION -n istio-system
预期输出如下所示:
istiooperator.install.istio.io "installed-state-REVISION" deleted
如果您未添加
--disable_canonical_service
标志,则脚本会启用规范化服务控制器。我们建议将其保持启用状态,但如果您需要停用,请参阅启用和停用规范化服务控制器。