从 Istio 迁移到 Anthos Service Mesh

本页面是多页指南中的一部分,介绍如何在 GKE 集群上将网格从 Istio 1.8 or 1.9 迁移到 Anthos Service Mesh 版本 1.9.8,该网格包含属于不同 Google Cloud 项目的多个集群。如果您使用的是 Istio 的更早版本,则必须先升级,然后才能迁移到 Anthos Service Mesh。如果您需要升级,请在适用的 Istio 版本中转到升级 Istio 页面。在一个步骤中升级多个 Istio 次要版本(即 1.6.x 到 1.8.x)未经过官方测试或推荐。

如需了解单集群网格上的迁移或为包含属于同一 Google Cloud 项目的多个集群的网格进行迁移,请参阅在 GKE 上安装、迁移和升级

准备工作

在安装 Anthos Service Mesh 之前,请确保您已经:

准备迁移

请务必查看准备从 Istio 迁移

要从 Istio 迁移,您需要按照修订版本升级过程(在 Istio 文档中称为“Canary”升级)操作。使用基于修订版本的升级时,您将同时安装新版控制层面和现有控制层面。运行 istioctl install 时,您可以添加一个用于设置新控制平面的 revision 标签的选项。

然后,在工作负载上设置相同的 revision 标签并执行滚动重启,以使用新的 Anthos Service Mesh 版本重新注入代理,从而迁移到新版本。通过这种方法,您可以监控升级对一小部分工作负载的影响。测试应用后,您可以将所有流量迁移到新版本。此方法比执行就地升级更安全,因为新控制层面会立即替换旧版控制层面。

设置凭据和权限

  1. 初始化您的项目,以便准备好安装。除此之外,以下命令会创建一个服务账号,可让控制层面组件(例如边车代理)安全地访问您的项目的数据和资源。

    curl --request POST \
      --header "Authorization: Bearer $(gcloud auth print-access-token)" \
      --data '' \
      "https://meshconfig.googleapis.com/v1alpha1/projects/${PROJECT_ID}:initialize"

    该命令会以空花括号作为响应:{}

  2. 获取身份验证凭据以便与集群进行交互。此命令还会将 kubectl 的当前上下文设置为该集群。

    gcloud container clusters get-credentials ${CLUSTER_NAME} \
        --project=${PROJECT_ID}
    
  3. 向当前用户授予集群管理员权限。您需要这些权限,以便为 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 错误,您可以放心地忽略该错误并继续采用现有集群管理员绑定。

下载安装文件

Linux

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-linux-amd64.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-linux-amd64.tar.gz.1.sig
    openssl dgst -verify /dev/stdin -signature istio-1.9.8-asm.6-linux-amd64.tar.gz.1.sig istio-1.9.8-asm.6-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:

     tar xzf istio-1.9.8-asm.6-linux-amd64.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.9.8-asm.6 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 manifests/profiles 目录中。
  4. 确保您位于 Anthos Service Mesh 安装的根目录。

    cd istio-1.9.8-asm.6

Mac OS

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-osx.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.9.8-asm.6-osx.tar.gz.1.sig istio-1.9.8-asm.6-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:

    tar xzf istio-1.9.8-asm.6-osx.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.9.8-asm.6 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 manifests/profiles 目录中。
  4. 确保您位于 Anthos Service Mesh 安装的根目录。

    cd istio-1.9.8-asm.6

Windows

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-win.zip
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.9.8-asm.6-win.zip.1.sig istio-1.9.8-asm.6-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:

    tar xzf istio-1.9.8-asm.6-win.zip

    该命令会在当前工作目录中创建一个名为 istio-1.9.8-asm.6 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 manifests/profiles 目录中。
  4. 确保您位于 Anthos Service Mesh 安装的根目录。

    cd istio-1.9.8-asm.6

准备资源配置文件

运行 istioctl install 命令时,请在命令行中指定 -f istio-operator.yaml。此文件包含 Anthos Service Mesh 所需的项目和集群的相关信息。您需要下载包含 istio-operator.yaml 和其他资源配置文件的软件包,以便设置项目和集群信息。

如需准备资源配置文件,请执行以下操作:

Mesh CA

  1. 为 Anthos Service Mesh 软件包资源配置文件创建一个新目录。我们建议您使用集群名称作为目录名称。

  2. 切换到您要在其中下载 Anthos Service Mesh 软件包的目录。

  3. 验证 kpt 版本。确保运行的是 1.x 之前版本的 kpt:

    kpt version
    

    输出应类似如下所示:

    0.39.2

    如果您使用的是 kpt 1.x 版或更高版本,请参阅设置环境以下载您的操作系统所需的版本。

  4. 下载软件包:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.9-asm asm
    
  5. 为在其中创建集群的项目设置项目 ID:

    kpt cfg set asm gcloud.core.project ${PROJECT_ID}
    
  6. 为舰队宿主项目设置项目编号:

    kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
    
  7. 设置集群名称:

    kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
    
  8. 设置默认可用区或区域:

    kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
    
  9. 将标记设置为您要安装的 Anthos Service Mesh 版本:

    kpt cfg set asm anthos.servicemesh.tag 1.9.8-asm.6
    
  10. 在 Anthos Service Mesh 软件包资源配置文件中设置修订版本:

    kpt cfg set asm anthos.servicemesh.rev asm-198-6
    

    安装 Anthos Service Mesh 时,您可以在 istiod 上设置修订版本标签。您需要在验证网络钩子上设置相同的修订版本。

  11. 由于多集群配置中的集群在不同项目中,因此您需要为将形成多集群/多项目服务网格的其他项目配置信任网域别名

    1. 获取将进入多集群/多项目网格的所有集群的项目 ID

    2. 针对每个集群的项目 ID,设置信任网域别名。例如,如果 3 个项目中存在集群,请运行以下命令,并将 PROJECT_ID_1PROJECT_ID_2PROJECT_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 之后,您还必须启用跨集群负载均衡

  12. 输出 kpt setter 的值:

    kpt cfg list-setters asm
    

    此命令的输出类似如下所示:

                              NAME                                                       VALUE
    anthos.servicemesh.canonicalServiceHub               gke.gcr.io/asm/canonical-service-controller:1.9.8-asm.6
    anthos.servicemesh.controlplane.monitoring.enabled   true
    anthos.servicemesh.hub                               gke.gcr.io/asm
    anthos.servicemesh.hubMembershipID                   MEMBERSHIP_ID
    anthos.servicemesh.tag                               1.9.8-asm.6
    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 的值。

Istio CA

  1. 为 Anthos Service Mesh 软件包资源配置文件创建一个新目录。我们建议您使用集群名称作为目录名称。

  2. 切换到您要在其中下载 Anthos Service Mesh 软件包的目录。

  3. 验证 kpt 版本。确保运行的是 1.x 之前版本的 kpt:

    kpt version
    

    输出应类似如下所示:

    0.39.2

    如果您使用的是 kpt 1.x 版或更高版本,请下载所需的版本:

    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)"
    
  4. 下载软件包:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.9-asm asm
    
  5. 为在其中创建集群的项目设置项目 ID:

    kpt cfg set asm gcloud.core.project ${PROJECT_ID}
    
  6. 为舰队宿主项目设置项目编号:

    kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
    
  7. 设置集群名称:

    kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
    
  8. 设置默认可用区或区域:

    kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
    
  9. 将标记设置为您要安装的 Anthos Service Mesh 版本:

    kpt cfg set asm anthos.servicemesh.tag 1.9.8-asm.6
    
  10. 在 Anthos Service Mesh 软件包资源配置文件中设置修订版本:

    kpt cfg set asm anthos.servicemesh.rev asm-198-6
    
  11. 输出 kpt setter 的值:

    kpt cfg list-setters asm
    

    此命令的输出类似如下所示:

                              NAME                                                       VALUE
    anthos.servicemesh.canonicalServiceHub               gke.gcr.io/asm/canonical-service-controller:1.9.8-asm.6
    anthos.servicemesh.controlplane.monitoring.enabled   true
    anthos.servicemesh.hub                               gke.gcr.io/asm
    anthos.servicemesh.hubMembershipID                   MEMBERSHIP_ID
    anthos.servicemesh.tag                               1.9.8-asm.6
    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

Mesh CA

  1. 验证当前的 kubeconfig 上下文是否指向要安装 Anthos Service Mesh 的集群:

    kubectl config current-context
    

    输出的格式如下:

    gke_PROJECT_ID_CLUSTER_LOCATION_CLUSTER_NAME

    kubeconfig 上下文和 kpt setter 的值必须匹配。如果需要,请运行 gcloud container clusters get-credentials 命令来设置当前的 kubeconfig 上下文。

  2. 如果需要,请切换到 istio-1.9.8-asm.6 目录。istioctl 客户端依赖于版本。请确保使用 istio-1.9.8-asm.6/bin 目录中的版本。

  3. 运行以下命令以使用 asm-gcp-multiproject 配置文件部署新的控制层面。如果您要启用支持的可选功能,请在以下命令行中添加 -f 和 YAML 文件名。如需了解详情,请参阅启用可选功能

    bin/istioctl install \
      -f asm/istio/istio-operator.yaml \
      -f asm/istio/options/multiproject.yaml \
      -f asm/istio/options/multicluster.yaml \
      -f asm/istio/options/revisioned-istio-ingressgateway.yaml \
      --revision=asm-198-6
    

    --revision 参数会将格式为 istio.io/rev=asm-198-6 的修订版本标签添加到 istiod。自动 Sidecar 注入器网络钩子使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。如需为命名空间启用 Sidecar 自动注入功能,您必须使用一个与 istiod Deployment 匹配的修订版本来为其添加标签。

    以下文件将替换 istio-operator.yaml 文件中的设置:

    • multiproject.yaml 文件设置 asm-gcp-multiproject 配置文件。

    • multicluster.yaml 文件配置 Anthos Service Mesh 进行多集群配置所需的设置。

    • revisioned-istio-ingressgateway.yaml 文件为 istio-ingressgateway 配置修订版本的 Deployment。

  4. 检查 istio-system 中的控制层面 Pod 是否已启动:

    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-198-6-6d5cfd4b89-xztlr           1/1     Running   0          3m44s
    istiod-fb7f746f4-wcntn                      1/1     Running   0          50m

    您有两个控制层面 Deployment 和 Service 并排运行。

  5. 将规范化服务控制器部署到您的集群:

    kubectl apply -f asm/canonical-service/controller.yaml

    规范化服务控制器按照所属的逻辑服务对工作负载进行分组。如需详细了解规范化服务,请参阅规范化服务概览。

Istio CA

  1. 验证当前的 kubeconfig 上下文是否指向要安装 Anthos Service Mesh 的集群:

    kubectl config current-context
    

    输出的格式如下:

    gke_PROJECT_ID_CLUSTER_LOCATION_CLUSTER_NAME

    kubeconfig 上下文和 kpt setter 的值必须匹配。如果需要,请运行 gcloud container clusters get-credentials 命令来设置当前的 kubeconfig 上下文。

  2. 如果需要,请切换到 istio-1.9.8-asm.6 目录。istioctl 客户端依赖于版本。请确保使用 istio-1.9.8-asm.6/bin 目录中的版本。

  3. 运行以下命令以使用 asm-gcp-multiproject 配置文件部署新的控制层面。如果您要启用支持的可选功能,请在以下命令行中添加 -f 和 YAML 文件名。如需了解详情,请参阅启用可选功能

    bin/istioctl install \
      -f asm/istio/istio-operator.yaml \
      -f asm/istio/options/citadel-ca.yaml \
      -f asm/istio/options/multiproject.yaml \
      -f asm/istio/options/multicluster.yaml \
      -f asm/istio/options/revisioned-istio-ingressgateway.yaml \
      --revision=asm-198-6
    

    --revision 参数会将格式为 istio.io/rev=asm-198-6 的修订版本标签添加到 istiod。自动 Sidecar 注入器网络钩子使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。如需为命名空间启用 Sidecar 自动注入功能,您必须使用一个与 istiod Deployment 匹配的修订版本来为其添加标签。

    以下文件将替换 istio-operator.yaml 文件中的设置:

    • citadel-ca.yaml 将 Istio CA 配置为证书授权机构。

    • multiproject.yaml 文件设置 asm-gcp-multiproject 配置文件。

    • multicluster.yaml 文件配置 Anthos Service Mesh 进行多集群配置所需的设置。

    • revisioned-istio-ingressgateway.yaml 文件为 istio-ingressgateway 配置修订版本的 Deployment。

  4. 检查 istio-system 中的控制层面 Pod 是否已启动:

    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-198-6-6d5cfd4b89-xztlr           1/1     Running   0          3m44s
    istiod-fb7f746f4-wcntn                      1/1     Running   0          50m

    您有两个控制层面 Deployment 和 Service 并排运行。

  5. 将规范化服务控制器部署到您的集群:

    kubectl apply -f asm/canonical-service/controller.yaml

    规范化服务控制器按照所属的逻辑服务对工作负载进行分组。如需详细了解规范化服务,请参阅规范化服务概览。

部署和重新部署工作负载

您需要启用自动边车代理注入(自动注入),才能完成安装。 从 OSS Istio 迁移和升级遵循基于修订版本的升级流程(在 Istio 文档中称为“Canary 升级”)。使用基于修订版本的升级时,新版本的控制平面会与现有控制平面一起安装。然后,您可以将一部分工作负载迁移到新版本,这样,您就可以先通过一小部分工作负载监控升级的影响,然后再将所有流量迁移到新版本。

运行 istioctl install 时,您可以在 istiodistio.io/rev=asm-198-6 格式设置修订版本标签。要启用自动注入,请向一个或多个命名空间添加匹配的修订版本标签。Sidecar 注入器网络钩子会使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。添加标签后,重启命名空间中的 pod 以注入 Sidecar。

