在 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 进行配置。请参阅支持的功能

设置环境

您可以使用 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

    git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages
    kubectl apply -n bank-gateways \
        -f ./anthos-service-mesh-packages/samples/gateways/istio-ingressgateway
    kubectl -n bank-gateways 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 进行身份验证和加密。