GKE 的 Anthos Service Mesh 快速入门

在本教程中,您将使用 Google 提供的工具 asmcli 在新的 Google Kubernetes Engine (GKE) 集群上安装 Anthos Service Mesh 1.11.8-asm.4。本教程将引导您完成以下操作:

  1. 配置 Google Cloud 项目。
  2. 创建具有 Anthos Service Mesh 所需的最低 vCPU 数量的 GKE 集群。
  3. 使用集群内控制层面安装 Anthos Service Mesh。
  4. 部署一个示例应用,以便在 Google Cloud 控制台中的 Anthos Service Mesh 信息中心上查看遥测数据。
  5. 公开和访问示例应用。

为了简化快速入门以及避免多个不同的路径,实施了以下选项:

  1. 启用 Anthos Service Mesh 证书授权机构 (Mesh CA)
  2. 部署入站流量网关以公开应用

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成此快速入门后,您可以通过删除集群来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Kubernetes Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Kubernetes Engine API.

    Enable the API

  8. 记下您的项目 ID

虽然 Anthos Service Mesh 需要其他 API,但 asmcli 会为您启用这些 API。为了降低结算费用,asmcli 脚本未启用 GKE Enterprise API。启用 GKE Enterprise API 后,Google Cloud 控制台存在一些细微差别。如需详细了解这些差异,请参阅 GKE Enterprise 和 Anthos Service Mesh 界面差异

安装所需的工具

您可以在 Cloud Shell 或运行 Linux 的本地计算机上运行该工具。Cloud Shell 会预安装所有必需的工具。请注意,由于 macOS 附带了旧版 bash,因此不支持 macOS。

Cloud Shell

Cloud Shell 预配一个运行基于 Debian 的 Linux 操作系统的 g1-small Compute Engine 虚拟机 (VM)。使用 Cloud Shell 的优势如下:

  • Cloud Shell 包含您需要的 gcloudkubectlkpt 和其他命令行工具。

  • 您的 Cloud Shell $HOME 目录具有 5GB 永久性存储空间。

  • 您可以选择文本编辑器

    • 代码编辑器,可通过点击 Cloud Shell 窗口顶部的 来访问。

    • Emac、Vim 或 Nano,可从 Cloud Shell 中的命令行访问。

如需使用 Cloud Shell,请执行以下操作:

  1. 前往 Google Cloud 控制台
  2. 选择您的 Google Cloud 项目。
  3. 点击 Google Cloud 控制台窗口顶部的激活 Cloud Shell 按钮。

    Google Cloud Platform 控制台

    一个 Cloud Shell 会话随即会在 Google Cloud 控制台底部的新框内打开,并显示命令行提示符。

    Cloud Shell 会话

本地 Linux 计算机

  1. 请确保已安装以下工具:

  2. 使用 gcloud CLI 进行身份验证:

    gcloud auth login
    
  3. 更新组件:

    gcloud components update
    
  4. 请确保 git 位于您的路径中,以便 kpt 能够找到它。

创建 GKE 集群

  1. 运行以下命令,创建具有 Anthos Service Mesh 所需的最少 vCPU 数的集群。在此命令中,将占位符替换为以下信息:

    • CLUSTER_NAME:您的集群的名称。名称只能包含小写字母、数字和 -,并且必必须以字母开头,以字母数字结尾,并且不能超过 40 个字符。
    • PROJECT_ID:将在其中创建集群的项目 ID。
    • CLUSTER_LOCATION 是集群的可用区,例如 us-central1-a
    gcloud container clusters create CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION \
        --machine-type=e2-standard-4 \
        --num-nodes=2 \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    创建集群需要几分钟时间。创建集群时,gcloud 命令会显示以下内容:

    Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
    

    成功创建后,预期输出如下所示:

    Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done.
    Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
    To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID
    kubeconfig entry generated for CLUSTER_NAME.
    NAME: CLUSTER_NAME
    LOCATION: CLUSTER_LOCATION
    MASTER_VERSION: 1.20.10-gke.1600
    MASTER_IP: 198.51.100.1
    MACHINE_TYPE: e2-standard-4
    NODE_VERSION: 1.20.10-gke.1600
    NUM_NODES: 2
    STATUS: RUNNING
    
  2. 获取身份验证凭据以便与集群进行交互。

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

    预期输出:

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    
  3. kubectl 的当前上下文设置为该集群。

    kubectl config set-context CLUSTER_NAME
    

    预期输出:

    Context "CLUSTER_NAME" created.
    

下载 asmcli

本部分介绍如何下载 asmcli

  1. 将安装 Anthos Service Mesh 1.11.8 的版本下载到当前工作目录:

    curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.11 > asmcli
    

    预期输出:

    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
    100  167k  100  167k    0     0   701k      0 --:--:-- --:--:-- --:--:--  701k
    
  2. 让该脚本可执行:

    chmod +x asmcli
    

安装 Anthos Service Mesh

使用以下选项运行 asmcli 工具,以在之前创建的集群上安装 Anthos Service Mesh。如果您在创建集群以来未关闭过此页面,则占位符具有您为 gcloud container clusters create 命令输入的值。

./asmcli install \
  --project_id PROJECT_ID \
  --cluster_name CLUSTER_NAME \
  --cluster_location CLUSTER_LOCATION \
  --fleet_id FLEET_PROJECT_ID \
  --output_dir DIR_PATH \
  --enable_all  \
  --ca mesh_ca
  • --project_id--cluster_name--cluster_location 指定集群所在的项目 ID、集群名称以及集群区域或地区。
  • --fleet_id队列宿主项目的项目 ID。如果您未包含此选项,则 asmcli 会使用注册集群时在其中创建集群的项目。
  • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
  • --enable_all 允许脚本执行以下操作:
    • 授予所需的 IAM 权限
    • 启用所需的 Google API。
    • 在集群上设置用于标识网格的标签。
    • 如果尚未注册集群,请注册集群

    asmcli 工具完成运行可能需要几分钟时间。该工具会输出信息性消息,便于您跟踪其进度。

    成功安装后预期输出为:

    asmcli: Successfully installed ASM.
    

    部署入站流量网关

    Anthos Service Mesh 允许您将网关部署和管理为服务网格的一部分。网关描述了在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。网关是 Envoy 代理,可让您精确控制进出网格的流量。

    1. 为入站流量网关创建命名空间(如果您还没有命名空间)。网关是用户工作负载,最佳做法是不应部署在控制平面命名空间中。将 GATEWAY_NAMESPACE 替换为您的命名空间名称。

      kubectl create namespace GATEWAY_NAMESPACE
      

      预期输出:

      namespace/GATEWAY_NAMESPACE created
      
    2. 通过在网关命名空间中应用修订版本标签,在网关上启用自动注入功能。边车注入器网络钩子会使用修订版本标签将注入的代理与特定控制平面修订版本相关联。

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

        kubectl get deploy -n istio-system -l app=istiod -o \
          "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
        

        该命令会输出与 Anthos Service Mesh 版本对应的修订版本标签,例如:asm-1118-4

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

        kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev=REVISION --overwrite
        

        预期输出:

        namespace/GATEWAY_NAMESPACE labeled
        
    3. 您可以按原样部署位于 samples/gateways/istio-ingressgateway/ 目录中的示例入站流量网关配置,也可以根据需要对其进行修改。

      kubectl apply -n GATEWAY_NAMESPACE \
        -f DIR_PATH/samples/gateways/istio-ingressgateway
      

      预期输出:

      deployment.apps/istio-ingressgateway created
      poddisruptionbudget.policy/istio-ingressgateway created
      horizontalpodautoscaler.autoscaling/istio-ingressgateway created
      role.rbac.authorization.k8s.io/istio-ingressgateway created
      rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created
      service/istio-ingressgateway created
      serviceaccount/istio-ingressgateway created
      

    详细了解网关的最佳做法

    部署 Online Boutique 示例

    anthos-service-mesh-packages 代码库中的 Online Boutique 示例应用在 microservices-demo 代码库中原始清单集的基础上进行了修改。按照最佳做法,每项服务都会部署在具有唯一服务账号的单独命名空间中。

    1. 为应用创建命名空间:

      kubectl apply -f \
        DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
      

      预期输出:

      namespace/ad created
      namespace/cart created
      namespace/checkout created
      namespace/currency created
      namespace/email created
      namespace/frontend created
      namespace/loadgenerator created
      namespace/payment created
      namespace/product-catalog created
      namespace/recommendation created
      namespace/shipping created
      
    2. 启用自动 Sidecar 注入(自动注入)。此处使用的修订版本标签与用于为入站流量网关命名空间添加注释的标签相同。将修订版本标签应用于应用命名空间。在以下命令中,REVISION 与您用于为入站流量网关命名空间添加注释的值相同。

      for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
        kubectl label namespace $ns istio.io/rev=REVISION --overwrite
      done;
      

      预期输出:

      namespace/ad labeled
      namespace/cart labeled
      namespace/checkout labeled
      namespace/currency labeled
      namespace/email labeled
      namespace/frontend labeled
      namespace/loadgenerator labeled
      namespace/payment labeled
      namespace/product-catalog labeled
      namespace/recommendation labeled
      namespace/shipping labeled
      
    3. 将示例应用部署到集群。

      1. 创建服务账号和部署:

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
        

        预期输出:

        serviceaccount/ad created
        deployment.apps/adservice created
        serviceaccount/cart created
        deployment.apps/cartservice created
        serviceaccount/checkout created
        deployment.apps/checkoutservice created
        serviceaccount/currency created
        deployment.apps/currencyservice created
        serviceaccount/email created
        deployment.apps/emailservice created
        serviceaccount/frontend created
        deployment.apps/frontend created
        serviceaccount/loadgenerator created
        deployment.apps/loadgenerator created
        serviceaccount/payment created
        deployment.apps/paymentservice created
        serviceaccount/product-catalog created
        deployment.apps/productcatalogservice created
        serviceaccount/recommendation created
        deployment.apps/recommendationservice created
        serviceaccount/shipping created
        deployment.apps/shippingservice created
        
      2. 创建服务:

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/kubernetes-manifests/services
        

        预期输出:

        service/adservice created
        service/cartservice created
        service/checkoutservice created
        service/currencyservice created
        service/emailservice created
        service/frontend created
        service/frontend-external created
        service/paymentservice created
        service/productcatalogservice created
        service/recommendationservice created
        service/shippingservice created
        
      3. 创建服务条目:

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
        

        预期输出:

        serviceentry.networking.istio.io/allow-egress-googleapis created
        serviceentry.networking.istio.io/allow-egress-google-metadata created
        

    公开和访问应用

    您可以通过多种方式公开应用。在本指南中,我们将使用上面部署的入站流量网关执行此操作。如需了解公开 Online Boutique 应用的其他方法,请参阅部署 Online Boutique 示例应用指南中的公开和访问应用部分。

    1. 为前端服务部署 GatewayVirtualService

      kubectl apply -f \
          DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
      

      预期输出:

      gateway.networking.istio.io/frontend-gateway created
      virtualservice.networking.istio.io/frontend-ingress created
      
    2. 获取入站流量网关的外部 IP 地址,将占位符替换为以下信息:

      • GATEWAY_SERVICE_NAME:入站流量网关服务的名称。如果您部署了示例网关而未进行修改,则网关为 istio-ingressgateway
      • GATEWAY_NAMESPACE:部署入站流量网关的命名空间:
      kubectl get service GATEWAY_SERVICE_NAME \
          -n GATEWAY_NAMESPACE
      

      输出类似于以下内容:

      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

    3. 使用浏览器访问应用,以确认安装:

      http://EXTERNAL_IP/
      

    查看 Service Mesh 信息中心

    在集群上部署工作负载并注入边车代理后,您可以在 Google Cloud 控制台中探索 Anthos Service Mesh 页面,以了解 Anthos Service Mesh 提供的所有可观测性功能。请注意,部署工作负载后,遥测数据大约需要一两分钟才会显示在 Google Cloud 控制台中。

    在 Google Cloud 控制台中访问 Anthos Service Mesh 的权限由 Identity and Access Management (IAM) 控制。如需访问 Anthos Service Mesh 页面,Project Owner 必须为用户授予 Project Editor 或 Viewer 角色,或者授予在 Google Cloud 控制台中控制对 Anthos Service Mesh 的访问权限中所述的限制性更强的角色。

    1. 在 Google Cloud 控制台中,前往 Anthos Service Mesh

      转到 Anthos Service Mesh

    2. 从菜单栏的下拉列表中选择 Google Cloud 项目。

    3. 如果您有多个服务网格,请从服务网格下拉列表中选择相应网格。

    如需了解详情,请参阅在 Google Cloud 控制台中探索 Anthos Service Mesh

    清理

    在清理之前,如果您有兴趣详细了解双向 TLS,请参阅 Anthos Service Mesh(例如:mTLS)

    • 如果您希望保留集群并移除 Online Boutique 示例,请执行以下操作:

      1. 删除应用命名空间:

        kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
        

        预期输出:

        namespace "ad" deleted
        namespace "cart" deleted
        namespace "checkout" deleted
        namespace "currency" deleted
        namespace "email" deleted
        namespace "frontend" deleted
        namespace "loadgenerator" deleted
        namespace "payment" deleted
        namespace "product-catalog" deleted
        namespace "recommendation" deleted
        namespace "shipping" deleted
        
      2. 删除服务条目:

        kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
        

        预期输出:

        serviceentry.networking.istio.io "allow-egress-googleapis" deleted
        serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
        
    • 如果您想防止产生额外费用,请删除集群:

      1. 运行以下命令:

        gcloud container clusters delete  CLUSTER_NAME \
            --project=PROJECT_ID \
            --zone=CLUSTER_LOCATION
        
      2. 是否要继续(是/否)?提示处,输入

        几分钟后,您将看到以下输出:

        Deleting cluster CLUSTER_NAME...done.
        Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
        

    后续步骤

    详细了解以下内容: