注册集群的前提条件

本页面介绍了向 Google Cloud 注册 Kubernetes 集群的前提条件和要求,包括网络、Google Cloud 和 Kubernetes 集群配置,以及 Connect 代理的资源要求

摘要

以下是注册集群的必需条件,包括确保具有相关的 IAM 和 Kubernetes 基于角色的访问权限控制 (RBAC) 角色。

  1. 在 Google Cloud 项目中启用所需的 API
  2. 确保网络连接,以访问 Google Cloud API 和服务端点。如果您要注册在 Google Cloud 上运行的 GKE 集群,则默认情况下已建立网络连接。

  3. Google Cloud 配置

  4. Kubernetes 配置

启用 API

您需要在 Google Cloud 项目中启用以下 API:

  • container.googleapis.com
  • gkeconnect.googleapis.com
  • gkehub.googleapis.com
  • cloudresourcemanager.googleapis.com

集群中的 Pod 必须能够直接或通过使用配置的代理服务器访问 googleapis.comgkeconnect.googleapis.com 地址。

如果要使用 Workload Identity 注册集群,您还必须启用以下 API:

  • iam.googleapis.com

非项目所有者必须获得 serviceusage.services.enable 权限,然后才能启用 API。

要启用这些 API,请运行以下命令:

gcloud

gcloud services enable \
 --project=[HUB_PROJECT_ID] \
 container.googleapis.com \
 gkeconnect.googleapis.com \
 gkehub.googleapis.com \
 cloudresourcemanager.googleapis.com

其中:

如需列出已在项目中启用的 API,请按照 Service Usage 文档中列出服务中的说明操作。

确保网络连接

为了成功注册集群,您需要确保可从 Kubernetes 集群访问以下网域。如果您要注册在 Google Cloud 上运行的 GKE 集群,则默认情况下已建立网络连接。

  • cloudresourcemanager.googleapis.com 会解析与集群所连接的 Google Cloud 项目有关的元数据。
  • oauth2.googleapis.com 会获取针对 gkeconnect.googleapis.com 的代理 (Agent) 操作的短期 OAuth 令牌。
  • gkeconnect.googleapis.com 会建立用于接收 Google Cloud 请求的渠道并发出响应。
  • gkehub.googleapis.com 会创建与要连接到 Google Cloud 的集群对应的 Google Cloud 端中心成员资源。
  • www.googleapis.com 会对来自传入的 Google Cloud 服务请求的服务令牌进行身份验证。
  • gcr.io 会拉取 GKE Connect Agent 映像。

如果要使用 Workload Identity 注册集群,则还必须可以访问以下网域:

  • securetoken.googleapis.com
  • iamcredentials.googleapis.com
  • sts.googleapis.com

如果要对 Connect 使用代理,则还必须使用这些相关网域更新代理的许可名单。

如果您使用 gcloud 注册 Kubernetes 集群,则还需要在运行 gcloud 命令的环境中可以访问这些网域。

使用 VPC Service Controls

如果您希望在应用中使用 VPC Service Controls 来提升数据安全性,则需要确保以下服务在服务边界内:

  • Resource Manager API (cloudresourcemanager.googleapis.com)
  • GKE Connect API (gkeconnect.googleapis.com)
  • GKE Hub API (gkehub.googleapis.com)

如果您使用 Workload Identity 注册集群,则还需要以下服务:

  • IAM Service Account Credentials API (iamcredentials.googleapis.com)
  • Security Token Service API (sts.googleapis.com)

您还需要设置专用连接,以便访问相关 API。如需了解如何执行此操作,请参阅设置专用连接

Google Cloud 设置和配置

安装 Cloud SDK

安装 Cloud SDK,其中包含 gcloud(Google Cloud 的命令行界面 (CLI))。

授权 gcloud 访问 Google Cloud:

安装 Cloud SDK 后,请运行以下命令以登录 Google Cloud:

gcloud auth login

安装 gcloud beta(可选)

如果您打算试用 Alpha 版或测试版 Connect 功能,请安装 gcloud beta 组件:

 gcloud components install beta 

将所需的 IAM 角色授予注册集群的用户

