准备使用 GKE Gateway API 进行设置
本文档中介绍的配置适用于预览版客户,但我们不建议新 Cloud Service Mesh 用户采用此配置。如需了解详情,请参阅 Cloud Service Mesh 概览。
本指南介绍了如何准备环境以在 Cloud Service Mesh 中使用 Google Kubernetes Engine Gateway API。概括来讲,您需要执行以下步骤:
- 启用所需的 Google Cloud API 服务。
- 部署 GKE 集群。
- 配置 IAM 权限。
- 安装所需的自定义资源定义 (CRD)。
- 将集群注册到舰队。
- [可选] 启用多集群服务(多集群服务发现)。
- 启用服务网格。
如果您未使用 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 服务
如果您的项目中尚未启用所需的 API,请运行以下命令来启用这些 API:
gcloud services enable --project=PROJECT_ID \ container.googleapis.com \ gkehub.googleapis.com \ multiclusteringress.googleapis.com \ trafficdirector.googleapis.com \ networkservices.googleapis.com
如果您计划在舰队中添加多个集群,请启用
multiclusterservicediscovery
API:gcloud services enable --project=PROJECT_ID \ multiclusterservicediscovery.googleapis.com
部署 GKE 集群
按照以下说明部署 GKE 集群。
在
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 功能(如果将来可能会用到此功能)。
获取集群凭据:
gcloud container clusters get-credentials gke-1 --zone=us-west1-a
重命名集群上下文:
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 服务账号。
将
client
角色授予服务账号:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/" \ --role "roles/trafficdirector.client"
安装所需的自定义资源定义
安装将 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 -
运行以下命令,验证是否已在集群中自动安装所需的 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.io
和 tdgrpcroutes.net.gke.io
在上一步中安装。
属于 net.gke.io
API 组的 CRD 特定于 GKE。这些资源不属于 OSS Gateway API 实现,后者位于 networking.k8s.io
API 组中。
将集群注册到舰队
成功创建集群后,您必须向舰队注册该集群。通过将集群注册到舰队,您可以选择性地在已注册的集群上启用一些功能。
将集群注册到队列:
gcloud container hub memberships register gke-1 \ --gke-cluster us-west1-a/gke-1 \ --location global \ --project=PROJECT_ID
确认是否已向舰队注册该集群:
gcloud container hub memberships list --project=PROJECT_ID
输出类似于以下内容:
NAME EXTERNAL_ID gke-1 657e835d-3b6b-4bc5-9283-99d2da8c2e1b
(可选)启用多集群服务发现
借助多集群服务发现功能,您可以将集群本地服务导出到已注册到舰队的所有集群。如果您不打算在舰队中添加多个集群,则无需执行此步骤。
启用多集群服务发现:
gcloud container hub multi-cluster-services enable \ --project PROJECT_ID
授予多集群服务发现所需的 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"
确认是否已为注册的集群启用多集群服务发现。可能需要几分钟才能显示所有集群:
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 服务网格
在本部分中,您将启用服务网格。
在您向舰队注册的集群上启用 Cloud Service Mesh GKE 服务网格:
gcloud container hub ingress enable \ --config-membership=projects/PROJECT_ID/locations/global/memberships/gke-1 \ --project=PROJECT_ID
确认是否已启用该功能:
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'
授予 Gateway API 控制器所需的以下 Identity and Access Management (IAM) 角色:
- roles/container.developer - 此角色允许控制器管理集群内的 Kubernetes 资源。
- roles/compute.networkAdmin - 此角色允许控制器管理 Cloud Service Mesh 服务网格配置。
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"
后续步骤
如需设置示例部署,请参阅以下指南: