从 Istio 迁移到 Anthos Service Mesh

本页面是多页指南中的一部分,介绍如何在 GKE 集群上将网格从 Istio 迁移到 Anthos Service Mesh 版本 1.7.8,该网格包含属于不同 Google Cloud 项目的多个集群。如需了解单集群网格上的迁移或为包含属于同一 Google Cloud 项目的多个集群的网格进行迁移,请参阅在 GKE 上安装、迁移和升级

准备工作

在安装 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.7.8-asm.10-linux-amd64.tar.gz
  2. 下载签名文件并使用 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

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

  4. Mac OS

  5. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz
  6. 下载签名文件并使用 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

  7. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    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 目录中。

  8. Windows

  9. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip
  10. 下载签名文件并使用 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

  11. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    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 目录中。

  12. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.7.8-asm.10
  13. 为方便起见,请将 /bin 目录中的工具添加到 PATH:
    export PATH=$PWD/bin:$PATH

准备资源配置文件

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

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

Mesh CA

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

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

  3. 下载软件包:

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

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

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

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

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

    kpt cfg set asm anthos.servicemesh.tag 1.7.8-asm.10
    
  9. 设置验证网络钩子以使用修订版本标签:

    kpt cfg set asm anthos.servicemesh.rev asm-178-10
    

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

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

    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 之后,您还必须启用跨集群负载均衡

  11. 输出 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

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

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

  3. 下载软件包:

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

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

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

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

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

    kpt cfg set asm anthos.servicemesh.tag 1.7.8-asm.10
    
  9. 设置验证网络钩子以使用修订版本标签:

    kpt cfg set asm anthos.servicemesh.rev asm-178-10
    
  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

要从 Istio 迁移,请按照双控制层面升级过程(在 Istio 文档中称为 Canary 版升级)操作。通过双控制平面升级,您可以在现有控制平面的基础上安装新版本控制平面。安装新版本时,您要添加可标识新控制平面版本的 revision 标签。每个修订版本都是一个完整的 Anthos Service Mesh 控制平面实现,具有自己的 Deployment 和 Service。

然后,通过在工作负载上设置相同的 revision 标签以指向新的控制平面,并执行滚动重启以使用新的 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. 运行以下命令以使用 asm-gcp-multiproject 配置文件部署新的控制层面。如果您要启用支持的可选功能,请在以下命令行中添加 -f 和 YAML 文件名。如需了解详情,请参阅启用可选功能

    istioctl install \
      -f asm/istio/istio-operator.yaml \
      -f asm/istio/options/multiproject.yaml \
      -f asm/istio/options/multicluster.yaml\
      --revision=asm-178-10
    

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

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

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

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

  3. 检查 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-178-10-6d5cfd4b89-xztlr           1/1     Running   0          3m44s
    istiod-fb7f746f4-wcntn                      1/1     Running   0          50m

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

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

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

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

Citadel

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

    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\
      --revision=asm-178-10
    

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

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

    • citadel-ca.yaml 将 Citadel 配置为 CA。

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

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

  3. 检查 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-178-10-6d5cfd4b89-xztlr           1/1     Running   0          3m44s
    istiod-fb7f746f4-wcntn                      1/1     Running   0          50m

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

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

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

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

重新部署工作负载

安装新修订版本对现有 Sidecar 代理没有影响。如需升级这些代理,您必须将其配置为指向新控制层面。这会在 Sidecar 注入期间根据命名空间标签 istio.io/rev 进行控制。

  1. 更新工作负载以注入新的 Anthos Service Mesh 版本:

    kubectl label namespace NAMESPACE istio-injection- istio.io/rev=asm-178-10 --overwrite

    istio-injection 标签必须移除,因为它优先于 istio.io/rev 标签。

  2. 重启 pod 以触发重新注入:

    kubectl rollout restart deployment -n NAMESPACE
  3. 验证 pod 是否配置为指向 istiod-asm-178-10 控制平面:

    kubectl get pods -n NAMESPACE -l istio.io/rev=asm-178-10

  4. 测试您的应用,验证工作负载是否正常工作。

  5. 如果您在其他命名空间中存在工作负载,请对每个命名空间重复上述步骤。

  6. 如果您确信应用按预期正常运行,请跳到完成迁移。否则,请按照以下步骤操作,回滚到以前的版本:

    如需回滚,请执行以下操作:

    1. 更新要用旧版控制层面注入的工作负载:

      kubectl label namespace NAMESPACE istio.io/rev- istio-injection=enabled --overwrite
    2. 重启 pod 以触发重新注入,以使代理具有之前的版本:

      kubectl rollout restart deployment -n NAMESPACE
    3. 重新部署旧版 istio-ingressgateway

      kubectl -n istio-system rollout undo deploy istio-ingressgateway
      
    4. 移除新的控制层面:

      kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-asm-178-10 -n istio-system --ignore-not-found=true
      

完成迁移

如果您确信应用正在按预期运行,请按以下步骤完成到 Anthos Service Mesh 的迁移:

  1. 移除旧的控制平面:

    kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod -n istio-system --ignore-not-found=true
    

注册您的集群

您必须向项目的队列注册集群,才能获取对 Google Cloud 控制台中的统一界面的访问权限。队列提供一种统一方法来查看和管理集群及其工作负载,包括 Google Cloud 之外的集群。

如需了解如何注册集群,请参阅向舰队注册集群

后续步骤