在项目中拥有 roles/owner 角色后,您就拥有了完全的控制权,并且能够完成注册任务。

如果您在项目中没有 roles/owner 角色,则需要先获得特定的 IAM 角色,然后才能将集群连接到 Google。请参阅 Connect IAM 角色

以下 IAM 角色可确保您可以使用服务帐号注册和连接集群:

  • roles/gkehub.admin
  • roles/iam.serviceAccountAdmin
  • roles/iam.serviceAccountKeyAdmin
  • roles/resourcemanager.projectIamAdmin

仅对于 GKE 集群,您还可以添加以下角色,以获取集群的管理员权限(如果您尚未具有该角色),如果您创建了集群,您的用户帐号可能具有此角色:

  • roles/container.admin

对于 GKE 集群,此 IAM 角色包含 Kubernetes 基于角色的访问权限控制 (RBAC) cluster-admin 角色。对于其他集群环境,您需要使用 kubectl 授予此 RBAC 角色,如 Kubernetes 设置和配置中所述。如需详细了解 GKE 中 IAM 与 RBAC 角色之间的关系,请参阅 GKE 文档

如果要使用 Workload Identity 注册集群,您只需要以下 IAM 角色:

  • roles/gkehub.admin

gcloud

gcloud projects add-iam-policy-binding [HUB_PROJECT_ID] \
 --member user:[GCP_EMAIL_ADDRESS] \
 --role=roles/gkehub.admin \
 --role=roles/iam.serviceAccountAdmin \
 --role=roles/iam.serviceAccountKeyAdmin \
 --role=roles/resourcemanager.projectIamAdmin

其中:

  • [HUB_PROJECT_ID] 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值
  • [GCP_EMAIL_ADDRESS] 是注册用户用于登录 Google Cloud 的帐号。

如需详细了解如何授予 IAM 角色,请参阅 IAM 文档中的授予、更改和撤消对资源的访问权限

为其他用户授予只读角色

具有以下角色的经过身份验证的用户可以在 Cloud Console 中查看已注册的用户集群。这些角色提供只读访问权限:

  • roles/gkehub.viewer
  • roles/container.viewer

例如,如需在项目中为用户授予 roles/gkehub.viewer 和 roles/container.viewer 角色,您需要运行以下命令:

gcloud

gcloud projects add-iam-policy-binding [HUB_PROJECT_ID] \
 --member user:[USER_EMAIL_ADDRESS] \
 --role roles/gkehub.viewer \
 --role=roles/container.viewer

其中:

  • [HUB_PROJECT_ID] 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值
  • [USER_EMAIL_ADDRESS] 是已通过身份验证的用户的电子邮件地址。

使用 gcloud 创建 Google Cloud 服务帐号。

需要使用包含 Google Cloud 服务帐号凭据的 JSON 文件才能手动注册集群。为遵循最小权限原则,我们建议您为注册的每个 Kubernetes 集群创建一个不同的服务帐号,并且只将 IAM 角色绑定到相应集群的服务帐号。

如需创建此文件,请执行以下步骤:

gcloud

通过运行以下命令创建服务帐号:

gcloud iam service-accounts create [SERVICE_ACCOUNT_NAME] --project=[HUB_PROJECT_ID]

通过运行以下命令来列出项目的所有服务帐号:

gcloud iam service-accounts list --project=[HUB_PROJECT_ID]

如果要为您注册的每个 Kubernetes 集群创建一个不同的服务帐号,请使用 IAM Condition,将 gkehub.connect IAM 角色绑定到其对应的集群的服务帐号:

MEMBERSHIP_NAME=[MEMBERSHIP_NAME]
HUB_PROJECT_ID=[HUB_PROJECT_ID]
SERVICE_ACCOUNT_NAME=[SERVICE_ACCOUNT_NAME]
gcloud projects add-iam-policy-binding ${HUB_PROJECT_ID} \
 --member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${HUB_PROJECT_ID}.iam.gserviceaccount.com" \
 --role="roles/gkehub.connect" \
 --condition "expression=resource.name == \
'projects/${HUB_PROJECT_ID}/locations/global/memberships/${MEMBERSHIP_NAME}',\
title=bind-${SERVICE_ACCOUNT_NAME}-to-${MEMBERSHIP_NAME}"

否则,请将角色绑定到项目中所有无该条件的集群的服务帐号。

HUB_PROJECT_ID=[HUB_PROJECT_ID]
gcloud projects add-iam-policy-binding ${HUB_PROJECT_ID} \
 --member="serviceAccount:[SERVICE_ACCOUNT_NAME]@${HUB_PROJECT_ID}.iam.gserviceaccount.com" \
 --role="roles/gkehub.connect"

下载服务帐号的私钥 JSON 文件。您在注册集群时会用到此文件:

HUB_PROJECT_ID=[HUB_PROJECT_ID]
gcloud iam service-accounts keys create [LOCAL_KEY_PATH] \
  --iam-account=[SERVICE_ACCOUNT_NAME]@${HUB_PROJECT_ID}.iam.gserviceaccount.com \
  --project=${HUB_PROJECT_ID}

其中:

  • [HUB_PROJECT_ID] 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值
  • [SERVICE_ACCOUNT_NAME] 是您为服务帐号选择的显示名。
  • [MEMBERSHIP_NAME] 是您选择要在注册时唯一表示集群的成员资格名称。
  • [LOCAL_KEY_PATH] 是您要将服务帐号私钥(一个 JSON 文件)保存到的本地文件路径。我们建议您使用服务帐号名称和项目 ID 命名文件,如 /tmp/creds/[SERVICE_ACCOUNT_NAME]-[HUB_PROJECT_ID].json

将 GKE 集群注册到其他项目中

当您首次将 GKE 集群从其项目 (GKE_PROJECT) 注册到其他项目 (HUB_PROJECT) 时,您必须先授予必要的权限。HUB_PROJECT 默认服务帐号 gcp-sa-gkehub 需要使用 GKE_PROJECT 项目中的 Hub Service Agent 角色。Hub Service Agent 是一种 IAM 角色,它授予服务帐号管理集群资源的权限。

您可以使用 gcloud 工具或 Cloud Console 确认 gcp-sa-gkehub 是否具备所需的角色。如果命令或信息中心未显示 gcp-sa-gkehub,则表示缺少所需的角色。如果看到 gcp-sa-gkehub,它的格式应为 service-[HUB-PROJECT-NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com

gcloud

运行以下命令:

gcloud projects get-iam-policy [GKE_PROJECT_ID]

如需授予 gcp-sa-gkehub Hub Service Agent 角色,您需要先确保中心默认服务帐号已存在。如果您之前在此项目中注册了集群,则此服务帐号应该已存在。

要创建 gcp-sa-gkehub,请运行以下命令:

gcloud beta services identity create --service=gkehub.googleapis.com --project=[HUB_PROJECT_ID]

此命令应输出以下内容:

Service identity created: service-[HUB_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com

gcp-sa-gkehub 服务帐号存在后,运行以下命令以授予其 roles/gkehub.serviceAgent 角色:

GKE_PROJECT_ID=[GKE_PROJECT_ID]
HUB_PROJECT_ID=[HUB_PROJECT_ID]
HUB_PROJECT_NUMBER=$(gcloud projects describe "${HUB_PROJECT_ID}" --format "value(projectNumber)")
gcloud projects add-iam-policy-binding "${HUB_PROJECT_ID}" \
--member "serviceAccount:service-${HUB_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
--role roles/gkehub.serviceAgent
gcloud projects add-iam-policy-binding "${GKE_PROJECT_ID}" \
--member "serviceAccount:service-${HUB_PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
--role roles/gkehub.serviceAgent

其中:

  • [GKE_PROJECT_ID] 是 GKE 集群的 Google Cloud 项目 ID。
  • [HUB_PROJECT_ID] 是您要在其中注册集群的 Google Cloud 项目 ID。了解如何查找此值

如需确认已授予角色绑定:

  gcloud projects get-iam-policy [GKE_PROJECT_ID]
  

如果您看到服务帐号名称和 gkehub.serviceAgent 角色,则已授予角色绑定。例如:

  - members:
    - serviceAccount:service-[HUB_PROJECT_NUMBER]@gcp-sa-gkehub.iam.gserviceaccount.com
    role: roles/gkehub.serviceAgent

Kubernetes 设置和配置

安装 kubectl

我们建议使用 Cloud SDK 安装 kubectl。

如需检查 kubectl 的版本,请运行以下命令:

kubectl version

客户端版本由输出的“gitVersion”表示。

如需安装 kubectl,请运行以下命令:

gcloud components install kubectl

向注册集群的用户授予 cluster-admin RBAC 角色

cluster-admin RBAC(基于角色的访问权限控制)ClusterRole 可为您授予将集群连接回 Google 所需的集群权限。如果要注册的集群在 Google Cloud 中,您可以使用 IAM roles/container.admin 角色获得相同的权限,如 Google Cloud 设置和配置中所述。

如果集群是由您创建的,则您可能会被授予此角色。您可以通过运行以下命令来验证这一点:

kubectl auth can-i '*' '*' --all-namespaces

如果您或其他用户需要该角色,请在集群中创建 ClusterRoleBinding 资源:

kubectl create clusterrolebinding [BINDING_NAME] --clusterrole cluster-admin --user [USER] 

其中:

  • [BINDING_NAME] 是您为 ClusterRoleBinding 资源选择的名称。
  • [USER] 是用于针对集群进行身份验证的身份。

如需详细了解 cluster-admin 角色,请参阅 Kubernetes 文档

使用准入控制

在向 Google Cloud 注册集群的过程中,Connect Agent 将会安装到您的集群中。根据容器平台和准入控制器,您可能需要创建允许安装代理的准入政策。

Pod 安全政策 (PSP)

PodSecurityPolicy 是一种可选的准入控制器资源,用于验证在集群上创建和更新 Pod 的请求。仅当启用了 PSP 准入控制器插件时,才会强制执行 Pod 安全政策。

如果您的集群使用 PSP 准入控制器插件,则无需创建其他任何政策即可使用 Connect Agent,因为在集群注册过程中系统会自动安装 Connect Agent 专属政策和 RBAC 角色。

您可以使用以下命令来检验已安装的 PSP 政策和 RBAC:

$ kubectl get psp | grep connect
$ kubectl get role,rolebindings -n gke-connect | grep psp

安全上下文限制 (SCC)

OpenShift OKEOKD 集群上,管理员可以使用 SCC 控制 pod 的权限。如需允许在集群中安装 Connect Agent,您需要创建自定义 SCC。

以下示例 SCC 定义指定了 Connect Agent 必须满足哪些条件才能加入集群:

# Connect Agent SCC
apiVersion: v1
kind: SecurityContextConstraints
metadata:
  name: gke-connect-scc
allowPrivilegeEscalation: false
# This is redundant with non-root + disallow privilege escalation,
# but we provide it for defense in depth.
requiredDropCapabilities:
- ALL
runAsUser:
  type: MustRunAsNonRoot
seLinuxContext:
  type: RunAsAny
supplementalGroups:
  type: MustRunAs
  ranges:
  - min: 1
    max: 65535
fsGroup:
  type: MustRunAs
  ranges:
  - min: 1
    max: 65535
volumes:
- secret
readOnlyRootFilesystem: true
seccompProfiles:
- docker/default
users:
groups:
  # Grants all service accounts in the gke-connect namespace access to this SCC
  - system:serviceaccounts:gke-connect

假设您已将 SCC 定义另存为 gke-connect-scc.yaml,请使用 OpenShift oc 命令行工具为您的集群创建 gke-connect-scc SCC,如下所示:

$ oc create -f gke-connect-scc.yaml

要验证是否已创建了自定义 SCC,请运行以下 oc 命令:

$ oc get scc | grep gke-connect-scc

资源用量和要求

通常,注册时安装的 Connect 代理会使用 500m 的 CPU 和 200Mi 的内存。但是,此使用情况可能因每秒向代理发出的请求数以及这些请求的大小而异。这些可能受到许多因素的影响,包括集群的大小、通过 Cloud Console 访问集群的用户数(用户数和/或工作负载越多,请求次数越多)以及集群上启用 Environ 的功能数量。

后续步骤