使用 Cloud Service Mesh 和 gcloud CLI 创建 GKE 集群

在本教程中,您将在新的 GKE 公共集群上使用 Google Kubernetes Engine (GKE) Fleet API 预配托管式 Cloud Service Mesh。本教程将引导您完成以下操作:

  1. 配置 Google Cloud 项目。
  2. 创建具有 Cloud Service Mesh 所需的最低 vCPU 数量的 GKE 集群。
  3. 将 GKE 集群注册到项目的舰队
  4. 使用 Fleet API 在集群上预配托管式 Cloud Service Mesh。
  5. 部署入站流量网关以公开应用。
  6. 部署一个示例应用,以便在 Google Cloud 控制台中的 Cloud Service Mesh 信息中心上查看遥测数据。
  7. 公开和访问示例应用。

Fleet API

本指南假定您熟悉舰队,舰队是 GKE 集群和可以一起管理的其他资源的逻辑分组。舰队是 GKE 概念,而不是 Kubernetes 概念。将集群注册到舰队后,您可以使用 gcloud container fleet mesh update 命令在该集群上预配托管式 Cloud Service Mesh。舰队的使用由 Fleet API (gkehub.googleapis.com) 启用,您会在开始本教程时启用它。

费用

在本文档中,您将使用 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 GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  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 GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  8. 记下您的项目 ID

安装所需的工具

您可以在 Cloud Shell 或本地机器上运行该工具。Cloud Shell 会预安装所有必需的工具。

Cloud Shell

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

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

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

  • 您可以选择文本编辑器

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

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

In the Google Cloud console, activate Cloud Shell.

Activate Cloud Shell

At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

本地计算机

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

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

    gcloud auth login --project PROJECT_ID
    
  3. 更新组件:

    gcloud components update
    

创建 GKE 集群

  1. 运行以下命令,创建具有 Cloud 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.
    

预配 Cloud Service Mesh

如果您在创建集群以来未关闭过此页面,则占位符具有您为 gcloud container clusters create 命令输入的值。

  1. 在项目的舰队上启用 Cloud Service Mesh。

    gcloud container fleet mesh enable --project PROJECT_ID
    

    输出类似于以下内容:

    Waiting for Feature Service Mesh to be created...done.
    
  2. 将集群注册到项目的舰队:

    gcloud container fleet memberships register CLUSTER_NAME-membership \
      --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \
      --enable-workload-identity \
      --project PROJECT_ID
    

    输出类似于以下内容:

     Waiting for membership to be created...done.
     Finished registering to the Fleet.
    
  3. 使用 Fleet API 在集群上预配托管式 Cloud Service Mesh:

    gcloud container fleet mesh update \
      --management automatic \
      --memberships CLUSTER_NAME-membership \
      --project PROJECT_ID
    

    输出类似于以下内容:

    Waiting for Feature Service Mesh to be updated...done.
    
  4. 验证已为集群启用代管式 Cloud Service Mesh 并且可供使用:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Cloud Service Mesh 可能需要大约 10 分钟才能完成预配且可在集群上使用。如果您看到 controlPlaneManagement.state: DISABLEDcontrolPlaneManagement.state: PROVISIONING,则需要每隔几分钟重新运行一次上述命令,直到您看到 controlPlaneManagement.state: ACTIVE

    输出类似于以下内容:

    createTime: '2022-07-06T01:05:39.110120474Z'
    membershipSpecs:
      projects/123456789123/locations/global/memberships/your-cluster-membership:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/123456789123/locations/global/memberships/your-cluster-membership:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-07-06T01:19:24.243993678Z'
    name: projects/your-project-id/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-07-06T01:19:27.475885687Z'
    

下载示例代码

克隆包含本教程中使用的示例代码的 Git 代码库:

   git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git

本教程的后续部分将使用 DIR_PATH 变量。将此变量设置为您克隆的 anthos-service-mesh-packages 代码库的路径(例如 ./anthos-service-mesh-packages)。

部署入站流量网关

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

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

    kubectl create namespace GATEWAY_NAMESPACE
    

    预期输出:

    namespace/GATEWAY_NAMESPACE created
    
  2. 在网关上启用自动注入功能。所需步骤取决于您是要在网关命名空间中使用默认注入标签(例如 istio-injection=enabled)还是修订版本标签。Sidecar 注入器网络钩子会使用默认的修订版本标记和修订版本标签来将注入的代理与特定控制层面修订版本相关联。

    默认注入标签

    将默认注入标签应用于命名空间。

    kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
    

    修订版本标签

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

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

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

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

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

      预期输出:

      namespace/GATEWAY_NAMESPACE labeled
      

    您可以忽略输出中的 "istio.io/rev" not found 消息。这意味着命名空间之前没有 istio.io/rev 标签,对于 Cloud Service Mesh 的新安装或新部署,这是预期现象。如果命名空间同时具有 istio.io/revistio-injection 标签,自动注入将失败,因此 Cloud Service Mesh 文档中的所有 kubectl label 命令都会明确指定这两个标签。

    如果网关命名空间未添加标签,则在网关尝试拉取 auto 映像时,istio-ingressgateway Pod 将失败并显示 ImagePullBackOff 错误。此映像应替换为 webhook。

  3. anthos-service-mesh-packages 代码库下载示例入站流量网关 .yaml 配置文件。

  4. 按原样应用示例入站流量网关 .yaml 配置,或根据需要进行修改。

    kubectl apply -n GATEWAY_NAMESPACE \
      -f CONFIG_PATH/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 注入(自动注入)。所需命令取决于您是要使用默认注入标签(例如 istio-injection=enabled)还是使用用于注释入站流量网关命名空间的相同修订版本标签

    默认注入标签

    将默认注入标签应用于命名空间。在以下命令中,GATEWAY_NAMESPACE 与您用于为入站流量网关命名空间添加注释的值相同。

    for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
      kubectl label namespace $ns istio-injection=enabled istio.io/rev-
    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
    

    修订版本标签

    将修订版本标签应用于应用命名空间。 在以下命令中,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 控制台中探索 Cloud Service Mesh 页面,以了解 Cloud Service Mesh 提供的所有可观测性功能。请注意,部署工作负载后,遥测数据大约需要一两分钟才会显示在 Google Cloud 控制台中。

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

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

    前往 Cloud Service Mesh

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

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

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

清理

在清理之前,如果您有兴趣详细了解双向 TLS,请参阅 Cloud 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].
      

后续步骤