将 Compute Engine 虚拟机添加到 Anthos Service Mesh

简介

借助 Anthos Service Mesh,您可以管理、观察和保护在代管式实例组 (MIG) 上运行的服务,以及在网格中的 Google Kubernetes Engine (GKE) 集群上运行的服务。这样您就可以对网格中的 Compute Engine 实例执行以下操作:

  • 管理流量。
  • 强制执行 mTLS。
  • 对服务流量应用访问权限控制。
  • 安全地访问 Google Cloud 服务。
  • 收集指标、日志记录和跟踪记录数据。
  • 使用 Google Cloud Console 监控服务。

这使不适合或尚未准备好进行容器化的旧版应用可以利用 Anthos Service Mesh 功能,并将这些工作负载与其余服务集成在一起。

运作方式

ASM 提供了两个相关的自定义资源定义 (CRD) 来代表虚拟机工作负载:

  • WorkloadGroup 代表共享共同属性的虚拟机工作负载的逻辑组。这类似于 Kubernetes 中的 Deployment。
  • WorkloadEntry 表示虚拟机工作负载的单个实例。这类似于 Kubernetes 中的 Pod。
  • Service 可以选择 WorkloadGroup,并按照与 Pod 类似的方式使 ASM 将流量路由到虚拟机实例。这可让虚拟机像网格中的任何其他工作负载一样工作。

您可以为每个 Compute Engine 实例组创建一个 Compute Engine 实例模板,该模板会为该实例组中的每个 Compute Engine 实例指定服务代理。在安装期间,该代理会引导服务代理,设置流量拦截并监控服务代理在 Compute Engine 实例的生命周期内的运行状况。该代理与 Anthos Service Mesh 控制层面连接,然后自动将每个 Compute Engine 实例注册为相应 WorkloadGroupWorkloadEntry。这让 Anthos Service Mesh 可以将每个实例视为服务端点,就像集群中的 Kubernetes pod 一样。您还可以为虚拟机工作负载创建 Kubernetes 服务,就像为 Kubernetes pod 创建 Kubernetes 服务一样。

如需增加或减少 Compute Engine 实例上的工作负载数量,从 MIG 大小下限 (0) 开始,请参阅自动扩缩实例组

服务代理依赖于虚拟机管理器,以确保代理已安装在 MIG 中的每个虚拟机中。如需详细了解实例组和虚拟机管理,请参阅代管式实例组 (MIG)虚拟机管理器

支持的 Linux 发行版

操作系统版本 支持
Debian 10
Debian 9
Centos 8
Centos 7

如需详细了解操作系统发行版,请参阅 Debian 支持CentOS 支持

限制

  • 网格控制层面必须为 Anthos Service Mesh 1.9 或更高版本。
  • 仅支持使用 Compute Engine 实例模板创建的 Compute Engine 代管式实例组。
  • 集群和虚拟机必须位于同一网络中、同一项目中,并且使用单个网络接口。
  • 您可以在不订阅 GKE Enterprise 的情况下使用此功能,但 Google Cloud 控制台中的某些界面元素和功能仅限 GKE Enterprise 订阅者使用。如需了解订阅者和非订阅者可以使用的内容,请参阅 GKE Enterprise 和 Anthos Service Mesh 界面差异

前提条件

在开始之前,请检查以下前提条件。

集群

此页面包含用于安装 Anthos Service Mesh 或更新已安装 Anthos Service Mesh 的集群的选项。无论是哪种情况,这些步骤都需要 Anthos Service Mesh 1.9 及更高版本以及满足这些要求的集群。此外,Anthos Service Mesh 虚拟机支持还有其他要求:

  • 控制层面必须安装在由您控制的集群中。不支持 Google 管理的控制层面。如需了解详情,请参阅 Google 管理的控制层面
  • 将 Mesh CA 用作证书授权机构。
  • 使用 Stackdriver 进行遥测。
  • 启用规范化服务部署,Anthos Service Mesh 安装过程会自动启用。

集群必须注册到一个队列。但是,如果尚未注册,则虚拟机安装过程可以在指定的项目中为您注册。

如果您是 GKE Enterprise 订阅者,请启用 GKE Enterprise API。

启用该 API

CLI 工具

