准备使用 GKE Gateway API 进行设置

本文档中介绍的配置适用于预览版客户,但我们不建议新 Cloud Service Mesh 用户采用此配置。如需了解详情,请参阅 Cloud Service Mesh 概览

本指南介绍了如何准备环境以在 Cloud Service Mesh 中使用 Google Kubernetes Engine Gateway API。概括来讲,您需要执行以下步骤:

  1. 启用所需的 Google Cloud API 服务。
  2. 部署 GKE 集群。
  3. 配置 IAM 权限。
  4. 安装所需的自定义资源定义 (CRD)。
  5. 将集群注册到舰队。
  6. [可选] 启用多集群服务(多集群服务发现)。
  7. 启用服务网格。

如果您未使用 GKE,请使用服务路由 API 并创建 Mesh 资源。

准备工作

确保部署的组件满足以下要求:

  • GKE 必须为 1.20 版或更高版本。
  • 仅支持使用 xDS 版本 3 API 及更高版本的数据平面。
    • 最低 Envoy 版本 1.20.0
    • gRPC 引导生成器最低版本 v0.14.0
  • GKE 集群必须处于 VPC 原生(别名 IP 地址)模式
  • 不支持在 Compute Engine(而不是 GKE)上自行管理的 Kubernetes 集群。
  • GKE 上的网关功能中列出的任何其他限制也适用于 Cloud Service Mesh 与 GKE Gateway API 的集成。
  • 您的 GKE 节点和 Pod 的服务账号必须具有访问 Traffic Director API 的权限。如需详细了解所需权限,请参阅使服务账号有权访问 Traffic Director API
  • 每个项目的资源用量和后端服务配额限制都适用。

启用所需的 Google Cloud API 服务

  1. 如果您的项目中尚未启用所需的 API,请运行以下命令来启用这些 API:

    gcloud services enable --project=PROJECT_ID \
      container.googleapis.com \
      gkehub.googleapis.com \
      multiclusteringress.googleapis.com \
      trafficdirector.googleapis.com \
      networkservices.googleapis.com
    
  2. 如果您计划在舰队中添加多个集群,请启用 multiclusterservicediscovery API:

    gcloud services enable --project=PROJECT_ID \
       multiclusterservicediscovery.googleapis.com
    

部署 GKE 集群

按照以下说明部署 GKE 集群。

  1. us-west1-a 可用区中创建一个名为 gke-1 的 GKE 集群:

    gcloud container clusters create gke-1 \
      --zone=us-west1-a \
      --enable-ip-alias \
      --workload-pool=PROJECT_ID.svc.id.goog \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --enable-mesh-certificates \
      --release-channel=regular \
      --project=PROJECT_ID
    
    • --enable-ip-alias:此标志会创建 VPC 原生集群,使 Pod 的 IP 地址在 VPC 网络中可路由。
    • --workload-pool:此标志可让您的集群加入项目的工作负载身份池。
    • --scopes:此标志指定分配给集群节点的 OAuth 范围。
    • --release-channel:此标志指定 regular 渠道。
    • --enable-mesh-certificates:此标志用于启用 Cloud Service Mesh 的自动 mTLS 功能(如果将来可能会用到此功能)。
  2. 获取集群凭据:

    gcloud container clusters get-credentials gke-1 --zone=us-west1-a
    
  3. 重命名集群上下文:

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-1 gke-1
    

为数据平面配置 IAM 权限

对于此演示部署,您需要向 GKE 集群中所有经过身份验证的用户(包括所有服务账号)授予 Cloud Service Mesh Client 角色 roles/trafficdirector.client。需要此 IAM 角色才能授权数据平面(如 Envoy)中的 Cloud Service Mesh 客户端接收来自 Cloud Service Mesh 的配置。

如果您不想向所有经过身份验证的用户授予客户端角色,而是希望将该角色限制为服务账号,请参阅 GKE 工作负载身份指南来为您的服务设置具有 roles/trafficdirector.client 角色的专用 Kubernetes 服务账号。

  1. client 角色授予服务账号:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/" \
      --role "roles/trafficdirector.client"
    

安装所需的自定义资源定义

  1. 安装将 Gateway API 与 Cloud Service Mesh 搭配使用所需的自定义资源定义 (CRD):

    kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.6.0"
    
    kubectl kustomize "https://github.com/GoogleCloudPlatform/gke-networking-recipes.git/gateway-api/config/mesh/crd" \
    | kubectl apply -f -
    
  2. 运行以下命令,验证是否已在集群中自动安装所需的 CRD:

    kubectl get crds
    

    输出会列出以下 CRD 以及其他与 Gateway API 无关的项,这些项的创建日期均不同:

    NAME                                             CREATED AT
    gatewayclasses.gateway.networking.k8s.io                           2023-08-08T05:29:03Z
    gateways.gateway.networking.k8s.io                                 2023-08-08T05:29:03Z
    grpcroutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    httproutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    referencegrants.gateway.networking.k8s.io                          2023-08-08T05:29:04Z
    tcproutes.gateway.networking.k8s.io                                2023-08-08T05:29:04Z
    tdgrpcroutes.net.gke.io                                            2023-08-08T05:29:23Z
    tdmeshes.net.gke.io                                                2023-08-08T05:29:23Z
    tlsroutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    udproutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    

自定义资源 tdmeshes.net.gke.iotdgrpcroutes.net.gke.io 在上一步中安装。

属于 net.gke.io API 组的 CRD 特定于 GKE。这些资源不属于 OSS Gateway API 实现,后者位于 networking.k8s.io API 组中。

将集群注册到舰队

成功创建集群后,您必须向舰队注册该集群。通过将集群注册到舰队,您可以选择性地在已注册的集群上启用一些功能。

  1. 将集群注册到队列:

    gcloud container hub memberships register gke-1 \
      --gke-cluster us-west1-a/gke-1 \
      --location global \
      --project=PROJECT_ID
    
  2. 确认是否已向舰队注册该集群:

    gcloud container hub memberships list --project=PROJECT_ID
    

    输出类似于以下内容:

    NAME   EXTERNAL_ID
    gke-1  657e835d-3b6b-4bc5-9283-99d2da8c2e1b
    

(可选)启用多集群服务发现

借助多集群服务发现功能,您可以将集群本地服务导出到已注册到舰队的所有集群。如果您不打算在舰队中添加多个集群,则无需执行此步骤。

  1. 启用多集群服务发现:

    gcloud container hub multi-cluster-services enable \
      --project PROJECT_ID
    
  2. 授予多集群服务发现所需的 Identity and Access Management (IAM) 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \
      --role "roles/compute.networkViewer"
    
  3. 确认是否已为注册的集群启用多集群服务发现。可能需要几分钟才能显示所有集群:

    gcloud container hub multi-cluster-services describe --project=PROJECT_ID
    

    您应该会看到 gke-1 的成员资格,类似于以下内容:

    createTime: '2021-04-02T19:34:57.832055223Z'
    membershipStates
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T11:03:07.770208064Z'
    name: projects/PROJECT_NUM/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2021-04-02T19:34:58.983512446Z'
    

启用 Cloud Service Mesh GKE 服务网格

在本部分中,您将启用服务网格。

  1. 在您向舰队注册的集群上启用 Cloud Service Mesh GKE 服务网格:

    gcloud container hub ingress enable \
    --config-membership=projects/PROJECT_ID/locations/global/memberships/gke-1 \
      --project=PROJECT_ID
    
  2. 确认是否已启用该功能:

    gcloud container hub ingress describe --project=PROJECT_ID
    

    您将看到如下所示的输出:

    createTime: '2021-05-26T13:27:37.460383111Z'
    membershipStates:
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896080Z'
    resourceState:
     state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/PROJECT_ID/locations/global/memberships/gke-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2021-05-26T13:27:37.899549111Z'
    updateTime: '2021-05-27T15:08:19.397895711Z'
    
  3. 授予 Gateway API 控制器所需的以下 Identity and Access Management (IAM) 角色:

    export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value (projectNumber)")
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/container.developer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/compute.networkAdmin"
    

后续步骤

如需设置示例部署,请参阅以下指南: