在 GKE Autopilot 集群上预配 Cloud Service Mesh


本指南介绍如何在 Google Kubernetes Engine (GKE) Autopilot 集群上设置托管式 Cloud Service Mesh。Cloud Service Mesh 是基于 Istio 的全托管式服务网格。

本教程介绍如何使用默认设置,配置在单个 GKE Autopilot 集群上运行的支持生产环境的服务网格。我们建议您在设计环境时还参考完整的 Cloud Service Mesh 预配指南

使用 GKE Autopilot 运行托管式 Cloud Service Mesh 的优势

当您在 Autopilot 模式下使用 GKE 时,Google 会自动处理集群的设置和管理。Autopilot 模式简化了操作集群的体验,可让您专注于自己的应用。同样,托管式 Cloud Service Mesh 是一种全托管式服务网格,您可以按照以下几个步骤进行预配。

  • 您可以使用 Fleet API 预配托管式 Cloud Service Mesh,而无需 istioctl 等客户端工具。
  • Cloud Service Mesh 会自动将边车代理注入到工作负载中,而无需向容器授予提升的权限。
  • 您无需进行任何额外配置,即可查看适用于网格和服务的丰富信息中心,然后使用这些指标配置服务等级目标 (SLO) 和提醒,以监控应用的运行状况
  • 托管式 Cloud Service Mesh 控制平面会自动升级,以确保您获得最新的安全补丁和功能
  • Cloud Service Mesh 托管式数据平面会自动升级工作负载中的边车代理,以便在代理升级和安全补丁可用时,您无需自行重启服务
  • Cloud Service Mesh 是受支持的产品,可以使用标准开源 Istio API 进行配置。请参阅支持的功能

目标

  • 创建 GKE Autopilot 集群
  • 使用 Fleet API 预配托管式 Cloud Service Mesh
  • 将网格入站流量网关部署到专用命名空间中
  • 部署一个示例应用
  • 配置 Cloud Service Mesh,以对服务间通信强制执行严格的双向 TLS (mTLS) 身份验证
  • 查看 Cloud Service Mesh 信息中心,并验证服务是否与 mTLS 连接

费用

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

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

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

Cloud Shell 预安装了本教程所需的软件,包括 kubectlgcloud CLIHelmTerraform。如果您不使用 Cloud Shell,则必须安装 gcloud CLI。

  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. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  10. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

设置您的环境

您可以使用 gcloud CLI 或 Terraform 设置环境。

gcloud

  1. 设置环境变量:

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    
  2. 启用 Mesh API:

    gcloud services enable mesh.googleapis.com
    

    启用 mesh.googleapis.com 会启用以下 API:

    API 用途 是否可以停用
    meshconfig.googleapis.com Cloud Service Mesh 使用 Mesh Configuration API 将配置数据从网格中继到 Google Cloud。此外,启用 Mesh Configuration API 后,您可以访问 Google Cloud 控制台中的 Cloud Service Mesh 页面以及使用 Cloud Service Mesh 证书授权机构。
    meshca.googleapis.com 与托管式 Cloud Service Mesh 使用的 Cloud Service Mesh 证书授权机构相关。
    container.googleapis.com 必须启用此 API 才能创建 Google Kubernetes Engine (GKE) 集群。
    gkehub.googleapis.com 必须启用此 API 才能以舰队形式管理网格。
    monitoring.googleapis.com 必须启用此 API 才能捕获网格工作负载的遥测数据。
    stackdriver.googleapis.com 必须启用此 API 才能使用服务界面。
    opsconfigmonitoring.googleapis.com 必须启用此 API 才能将服务界面用于 Google Cloud 外部的集群。
    connectgateway.googleapis.com 此 API 是必需的,以便托管式 Cloud Service Mesh 控制平面可以访问网格工作负载。 是*
    trafficdirector.googleapis.com 实现可用性高且可伸缩的托管式控制平面。 是*
    networkservices.googleapis.com 实现可用性高且可伸缩的托管式控制平面。 是*
    networksecurity.googleapis.com 实现可用性高且可伸缩的托管式控制平面。 是*

Terraform

gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT

创建 GKE 集群

在 Autopilot 模式下创建 GKE 集群。

gcloud

  1. 创建一个注册为舰队成员的集群:

    gcloud container clusters create-auto asm-cluster \
        --location="us-central1" \
        --enable-fleet
    
  2. 验证是否已向舰队注册集群:

    gcloud container fleet memberships list
    

    输出类似于以下内容:

    NAME: asm-cluster
    EXTERNAL_ID: 
    LOCATION: us-central1
    

    记下成员资格名称,因为您需要使用它配置 Cloud Service Mesh。

Terraform

如需创建 GKE 集群,您可以使用 google_container_cluster 资源。您可以设置 fleet 块,以便在创建集群时将其添加到舰队中。

resource "google_container_cluster" "cluster" {
  name                = "asm-cluster"
  location            = var.region
  deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters

  enable_autopilot = true
  fleet {
    project = data.google_project.project.name
  }
}

data "google_project" "project" {}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

预配托管式 Cloud Service Mesh

您可以针对集群的舰队成员资格,使用 servicemesh 功能预配托管式 Cloud Service Mesh。

gcloud

  1. 在项目上启用 Cloud Service Mesh 舰队功能:

    gcloud container fleet mesh enable
    
  2. 启用网格的自动管理:

    gcloud container fleet mesh update \
        --management=automatic \
        --memberships=MEMBERSHIP_NAME \
        --location=us-central1
    

    MEMBERSHIP_NAME 替换为您在验证集群是否已注册到舰队时列出的成员资格名称。

Terraform

如需启用 Mesh API,您可以使用 google_project_service 资源

您可以使用 google_gke_hub_featuregoogle_gke_hub_feature_membership 资源在集群上配置托管式 Cloud Service Mesh。

resource "google_project_service" "mesh_api" {
  service = "mesh.googleapis.com"

  disable_dependent_services = true
}

resource "google_gke_hub_feature" "feature" {
  name     = "servicemesh"
  location = "global"

  depends_on = [
    google_project_service.mesh_api
  ]
}

resource "google_gke_hub_feature_membership" "feature_member" {
  location   = "global"
  feature    = google_gke_hub_feature.feature.name
  membership = google_container_cluster.cluster.fleet.0.membership
  membership_location = google_container_cluster.cluster.location
  mesh {
    management = "MANAGEMENT_AUTOMATIC"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

验证控制平面是否处于活动状态

等待 controlPlaneManagement.state 成为 ACTIVE。此过程最多可能需要 15 分钟。

watch -n 30 gcloud container fleet mesh describe

输出类似于以下内容:

membershipSpecs:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    mesh:
      management: MANAGEMENT_AUTOMATIC
membershipStates:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    servicemesh:
      controlPlaneManagement:
        details:
        - code: REVISION_READY
          details: 'Ready: asm-managed'
        state: ACTIVE
      dataPlaneManagement:
        details:
        - code: PROVISIONING
          details: Service is provisioning.
        state: PROVISIONING
    state:
      code: OK
      description: 'Revision(s) ready for use: asm-managed.'

dataPlaneManagement 部分会保持 PROVISIONING 状态,直到您部署入站流量网关,因为 Autopilot 集群在您部署工作负载之前不会预配任何节点。

部署网格入站流量网关

在本部分中,您将部署网格入站流量网关来处理示例应用的传入流量。入站流量网关是在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。

将网关部署到专用命名空间并为部署添加标签,以确保可以由 Cloud Service Mesh 控制平面安全地管理和自动升级网关。

  1. 下载凭据,以便您可以访问集群:

    gcloud container clusters get-credentials asm-cluster --location=us-central1
    
  2. 为网关部署创建命名空间:

    kubectl create namespace bank-gateways
    
  3. 向命名空间添加标签,以便 Cloud Service Mesh 控制平面自动将网关配置注入到部署中。

    kubectl label namespace bank-gateways istio-injection=enabled
    
  4. 将入站流量网关部署到命名空间:

    Helm

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    helm repo update
    helm install --wait --namespace bank-gateways \
        --set resources.requests.cpu=250m \
        --set resources.requests.memory=512Mi \
        --set resources.requests.ephemeral-storage=1Gi \
        --set resources.limits.cpu=250m \
        --set resources.limits.memory=512Mi \
        --set resources.limits.ephemeral-storage=1Gi \
        istio-ingressgateway istio/gateway
    

    kubectl

    kubectl apply -n bank-gateways \
        -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway
    kubectl -n bank-gateway wait "deployment/istio-ingressgateway"  \
        --for=condition=available --timeout=240s
    

    确保在部署到生产环境时设置足够的资源请求。GKE Autopilot 仅考虑在 requests 中设置的资源值,而不考虑 limits。Istio 项目会发布有关性能和可伸缩性的信息

部署示例应用

  1. 为代理创建 Kubernetes 命名空间:

    kubectl create namespace bank-sample
    
  2. 向命名空间添加标签,以便 Cloud Service Mesh 自动将边车代理注入到示例 Pod 中:

    kubectl label namespace bank-sample istio-injection=enabled
    
  3. 部署示例应用:

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
    
  4. 等待应用准备就绪。这需要几分钟时间。

    watch kubectl -n bank-sample get pods
    

    应用准备就绪后,输出类似于以下内容:

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    
  5. 创建 Istio GatewayVirtualService 资源以公开处于入站流量网关后面的应用:

    kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    
  6. 获取示例应用的链接:

    INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  7. 在浏览器中,点击链接以打开示例应用。使用默认用户名和密码登录以查看应用。

强制执行双向 TLS

确保已启用 STRICT 双向 TLS (mTLS) 模式。为 istio-system 命名空间中的网格应用默认的 PeerAuthentication 政策。

  1. 将以下清单保存为 mesh-peer-authn.yaml

    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
      namespace: "istio-system"
    spec:
      mtls:
        mode: STRICT
    
  2. 将清单应用于集群:

    kubectl apply -f mesh-peer-authn.yaml
    

您可以通过在特定命名空间中创建 PeerAuthentication 资源来替换此配置。

探索 Cloud Service Mesh 信息中心

  1. 在 Google Cloud 控制台中,前往 Cloud Service Mesh 以查看您的网格的信息中心:

    前往 Cloud Service Mesh

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

    您会看到一个包含网格中所有微服务的概览表格,以及微服务之间的连接的图形直观呈现。对于每个微服务,该表格显示了三个 SRE“黄金信号”

    • 流量 - 每秒请求数
    • 错误率 - 百分比
    • 延迟时间 - 毫秒

    这些指标基于微服务所处理的实际流量。持续测试流量由作为示例应用的一部分部署的 loadgenerator 客户端自动发送到 frontend 服务。Cloud Service Mesh 会自动将指标、日志和(可选)跟踪记录发送到 Google Cloud Observability。

  3. 点击表格中的 frontend 服务可查看服务的概览信息中心。您会看到服务的其他指标以及入站和出站连接的直观呈现。您还可以创建服务等级目标 (SLO),以监控服务并发出提醒。

验证是否已启用 mTLS

点击面板中的安全性链接,查看 frontend 服务的安全性概览。表格和直观呈现会对微服务之间的每个入站和出站连接显示绿色锁形图标。此图标表示连接使用 mTLS 进行身份验证和加密。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请执行以下操作:

删除项目

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

逐个删除资源

如果您使用的是现有项目,并且不想将其删除,请逐个删除资源。

gcloud

  1. 删除示例应用和网关:

    kubectl delete namespace bank-sample
    kubectl delete namespace bank-gateways
    
  2. 按照卸载 Cloud Service Mesh 的说明进行操作

  3. 删除 GKE 集群:

    gcloud container clusters delete --region us-central1 asm-cluster --quiet
    

Terraform

删除您使用 Terraform 创建的资源:

  terraform destroy

后续步骤