安装过程需要以下工具(如果使用 Google Cloud Shell,则已安装):

  • gcloud
  • kubectl
  • kpt
  • curl
  • jq
  • awk
  • printf
  • tr
  • grep
  • tail

下载脚本

本部分介绍如何下载虚拟机新手入门的脚本。

  1. 将 Anthos Service Mesh 1.9.8 的虚拟机脚本下载到当前工作目录:

    curl https://storage.googleapis.com/csm-artifacts/asm/asm_vm_1.9 > asm_vm
    
  2. 将文件的 SHA-256 下载到当前工作目录:

    curl https://storage.googleapis.com/csm-artifacts/asm/asm_vm_1.9.sha256 > asm_vm.sha256
    
  3. 在这两个文件位于同一目录的情况下,验证下载:

    sha256sum -c --ignore-missing asm_vm.sha256
    

    如果验证成功,则该命令会输出 asm_vm: OK

    为了确保兼容性,asm_vm.sha256 文件包含两次校验和,以允许将脚本的任何版本重命名为 asm_vm。如果出现 --ignore-missing 不存在的错误,请重新运行上一个命令,但不使用 --ignore-missing 标志。

  4. 让该脚本可执行:

    chmod +x asm_vm
    

使用入门

本部分介绍了将 Compute Engine 实例添加到 Anthos Service Mesh 的步骤。

设置环境

  1. 由于以下某些步骤要求您直接在集群上进行更改,因此使用 gcloudkubectl 工具配置为指向您指定的集群。

    gcloud container clusters get-credentials CLUSTER_NAME --zone CLUSTER_LOCATION --project PROJECT_ID
    

准备集群

通过准备 Anthos Service Mesh 1.9 及更高版本的控制层面,为虚拟机设置 Anthos Service Mesh 集群。

根据集群上是否已安装 Anthos Service Mesh 1.9 及更高版本,选择下一步。

未安装

如果集群上尚未安装 Anthos Service Mesh 1.9 及更高版本,您可以参阅以下示例,该示例展示了如何添加 vmhub-meshca 选项来修改 GKE 的安装、迁移和升级中提供的常规 Anthos Service Mesh 安装步骤。还说明了如何下载以下示例中使用的 install_asm 脚本。

下载 install_asm 脚本后,您可以通过添加 --option hub-meshca--option vm--enable_all 标志在集群中安装 Anthos Service Mesh。如需了解详情,请参阅启用使用队列的 Mesh CA启用标志

./install_asm --project_id PROJECT_ID \
--cluster_name CLUSTER_NAME \
--cluster_location CLUSTER_LOCATION \
--mode install --option vm --option hub-meshca \
--enable_all

已安装

如果集群上已安装 Anthos Service Mesh 1.9 及更高版本,并且已启用使用舰队的 Mesh CA,请更新 Anthos Service Mesh 控制层面以支持基于虚拟机的工作负载。该脚本还有助于验证集群中的 Anthos Service Mesh 安装是否已准备好用于虚拟机工作负载。具体来说,prepare_cluster 子命令会更新 Anthos Service Mesh 1.9 及更高版本中的所有修订版本,以便为虚拟机工作负载做好准备。

如果 Anthos Service Mesh 1.9 及更高版本安装中未启用使用舰队的 Mesh CA,请通过在 install_asm 脚本中添加 --option hub-meshca--option vm 标志,重新安装升级 Anthos Service Mesh 1.9 及更高版本安装。

./asm_vm prepare_cluster \
--project_id PROJECT_ID \
--cluster_name CLUSTER_NAME \
--cluster_location CLUSTER_LOCATION

上述步骤为您执行了以下操作:

  1. 启用虚拟机自动注册:通过将 PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION 变量设置为 true 来完成此操作。启用此功能后,系统将向 WorkloadGroup 注册新的虚拟机实例,并创建新的 WorkloadEntry CR 以将流量路由到该虚拟机。默认情况下,使用 install_asm 安装的所有 Anthos Service Mesh 1.9 及更高版本控制层面都将包含此内容。

  2. 安装扩展网关:此网关名为 eastwest 网关,并在 Anthos Service Mesh 配置软件包中定义。此操作还会将控制层面公开给虚拟机。

  3. 安装 IdentityProvider CRD 并注册 Google IdentityProvider CR,以使虚拟机能够对 Anthos Service Mesh 控制层面进行身份验证并安全地与其余服务网格进行通信。

  4. 如果在 install_asm 脚本中使用 --enable_all--enable_registration,请将将集群注册到队列并启用工作负载身份

  5. 在队列中启用 Service Mesh 功能。此功能将管理必要政策,以允许虚拟机安全地与网格进行通信。

添加虚拟机

在本部分中,您将根据使用 asm_vm 脚本创建的实例模板将 Compute Engine 实例添加到网格中。该脚本仅会为服务代理生成必要的配置。如需在实例模板中包含更多配置,请创建来源实例模板并将其添加到该脚本中。

如需将虚拟机添加到网格,请按以下步骤操作:

  1. 设置要在后续步骤中使用的以下环境变量。为每个虚拟机工作负载设置以下变量:

    • WORKLOAD_NAME 是虚拟机所属工作负载的名称,必须是符合标准的 DNS-1123 子网域(包含小写字母数字字符)。
    • WORKLOAD_VERSION 是虚拟机所属的工作负载的版本。可选。
    • WORKLOAD_SERVICE_ACCOUNT 是虚拟机运行所用的服务 GCP 服务账号。
    • WORKLOAD_NAMESPACE 是工作负载的命名空间。
    • ASM_INSTANCE_TEMPLATE 是要创建的实例模板的名称。Compute Engine 实例模板名称不允许使用下划线。
    • SOURCE_INSTANCE_TEMPLATE 是生成的模板所基于的模板名称。可选。
  2. 如果虚拟机工作负载尚不存在,请为其提供命名空间:

    kubectl create ns WORKLOAD_NAMESPACE
    
  3. 使用控制层面修订版本标记命名空间。如需查看如何查找显示为 REVISION 的控制层面修订版本的示例,请参阅部署和重新部署工作负载

    kubectl label ns WORKLOAD_NAMESPACE istio-injection- istio.io/rev=REVISION --overwrite
    
  4. 为要注册的虚拟机创建 WorkloadGroup

    kubectl apply -f - << EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: WorkloadGroup
    metadata:
     name: WORKLOAD_NAME
     namespace: WORKLOAD_NAMESPACE
    spec:
     metadata:
       labels:
         app.kubernetes.io/name: WORKLOAD_NAME
         app.kubernetes.io/version: WORKLOAD_VERSION
       annotations:
         security.cloud.google.com/IdentityProvider: google
     template:
       serviceAccount: WORKLOAD_SERVICE_ACCOUNT
    EOF
    
    字段 说明
    name 虚拟机所属的工作负载的名称。
    namespace 工作负载所属的命名空间。
    app.kubernetes.io/name 推荐用于 Kubernetes 应用的标签。您可以为虚拟机工作负载使用自己的标签。
    app.kubernetes.io/version 推荐用于 Kubernetes 应用的标签。您可以为虚拟机工作负载使用自己的标签。
    serviceAccount 虚拟机和项目使用的服务账号身份,该身份将用作 SPIFFE 格式的工作负载身份的一部分。如需了解详情,请参阅服务账号
    security.cloud.google.com/IdentityProvider 虚拟机将使用的身份提供商,应已在集群中注册。对于 Compute Engine 虚拟机,该身份提供商应设置为 google。“IdentityProvider”会告知控制层面如何对虚拟机的凭据进行身份验证以及在哪里提取虚拟机的服务账号。
  5. 使用以下选项和标志运行 asm_vm 脚本,以便为 Anthos Service Mesh Compute Engine 实例创建实例模板。

    该脚本会验证集群前提条件,为 Anthos Service Mesh 添加虚拟机标签,为服务代理生成自定义元数据配置并创建新的实例模板。

    如果希望脚本基于现有的实例模板,则可以指定 --source_instance_template 选项。 如果要将非默认虚拟机添加到 Anthos Service Mesh,请使用预期的操作系统发行版创建实例模板,并将该模板用作 asm_vm 脚本中 --source_instance_template 标志的值。如果您的现有实例模板包含需要网络连接的启动脚本,则该脚本应能够灵活应对暂时性的网络连接问题。如需了解如何针对临时网络中断增加弹性的示例,请参阅演示应用

    ./asm_vm create_gce_instance_template \
    ASM_INSTANCE_TEMPLATE \
    --project_id PROJECT_ID \
    --cluster_location CLUSTER_LOCATION \
    --cluster_name CLUSTER_NAME \
    --workload_name WORKLOAD_NAME \
    --workload_namespace WORKLOAD_NAMESPACE \
    --source_instance_template SOURCE_INSTANCE_TEMPLATE
    

    选项

    方法 说明
    -p|--project_id PROJECT_ID 在其中创建集群的项目的 ID。
    -n|--cluster_name CLUSTER_NAME 集群的名称。
    -l|--cluster_location CLUSTER_LOCATION 在其中创建集群的可用区(对于单可用区集群)或区域(对于区域级集群)。
    -w|--workload_name WORKLOAD_NAME Compute Engine 实例代表的工作负载的名称。
    --workload_namespace WORKLOAD_NAMESPACE 可选。工作负载的命名空间。默认值为“default”。
    -s|--source_instance_template SOURCE_INSTANCE_TEMPLATE_NAME 可选。用作 Anthos Service Mesh Compute Engine 实例模板的基础的现有实例模板。如果未指定,则系统会创建使用默认值的实例模板。

    标志

    标志 说明
    -v|--verbose 在执行前后输出命令。
    --dry_run 输出命令,但不执行这些命令。
    --only_validate 运行验证,但不创建新的 Compute Engine 实例模板。
    -h|--help 显示描述选项和标志的帮助消息并退出。
  6. 为您创建的每个 MIG 设置以下环境变量:

    • INSTANCE_GROUP_NAME 是要创建的 Compute Engine 实例组的名称。
    • ASM_INSTANCE_TEMPLATE 是要创建的实例模板的名称。Compute Engine 实例模板名称不允许使用下划线。
    • INSTANCE_GROUP_ZONE 是要创建的 Compute Engine 实例组的可用区。
    • PROJECT_ID 是在其中创建集群的项目的 ID。
    • SIZE 是要创建的实例组的大小。创建实例组后,该名称可以更改。
    • WORKLOAD_NAME 是虚拟机所属的工作负载的名称。
    • WORKLOAD_NAMESPACE 是工作负载的命名空间。
  7. 使用上一步中创建的变量,为虚拟机工作负载创建代管式实例组:

    gcloud compute instance-groups managed create \
    INSTANCE_GROUP_NAME \
    --template ASM_INSTANCE_TEMPLATE \
    --zone=INSTANCE_GROUP_ZONE \
    --project=PROJECT_ID \
    --size=SIZE
    

    如需增加或减少 Compute Engine 实例上的工作负载数量,从可用区级或区域级 MIG 大小 (0) 开始,请参阅自动扩缩实例组。如需详细了解如何创建组,请参阅 gcloud compute instance-groups managed create

    当您的实例启动时,它会自动使用集群中的 Anthos Service Mesh 控制层面进行身份验证,并且控制层面会将每个虚拟机注册为 WorkloadEntry

  8. 当 MIG 中的虚拟机实例完成启动后,您可以使用以下命令查看工作负载命名空间中的注册虚拟机:

       kubectl get workloadentry -n WORKLOAD_NAMESPACE
    
  9. 添加 Kubernetes Service 以公开上面添加的虚拟机工作负载。请务必让服务为上面注册的虚拟机 WorkloadGroup 选择相应的标签,以便正确路由流量。

    以下示例会在命名空间 WORKLOAD_NAMESPACE 中创建名为 WORKLOAD_NAME 的 Kubernetes 服务,此服务会在 HTTP 端口 80 下公开具有 app.kubernetes.io/name: WORKLOAD_NAME 标签的虚拟机工作负载。

    kubectl apply -f - << EOF
    apiVersion: v1
    kind: Service
    metadata:
     name: WORKLOAD_NAME
     namespace: WORKLOAD_NAMESPACE
     labels:
       asm_resource_type: VM
    spec:
     ports:
     - port: 80
       name: http
     selector:
       app.kubernetes.io/name: WORKLOAD_NAME
    EOF
    

    如需详细了解如何创建 Kubernetes 服务,请参阅 https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service

  10. 如需在虚拟机上使用示例应用,请参阅部署示例应用

Anthos Service Mesh 控制层面升级

按照将 Anthos Service Mesh 升级到最新版本中的说明,将您的 Anthos Service Mesh 控制层面升级到新版本。安装新版本的 Anthos Service Mesh 控制层面后,请按照部署和重新部署工作负载中的说明重新部署 Kubernetes 工作负载。

对于虚拟机工作负载,请创建新的实例模板并对 MIG 中的虚拟机执行滚动更新:

  1. 使用以下命令查找 istiod 的修订版本标签:

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    此命令的输出类似如下所示。请注意,迁移的输出与升级的输出略有不同。以下示例输出来自迁移。

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-7744bc8dd7-qhlss             1/1     Running   0          49m   app=istiod,istio.io/rev=default,istio=pilot,pod-template-hash=7744bc8dd7
    istiod-asm-198-6-85d86774f7-flrt2   1/1     Running   0          26m   app=istiod,istio.io/rev=asm-198-6,istio=istiod,pod-template-hash=85d86774f7
    istiod-asm-198-6-85d86774f7-tcwtn   1/1     Running   0          26m   app=istiod,istio.io/rev=asm-198-6,istio=istiod,pod-template-hash=85d86774f7
    1. 在输出中的 LABELS 列下,记下新版本的 istiod 修订版本标签中的值,该值位于前缀 istio.io/rev= 之后。在此示例中,该值为 asm-198-6

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

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

  3. 使用 asm_vm 脚本创建新的实例模板。如果您有一个用于相同工作负载的模板,请确保使用新的实例模板名称并包括相同的源实例模板。

    ./asm_vm create_gce_instance_template \
    NEW_ASM_INSTANCE_TEMPLATE \
    --project_id PROJECT_ID \
    --cluster_location CLUSTER_LOCATION \
    --cluster_name CLUSTER_NAME \
    --workload_name WORKLOAD_NAME \
    --workload_namespace WORKLOAD_NAMESPACE \
    --source_instance_template SOURCE_INSTANCE_TEMPLATE
    
  4. 对工作负载的现有 MIG 执行滚动更新。

    如需了解详情,请参阅开始基本滚动更新

    gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_ASM_INSTANCE_TEMPLATE \
    --zone=INSTANCE_GROUP_ZONE
    
  5. 测试虚拟机工作负载,以确保其按预期工作。

升级虚拟机应用

如果您的应用有任何更新(包括对 WorkloadGroup 的更改和/或对源实例模板的更改),则需要新实例模板来更新虚拟机工作负载的 MIG。

应用 WorkloadGroup 更改和/或创建新的来源实例模板后,您将为 Anthos Service Mesh 创建新的实例模板,并对 MIG 中的虚拟机执行滚动更新。

  1. 使用 asm_vm 脚本创建新的实例模板。如果您为应用更新创建了一个新的实例模板名称,请确保使用新的实例模板名称并包括新的源实例模板。

    ./asm_vm create_gce_instance_template \
    NEW_ASM_INSTANCE_TEMPLATE \
    --project_id PROJECT_ID \
    --cluster_location CLUSTER_LOCATION \
    --cluster_name CLUSTER_NAME \
    --workload_name WORKLOAD_NAME \
    --workload_namespace WORKLOAD_NAMESPACE \
    --source_instance_template NEW_SOURCE_INSTANCE_TEMPLATE
    
  2. 对工作负载的现有 MIG 执行滚动更新。 如需详细了解如何使用 MIG 滚动更新,请参阅开始基本滚动更新

    gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_ASM_INSTANCE_TEMPLATE \
    --zone=INSTANCE_GROUP_ZONE
    
  3. 测试虚拟机工作负载,以确保其按预期工作。

部署一个示例应用

如需演示新的网格配置是否正常运行,您可以安装 Bookinfo 示例应用。此示例会在虚拟机上运行 MySQL 数据库,并且评分服务会从数据库中读取评分值。

在集群上安装 BookInfo

按照以下步骤操作可以部署 BookInfo 应用的服务,并且 Sidecar 代理会与每项服务一起注入。 BookInfo 应用将部署在 default 命名空间中。

  1. 在安装了 Anthos Service Mesh 的计算机的命令行上,转到您在下载脚本步骤中创建的 Anthos Service Mesh 安装目录的根目录。

  2. 要启用自动 Sidecar 注入功能,请使用以下命令查找 istiod 中的标签,其中包含要在后续步骤中使用的修订版本标签值。

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    输出类似于以下内容:

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-198-6-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-198-6,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-198-6-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-198-6,istio=istiod,pod-template-hash=5788d57586
    

    在输出中的 LABELS 列下,记下 istiod 修订版本标签的值,该值位于前缀 istio.io/rev= 之后。在此示例中,该值为 asm-198-6

  3. 将修订版本标签应用于 default 命名空间。在以下命令中,REVISION 是您在上一步中记下的 istiod 修订版本标签的值。

    kubectl label namespace default istio-injection- istio.io/rev=REVISION --overwrite
    

    您可以忽略输出中的 "istio-injection not found" 消息。这意味着命名空间之前没有 istio-injection 标签,对于 Anthos Service Mesh 的新安装或新部署,这是预期现象。如果命名空间同时具有 istio-injection 和修订版本标签,自动注入将失败,因此 Anthos Service Mesh 文档中的所有 kubectl label 命令都包含移除 istio-injection 标签。

  4. 使用 kubectl 将应用部署到默认命名空间:

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    
  5. 通过运行以下命令确认是否已正确部署应用:

    kubectl get services
    

    预期输出:

    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    kubectl get pod
    

    预期输出:

    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  6. 最后,为应用定义入站流量网关路由:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

    预期输出:

    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created
  7. 确认产品页面是否可访问。

    export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    export GATEWAY_URL="${INGRESS_HOST}:${INGRESS_PORT}"
    curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
    

    预期输出:

    <title>Simple Bookstore App</title>
    

创建 Compute Engine 实例并安装 MySQL

在此步骤中,您将为虚拟机上运行的 MySQL 实例创建 Compute Engine 实例模板。如需了解详细步骤,请参阅包含虚拟机的 Bookinfo

  1. 创建包含启动脚本的 Compute Engine 实例模板,以安装 MySQL 并在启动时添加评分数据库。 请注意,如果您使用的是 CentOS,则 mariadb-server 需要长达 10 分钟才能准备就绪。

    Debian

    cat << "EOF" > init-mysql
    #!/bin/bash
    
    # Wait until Envoy is ready before installing mysql
    while true; do
      rt=$(curl -s 127.0.0.1:15000/ready)
      if [[ $? -eq 0 ]] && [[ "${rt}" -eq "LIVE" ]]; then
        echo "envoy is ready"
        break
      fi
      sleep 1
    done
    
    sudo apt-get update && sudo apt-get install -y mariadb-server
    
    sudo sed -i '/bind-address/c\bind-address  = 0.0.0.0' /etc/mysql/mariadb.conf.d/50-server.cnf
    
    cat <<EOD | sudo mysql
    # Grant access to root
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
    
    # Grant root access to other IPs
    CREATE USER 'root'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    quit
    EOD
    
    sudo systemctl restart mysql
    
    curl -LO https://raw.githubusercontent.com/istio/istio/release-1.9/samples/bookinfo/src/mysql/mysqldb-init.sql
    
    mysql -u root -ppassword < mysqldb-init.sql
    EOF
    
    gcloud compute \
    --project=PROJECT_ID \
    instance-templates create mysql-instance-template \
    --machine-type=e2-medium \
    --metadata-from-file=startup-script=init-mysql \
    --image=debian-10-buster-v20201014 \
    --image-project=debian-cloud \
    --boot-disk-size=10GB
    

    CentOS

    cat << "EOF" > init-mysql
    #!/bin/bash
    
    # Wait until Envoy is ready before installing mysql
    while true; do
      rt=$(curl -s 127.0.0.1:15000/ready)
      if [[ $? -eq 0 ]] && [[ "${rt}" -eq "LIVE" ]]; then
        echo "envoy is ready"
        break
      fi
      sleep 1
    done
    
    sudo yum update -y && sudo yum install -y mariadb-server
    
    # Wait until mysql is ready
    while true; do
      rt=$(which mysql)
      if [[ ! -z "${rt}" ]]; then
        echo "mysql is ready"
        break
      fi
      sleep 1
    done
    
    sudo sed -i '/bind-address/c\bind-address  = 0.0.0.0' /etc/my.cnf.d/mariadb-server.cnf
    
    sudo systemctl restart mariadb
    
    cat > grantaccess.sql << EOD
    
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
    
    CREATE USER 'root'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    EOD
    
    until sudo mysql < grantaccess.sql; do
       sleep 1
    done
    
    sudo systemctl restart mariadb
    
    curl -LO https://raw.githubusercontent.com/istio/istio/release-1.9/samples/bookinfo/src/mysql/mysqldb-init.sql
    
    mysql -u root -ppassword < mysqldb-init.sql
    EOF
    
    gcloud compute \
    --project=PROJECT_ID \
    instance-templates create mysql-instance-template \
    --machine-type=e2-medium \
    --metadata-from-file=startup-script=init-mysql \
    --image-project=centos-cloud \
    --image-family=centos-8 \
    --boot-disk-size=30GB
    
  2. 为 MySQL 工作负载创建 WorkloadGroup

    kubectl apply -f - << EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: WorkloadGroup
    metadata:
     name: mysql
     namespace: default
    spec:
     metadata:
       labels:
         app.kubernetes.io/name: mysql
       annotations:
         security.cloud.google.com/IdentityProvider: google
     template:
       serviceAccount: WORKLOAD_SERVICE_ACCOUNT
    EOF
    
  3. 使用上述虚拟机脚本创建新的实例模板,以便为您的网格准备实例。

    ./asm_vm create_gce_instance_template \
    asm-mysql-instance-template \
    --project_id PROJECT_ID \
    --cluster_location CLUSTER_LOCATION \
    --cluster_name CLUSTER_NAME \
    --workload_name mysql \
    --source_instance_template mysql-instance-template
    
  4. 使用新创建的实例模板创建 Compute Engine MIG。

    gcloud compute instance-groups managed create mysql-instance \
    --template asm-mysql-instance-template \
    --zone=us-central1-c \
    --project=PROJECT_ID \
    --size=1
    

创建服务

为 MySQL 服务创建 Kubernetes 服务。

  1. 使用以下命令创建 Kubernetes 服务:

    kubectl apply -f - << EOF
    apiVersion: v1
    kind: Service
    metadata:
     name: mysql
     namespace: default
     labels:
       asm_resource_type: VM
    spec:
     ports:
     - name: mysql
       port: 3306
       protocol: TCP
       targetPort: 3306
     selector:
       app.kubernetes.io/name: mysql
    EOF
    

使用 Anthos 界面信息中心

如需查看您已创建的基于虚拟机的新服务,请点击主左侧导航栏中的 Anthos > 服务网格。系统将显示一个网格中运行的服务的表。您添加的服务以及一些概要指标应显示在该表中,该服务的Type 值为 VM。如需查看来自基于虚拟机的服务的更多遥测数据,请点击服务名称,此时会显示服务级信息中心。

如需详细了解如何使用 Anthos 界面信息中心,请参阅在 Cloud 控制台中探索 Anthos Service Mesh

管理发送到虚拟机工作负载的流量

您可以更改网络规则,以控制流量进出虚拟机的方式。

控制发送到新评分服务的流量(Pod 到虚拟机)

在 BookInfo 中创建另一个评分服务,该服务将使用上面创建的 MySQL 实例作为数据源,并指定强制审核服务使用新的评分服务的路由规则。

  1. 创建一个新的评分服务以使用 MySQL 实例。

    kubectl apply -f - << EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: ratings-v2-mysql-vm
     labels:
       app: ratings
       version: v2-mysql-vm
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: ratings
         version: v2-mysql-vm
     template:
       metadata:
         labels:
           app: ratings
           version: v2-mysql-vm
       spec:
         serviceAccountName: bookinfo-ratings
         containers:
         - name: ratings
           image: docker.io/istio/examples-bookinfo-ratings-v2:1.16.2
           imagePullPolicy: IfNotPresent
           env:
             - name: DB_TYPE
               value: "mysql"
             - name: MYSQL_DB_HOST
               value: mysql.default.svc.cluster.local
             - name: MYSQL_DB_PORT
               value: "3306"
             - name: MYSQL_DB_USER
               value: root
             - name: MYSQL_DB_PASSWORD
               value: password
           ports:
           - containerPort: 9080
    EOF
    
  2. 创建路由规则。

    kubectl apply -f - << EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
     name: reviews
    spec:
     hosts:
     - reviews
     http:
     - route:
       - destination:
           host: reviews
           subset: v3
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
     name: ratings
    spec:
     hosts:
     - ratings
     http:
     - route:
       - destination:
           host: ratings
           subset: v2-mysql-vm
    EOF
    
  3. 为已创建的服务应用目标规则。

    kubectl apply -f - << EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
     name: reviews
    spec:
     host: reviews
     subsets:
     - name: v1
       labels:
         version: v1
     - name: v2
       labels:
         version: v2
     - name: v3
       labels:
         version: v3
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
     name: ratings
    spec:
     host: ratings
     subsets:
     - name: v1
       labels:
         version: v1
     - name: v2
       labels:
         version: v2
     - name: v2-mysql
       labels:
         version: v2-mysql
     - name: v2-mysql-vm
       labels:
         version: v2-mysql-vm
    EOF
    

验证应用部署

如需查看 BookInfo 应用是否正常运行,您需要将流量发送到入站流量网关。

  • 如果您在 GKE 上安装了 Anthos Service Mesh,请获取您在上述步骤中创建的入站流量网关的外部 IP 地址:

    kubectl get svc istio-ingressgateway -n istio-system
    

    输出:

    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
    istio-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

    在此示例中,入站流量服务的 IP 地址为 35.239.7.64

试用应用

  1. 使用 curl 来检查 BookInfo 应用是否在运行:

    curl -I http://EXTERNAL_IP/productpage
    

    如果响应显示 200,则表示该应用与 Anthos Service Mesh 正常配合使用。

  2. 如需查看 BookInfo 网页,请在浏览器中输入以下地址:

    http://EXTERNAL_IP/productpage
    
  3. 在 BookInfo 应用首页上验证,它显示了来自 Reviewer1 的 5 星和来自 Reviewer2 的 4 星评分。

对虚拟机工作负载强制执行安全

对虚拟机工作负载强制执行安全策略与对 Kubernetes 工作负载强制执行安全策略相同。如需了解详情,请参阅 Istio 安全

完成上述步骤后,Compute Engine 虚拟机将拥有 Google 颁发的工作负载证书。在该证书中,SubjectAlternativeName 值会以 spiffe://<workload_identity_pool>/ns/WORKLOAD_NAMESPACE/sa/WORKLOAD_SERVICE_ACCOUNT 的形式显示虚拟机的 Anthos 工作负载身份

如需了解详情,请参阅工作负载身份池

为网格启用 mTLS 严格模式

应用以下 YAML 以在网格范围内强制执行严格 mTLS。

kubectl apply -f - << EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT
EOF

针对服务到服务流量的授权

使用 AuthorizationPolicy 可控制对 Compute Engine 虚拟机上应用与其他网格工作负载(例如 GKE 集群)上的应用的访问权限。

示例:拒绝 Kubernetes 工作负载访问 Compute Engine 虚拟机

以下授权政策会拒绝 Kubernetes 工作负载 ratings 访问为 ratings MySQL 服务器提供服务的 Compute Engine 虚拟机工作负载。

kubectl apply -f - << EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: mysql-deny
  namespace: default
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: mysql
  action: DENY
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/bookinfo-ratings"]
EOF

应用 AuthorizationPolicy 示例后,您应该会在产品页面上的书评部分中看到 Ratings service is currently unavailable 错误消息。

安装 Cloud Monitoring 代理

您可以安装 Cloud Monitoring 代理,以便收集和监控虚拟机实例中的系统和应用指标。这让您能够监控关键指标,例如该代理上的 CPU 和内存利用率。

如需了解详情,请参阅 Cloud Monitoring 代理文档

问题排查

如需了解问题排查提示,请参阅排查虚拟机支持问题