本指南介绍了如何在 GKE 上将 Anthos Service Mesh 从版本 1.6.4+ 升级到版本 1.7.8。如需从 Anthos Service Mesh 1.4.5 及更高版本升级,您必须先升级到 Anthos Service Mesh 1.5。不支持从 Anthos Service Mesh 1.4 直接升级到 1.6。
Anthos Service Mesh 1.7 及更高版本的安装支持跨版本升级。如需直接升级到 1.10,请参阅将 Anthos Service Mesh 升级到最新版本
升级时,我们建议您执行双控制层面升级(也称为 Canary 版升级),在使用较小百分比的工作负载测试新版本时,新版本和先前版本的控制层面均会运行。此方法比就地升级更安全,因为新版本的控制层面会替换先前版本。请注意,istio-ingressgateway 已就地升级,因此您应该规划好集群中断。重新部署 Anthos Service Mesh 控制层面组件大约需要 5 到 10 分钟才能完成。此外,您需要在所有工作负载中注入新的 Sidecar 代理,以便这些 Sidecar 代理通过当前 Anthos Service Mesh 版本进行更新。更新 Sidecar 代理所需的时间取决于多种因素,例如 Pod 数量、节点数量、部署扩缩设置、Pod 中断预算和其他配置设置。更新 Sidecar 代理所需的时间估计约为每分钟 100 个 Pod。
准备升级
本部分概述了准备升级 Anthos Service Mesh 的步骤。
查看支持的功能和本指南,熟悉这些功能和升级流程。
如果您在安装以前版本的 Anthos Service Mesh 时启用了可选功能,则需要在升级时启用相同的功能。如需启用可选功能,您可以添加
--set values
标志,或在运行istioctl install
命令时通过 YAML 文件指定-f
标志。如果您要在专用集群上安装 Anthos Service Mesh,则必须在防火墙中打开端口 15017,以获取与自动 Sidecar 注入搭配使用的网络钩子,以便正常运行。如需了解详情,请参阅在专用集群上打开端口。
如果要从 Anthos Service Mesh 1.5 版升级,请执行以下步骤以防需要回滚:
创建名为
asm-1-5
的目录。下载 1.5 安装文件到
asm-1-5
目录。将文件内容提取到
asm-1-5
目录。确保您位于 Anthos Service Mesh 1.5 安装根目录下。
下载 1.5
kpt
软件包并配置 1.5istio-operator.yaml
。
设置您的环境
如需在 Google Kubernetes Engine 上进行安装,您可以使用 Cloud Shell、Google Cloud 资源的浏览器内置命令行界面或您自己运行 Linux 或 macOS 的计算机,按照安装指南操作。
选项 A:使用 Cloud Shell
Cloud Shell 预配一个运行基于 Debian 的 Linux 操作系统的 g1-small Compute Engine 虚拟机 (VM)。使用 Cloud Shell 的优势如下:
Cloud Shell 包含您需要的
gcloud
、kubectl
和helm
命令行工具。您的 Cloud Shell $HOME 目录具有 5GB 永久性存储空间。
您可以选择文本编辑器:
代码编辑器,可通过点击 Cloud Shell 窗口顶部的 来访问。
Emac、Vim 或 Nano,可从 Cloud Shell 中的命令行访问。
如需使用 Cloud Shell,请执行以下操作:
- 前往 Google Cloud 控制台。
- 选择您的 Google Cloud 项目。
点击 Google Cloud 控制台窗口顶部的激活 Cloud Shell 按钮。
一个 Cloud Shell 会话随即会在 Google Cloud 控制台底部的新框内打开,并显示命令行提示符。
更新组件:
gcloud components update
该命令会以如下所示的输出作为响应:
ERROR: (gcloud.components.update) You cannot perform this action because the gcloud CLI component manager is disabled for this installation. You can run the following command to achieve the same result for this installation: sudo apt-get update && sudo apt-get --only-upgrade install ...
复制并粘贴长命令以更新组件。
请确保 Git 位于您的路径中,以便
kpt
能够找到它。
选项 B:在本地使用命令行工具
在本地机器上,安装并初始化 Google Cloud CLI。
如果您已安装 gcloud CLI,请执行以下操作:
使用 gcloud CLI 进行身份验证:
gcloud auth login
更新组件:
gcloud components update
安装
kubectl
:gcloud components install kubectl
安装
kpt
:gcloud components install kpt
请确保 Git 位于您的路径中,以便
kpt
能够找到它。
设置环境变量
获取创建集群的项目的 ID 和队列宿主项目的编号。
gcloud
运行以下命令:
gcloud projects list
控制台
前往 Google Cloud 控制台中的信息中心页面。
点击页面顶部的从以下列表中选择:下拉列表。在随即显示的从以下列表中选择:窗口中,选择您的项目。
项目 ID 会显示在项目信息中心的项目信息卡片上。
为在其中创建集群的项目的 ID 创建环境变量:
export PROJECT_ID=YOUR_PROJECT_ID
为队列宿主项目的项目编号创建环境变量:
export FLEET_PROJECT_NUMBER=YOUR_FLEET_PROJECT_NUMBER
创建以下环境变量:
设置集群名称:
export CLUSTER_NAME=YOUR_CLUSTER_NAME
将
CLUSTER_LOCATION
设置为您的集群区域或集群地区:export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
(可选)更改集群上的网格 ID
如果您的服务网格包含或将包含不同项目中的多个集群,则所有集群都必须具有相同的网格 ID,该 ID 取决于队列宿主项目的项目编号。在集群上设置的网格 ID 必须与您配置 Anthos Service Mesh 以使用的网格 ID 相符。
如果您只有一个集群,或者您的服务网格包含或将包含同一项目中的多个集群,请跳过以下步骤并继续执行设置凭据和权限。
如需在集群上设置新的网格 ID 标签,请执行以下操作:
为网格 ID 创建环境变量:
export MESH_ID="proj-${FLEET_PROJECT_NUMBER}"
如果您的集群已有要保留的标签,则在添加
mesh_id
标签时必须将这些标签包含在内。如需查看您的集群是否已有标签,请执行以下操作:
gcloud container clusters describe ${CLUSTER_NAME} \ --project ${PROJECT_ID}
在输出中查找
resourceLabels
字段。每个标签都存储在resourceLabels
字段下的单独的一行中,例如:resourceLabels: csm: '' env: dev release: stable
您无需保留现有的
mesh_id
。请使用新的mesh_id
标签将其覆盖。为方便起见,您可以向环境变量添加标签。在以下命令中,请将
YOUR_EXISTING_LABELS
替换为集群上以英文逗号分隔的现有标签列表,格式为KEY=VALUE
,例如:env=dev,release=stable
export EXISTING_LABELS="YOUR_EXISTING_LABELS"
设置
mesh_id
标签:如果您的集群已有要保留的标签,请使用
mesh_id
和现有标签更新集群:gcloud container clusters update ${CLUSTER_NAME} \ --project ${PROJECT_ID} --update-labels=mesh_id=${MESH_ID},${EXISTING_LABELS}
如果您的集群没有任何现有标签,请仅使用新的
mesh_id
标签更新集群:gcloud container clusters update ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --update-labels=mesh_id=${MESH_ID}
设置凭据和权限
获取身份验证凭据以便与集群进行交互:
gcloud container clusters get-credentials ${CLUSTER_NAME} \ --project=${PROJECT_ID}
向当前用户授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user="$(gcloud config get-value core/account)"
如果看到 "cluster-admin-binding" already exists
错误,您可以放心地忽略该错误并继续采用现有集群管理员绑定。
下载安装文件
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-linux-amd64.tar.gz
-
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-linux-amd64.tar.gz.1.sig openssl dgst -verify /dev/stdin -signature istio-1.7.8-asm.10-linux-amd64.tar.gz.1.sig istio-1.7.8-asm.10-linux-amd64.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.7.8-asm.10-linux-amd64.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.7.8-asm.10
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz
-
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz.1.sig openssl dgst -sha256 -verify /dev/stdin -signature istio-1.7.8-asm.10-osx.tar.gz.1.sig istio-1.7.8-asm.10-osx.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.7.8-asm.10-osx.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.7.8-asm.10
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip
-
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip.1.sig openssl dgst -verify - -signature istio-1.7.8-asm.10-win.zip.1.sig istio-1.7.8-asm.10-win.zip <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.7.8-asm.10-win.zip
该命令会在当前工作目录中创建一个名为
istio-1.7.8-asm.10
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
-
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.7.8-asm.10
-
为方便起见,请将
/bin
目录中的工具添加到 PATH:export PATH=$PWD/bin:$PATH
Linux
Mac OS
Windows
准备资源配置文件
运行 istioctl install
命令时,请在命令行中指定 -f istio-operator.yaml
。此文件包含 Anthos Service Mesh 所需的项目和集群的相关信息。您需要下载包含 istio-operator.yaml
和其他资源配置文件的软件包,以便设置项目和集群信息。
如需准备资源配置文件,请执行以下操作:
Mesh CA
为 Anthos Service Mesh 软件包资源配置文件创建一个新目录。我们建议您使用集群名称作为目录名称。
切换到您要在其中下载 Anthos Service Mesh 软件包的目录。
下载软件包:
kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.7-asm asm
为在其中创建集群的项目设置项目 ID:
kpt cfg set asm gcloud.core.project ${PROJECT_ID}
为舰队宿主项目设置项目编号:
kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
设置集群名称:
kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
设置默认可用区或区域:
kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
将标记设置为您要安装的 Anthos Service Mesh 版本:
kpt cfg set asm anthos.servicemesh.tag 1.7.8-asm.10
设置验证网络钩子以使用修订版本标签:
kpt cfg set asm anthos.servicemesh.rev asm-178-10
安装 Anthos Service Mesh 时,您可以在
istiod
上设置修订版本标签。您需要在验证网络钩子上设置相同的修订版本。由于多集群配置中的集群在不同项目中,因此您需要为将形成多集群/多项目服务网格的其他项目配置信任网域别名。
获取将进入多集群/多项目网格的所有集群的项目 ID。
针对每个集群的项目 ID,设置信任网域别名。例如,如果 3 个项目中存在集群,请运行以下命令,并将
PROJECT_ID_1
、PROJECT_ID_2
和PROJECT_ID_3
替换为每个集群的项目 ID。kpt cfg set asm anthos.servicemesh.trustDomainAliases PROJECT_ID_1.svc.id.goog PROJECT_ID_2.svc.id.goog PROJECT_ID_3.svc.id.goog
在其他项目中配置集群时,您可以使用相同的命令。
通过信任网域别名,Mesh CA 可对其他项目中的集群上的工作负载进行身份验证。除了设置信任网域别名之外,在安装 Anthos Service Mesh 之后,您还必须启用跨集群负载均衡。
输出
kpt
setter 的值:kpt cfg list-setters asm
此命令的输出类似如下所示:
NAME VALUE anthos.servicemesh.canonicalServiceHub gcr.io/gke-release/asm/canonical-service-controller:1.7.8-asm.10 anthos.servicemesh.controlplane.monitoring.enabled true anthos.servicemesh.hub gcr.io/gke-release/asm anthos.servicemesh.hubMembershipID MEMBERSHIP_ID anthos.servicemesh.tag 1.7.8-asm.10 anthos.servicemesh.trustDomainAliases [example-project-12345.svc.id.goog,example-project-23456.svc.id.goog,example-project-98765.svc.id.goog] base-dir base gcloud.compute.location us-central gcloud.compute.network default gcloud.compute.subnetwork default gcloud.container.cluster example-cluster-1 gcloud.container.cluster.clusterSecondaryRange gcloud.container.cluster.releaseChannel REGULAR gcloud.container.cluster.servicesSecondaryRange gcloud.container.nodepool.max-nodes 4 gcloud.core.project example-project-12345 gcloud.project.environProjectID FLEET_PROJECT_ID gcloud.project.environProjectNumber 1234567890123 gcloud.project.projectNumber 9876543210987
验证以下 setter 的值是否正确:
- anthos.servicemesh.rev
- anthos.servicemesh.tag
- anthos.servicemesh.trustDomainAliases
- gcloud.compute.location
- gcloud.container.cluster
- gcloud.core.project
- gcloud.project.environProjectNumber
您可以忽略其他 setter 的值。
Citadel
为 Anthos Service Mesh 软件包资源配置文件创建一个新目录。我们建议您使用集群名称作为目录名称。
切换到您要在其中下载 Anthos Service Mesh 软件包的目录。
下载软件包:
kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.7-asm asm
为在其中创建集群的项目设置项目 ID:
kpt cfg set asm gcloud.core.project ${PROJECT_ID}
为舰队宿主项目设置项目编号:
kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
设置集群名称:
kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
设置默认可用区或区域:
kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
将标记设置为您要安装的 Anthos Service Mesh 版本:
kpt cfg set asm anthos.servicemesh.tag 1.7.8-asm.10
设置验证网络钩子以使用修订版本标签:
kpt cfg set asm anthos.servicemesh.rev asm-178-10
输出
kpt
setter 的值:kpt cfg list-setters asm
此命令的输出类似如下所示:
NAME VALUE anthos.servicemesh.canonicalServiceHub gcr.io/gke-release/asm/canonical-service-controller:1.7.8-asm.10 anthos.servicemesh.controlplane.monitoring.enabled true anthos.servicemesh.hub gcr.io/gke-release/asm anthos.servicemesh.hubMembershipID MEMBERSHIP_ID anthos.servicemesh.tag 1.7.8-asm.10 anthos.servicemesh.trustDomainAliases base-dir base gcloud.compute.location us-central gcloud.compute.network default gcloud.compute.subnetwork default gcloud.container.cluster example-cluster-1 gcloud.container.cluster.clusterSecondaryRange gcloud.container.cluster.releaseChannel REGULAR gcloud.container.cluster.servicesSecondaryRange gcloud.container.nodepool.max-nodes 4 gcloud.core.project example-project-12345 gcloud.project.environProjectID FLEET_PROJECT_ID gcloud.project.environProjectNumber 1234567890123 gcloud.project.projectNumber 9876543210987
验证以下 setter 的值是否正确:
- anthos.servicemesh.rev
- anthos.servicemesh.tag
- gcloud.compute.location
- gcloud.container.cluster
- gcloud.core.project
- gcloud.project.environProjectNumber
您可以忽略其他 setter 的值。
升级 Anthos Service Mesh
如需安装新版本的 Anthos Service Mesh,我们建议您按照双控制平面升级过程(在 Istio 文档中称为 Canary 版升级)操作。通过双控制层面升级,您可以在现有控制层面的基础上安装新版本控制层面。安装新版本时,您要添加可标识新控制平面版本的 revision
标签。每个修订版本都是一个完整的 Anthos Service Mesh 控制平面实现,具有自己的 Deployment 和 Service。
然后,通过在工作负载上设置相同的 revision
标签以指向新的控制平面,并执行滚动重启以使用新的 Anthos Service Mesh 版本重新注入代理,从而迁移到新版本。通过这种方法,您可以监控升级对一小部分工作负载的影响。测试应用后,您可以将所有流量迁移到新版本。此方法比执行就地升级更安全,因为新控制平面会替换先前版本的控制平面。
更新控制平面
运行以下命令,使用您在 istio-operator.yaml
文件中设置的配置文件部署新的控制平面。如果您要启用支持的可选功能,请在以下命令行中添加 -f
和 YAML 文件名。如需了解详情,请参阅启用可选功能。
istioctl install \ -f asm/cluster/istio-operator.yaml \ --set revision=asm-178-10
--set revision
参数会向 istiod 添加一个 istio.io/rev
标签。运行该命令后,您将并排运行两个控制层面 Deployment 和 Service:
kubectl get pods -n istio-system
输出示例:
NAME READY STATUS RESTARTS AGE istio-ingressgateway-c56675fcd-86zdn 1/1 Running 0 2m9s istio-ingressgateway-c56675fcd-vn4nv 1/1 Running 0 2m21s istiod-asm-178-10-6d5cfd4b89-xztlr 1/1 Running 0 3m44s istiod-fb7f746f4-wcntn 1/1 Running 0 50m
重新部署工作负载
安装新修订版本对现有 Sidecar 代理没有影响。如需升级这些代理,您必须将其配置为指向新控制层面。这会在 Sidecar 注入期间根据命名空间标签 istio.io/rev
进行控制。
更新工作负载以注入新的 Anthos Service Mesh 版本:
kubectl label namespace NAMESPACE istio-injection- istio.io/rev=asm-178-10 --overwrite
istio-injection
标签必须移除,因为它优先于istio.io/rev
标签。重启 pod 以触发重新注入:
kubectl rollout restart deployment -n NAMESPACE
验证 pod 是否配置为指向
istiod-asm-178-10
控制平面:kubectl get pods -n NAMESPACE -l istio.io/rev=asm-178-10
测试您的应用,验证工作负载是否正常工作。
如果您在其他命名空间中存在工作负载,请对每个命名空间重复上述步骤。
如果您确信应用正在按预期运行,请跳至完成升级。否则,请按照以下步骤操作,回滚到以前的版本。
更新要用控制平面的先前版本注入的工作负载,请运行以下命令:
kubectl label namespace NAMESPACE istio.io/rev- istio-injection=enabled --overwrite
重启 Pod 以触发重新注入,以便代理具有以前的版本:
kubectl rollout restart deployment -n NAMESPACE
回滚控制平面组件,请执行以下操作:
回滚到之前的 1.6 版
重新部署旧版
istio-ingressgateway
:kubectl -n istio-system rollout undo deploy istio-ingressgateway
移除新的控制层面:
kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-asm-178-10 -n istio-system --ignore-not-found=true
回滚到 1.5
切换到下载 1.5 Anthos Service Mesh 安装文件的目录。
重新安装旧版 Anthos Service Mesh。在以下命令中,如果您已启用可选功能,请务必添加适用的
--set values
标志或带有 YAML 文件名的-f
标志。bin/istioctl install \ -f asm/cluster/istio-operator.yaml
完成升级
如果您确信应用正在按预期工作,请按以下步骤完成升级:
移除旧的控制层面:
kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod -n istio-system --ignore-not-found=true
运行以下命令以部署规范化服务控制器:
kubectl apply -f asm/canonical-service/controller.yaml
该命令会将规范化服务控制器部署到您的集群。规范化服务控制器会对属于同一逻辑服务的工作负载进行分组,且您必须使用它解锁 Google Cloud 控制台的服务信息中心中的额外功能。如需了解详情,请参阅启用和停用规范化服务控制器。