如果您在运行 istioctl install 时包含 revisioned-istio-ingressgateway.yaml,则系统会为 istio-ingressgateway 配置修订的 Deployment。这样,您就可以控制何时切换到新版本。

  1. 获取 istiodistio-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-198-6
    istio-ingressgateway-asm-182-2-8b5fc8767-hn4w2   1/1     Running   0          20s   asm-198-6
    istiod-asm-176-1-67998f4b55-lrzpz                1/1     Running   0          68m   asm-186-8
    istiod-asm-176-1-67998f4b55-r76kr                1/1     Running   0          68m   asm-186-8
    istiod-asm-182-2-5cd96f88f6-n7tj9                1/1     Running   0          27s   asm-198-6
    istiod-asm-182-2-5cd96f88f6-wm68b                1/1     Running   0          27s   asm-198-6
    1. 请注意,您是否同时拥有新旧两版 istio-ingressgateway

      • 如果您在升级时添加了 revisioned-istio-ingressgateway 选项,则已完成 istio-ingressgateway 的 Canary 升级。在这种情况下,您的输出会同时显示新旧两版 istio-ingressgateway

      • 如果您在升级时未添加 revisioned-istio-ingressgateway,则系统会完成 istio-ingressgateway 的就地升级。在这种情况下,您的输出仅显示新版本。

    2. 在输出中的 REV 列下,记下新版本的修订版标签的值。在此示例中,该值为 asm-198-6

    3. 另请注意旧版 istiod 的修订版本标签中的值。 将工作负载移至新版本后,您需要使用此值删除旧版本的 istiod。在示例输出中,旧版本的修订版本标签值为 asm-186-8

  2. 如果您同时拥有新旧两版 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

  3. 将修订版本标签添加到命名空间,并移除 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 标签。

  4. 重启 pod 以触发重新注入。

    kubectl rollout restart deployment -n NAMESPACE
  5. 验证 pod 是否配置为指向新版 istiod

    kubectl get pods -n NAMESPACE -l istio.io/rev=REVISION
  6. 测试您的应用,验证工作负载是否正常工作。

  7. 如果您的其他命名空间中存在工作负载,请重复上述步骤以标记命名空间并重启 Pod。

  8. 如果您确信应用按预期正常运行,请继续执行转换到新版 istiod 的步骤。如果您的应用出现问题,请按照以下步骤回滚。

  9. 再次运行以下命令,确认您拥有新旧两版 istio-ingressgateway,还是只有新版本。这决定了如何转换到新版本 istio-ingressgateway 或如何回滚到旧版本。

    kubectl get pod -n istio-system -L istio.io/rev
    

    完成转换

    如果您确信应用按预期正常运行,请移除旧控制平面以完成到新版本的转换。

    1. 切换到 anthos-service-mesh GitHub 代码库中的文件所在的目录。

    2. 配置验证 Webhook 以使用新的控制平面。

      kubectl apply -f asm/istio/istiod-service.yaml
      
    3. 如果您同时拥有新旧两版 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
      
    4. 删除 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
      
    5. 移除旧版 IstioOperator 配置。

      kubectl delete IstioOperator installed-state-OLD_REVISION -n istio-system
      

      预期输出如下所示:

      istiooperator.install.istio.io "installed-state-OLD_REVISION" deleted

    回滚

    如果您在使用新版 istiod 测试应用时遇到问题,请按照以下步骤回滚到之前的版本:

    1. 切换回旧版 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
        
    2. 重新为您的命名空间添加标签,以启用旧版 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
    3. 确认命名空间上的修订版本标签与旧版 istiod 的修订版本标签一致:

      kubectl get ns NAMESPACE --show-labels
      
    4. 重启 pod 以触发重新注入,以使代理具有之前的版本:

      kubectl rollout restart deployment -n NAMESPACE
      
    5. 如果您同时拥有新旧两版 istio-ingressgateway,请移除新的 istio-ingressgateway Deployment。确保以下命令中的 REVISION 值正确无误。

      kubectl delete deploy -l app=istio-ingressgateway,istio.io/rev=REVISION -n istio-system --ignore-not-found=true
      
    6. 移除新版 istiod。确保以下命令中的 REVISION 值正确无误。

      kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-REVISION -n istio-system --ignore-not-found=true
      
    7. 移除新版 IstioOperator 配置。

      kubectl delete IstioOperator installed-state-REVISION -n istio-system
      

      预期输出如下所示:

      istiooperator.install.istio.io "installed-state-REVISION" deleted
    8. 如果您未添加 --disable_canonical_service 标志,则脚本会启用规范化服务控制器。我们建议将其保持启用状态,但如果您需要停用,请参阅启用和停用规范化服务控制器

后续步骤