准备工作

除了满足一般前提条件之外,注册 Google Cloud 外部的 Kubernetes 集群还需要执行以下步骤。

确保网络连接

如需成功注册集群,您需要确保可从 Kubernetes 集群访问以下网域:

  • 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.iostorage.googleapis.com 会拉取 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)
  • Fleet API (gkehub.googleapis.com)

如果要注册启用了舰队 Workload Identity 的集群,您还需要以下服务:

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

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

设置身份

除 Google Cloud 外的所有手动集群注册选项都要求您向 Google 配置身份验证。可以使用以下选项之一:

如果集群满足我们的附加集群前提条件(如下所述),则可以在启用集群 Workload Identity 的情况下注册附加的集群。否则,请使用 Google Cloud 服务帐号注册关联的集群以进行身份验证。下一部分将介绍如何创建服务帐号。

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

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

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

gcloud

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

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME --project=FLEET_HOST_PROJECT_ID

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

gcloud iam service-accounts list --project=FLEET_HOST_PROJECT_ID

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

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

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

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

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

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

其中:

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

关联集群的前提条件

根据要注册为关联集群的第三方 Kubernetes 集群的类型,您可能需要满足一些额外的要求才能安装 Connect Agent 和/或使用舰队 Workload Identity。

配置安全上下文限制 (SCC)(OpenShift 集群)

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

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

# Connect Agent SCC
apiVersion: security.openshift.io/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
- projected
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

舰队 Workload Identity 要求

如果您的平台为您的集群创建了一个公共 OIDC 端点(或允许您创建一个),或者您为集群启用了 Kubernetes 服务帐号颁发者发现,您可以注册启用了舰队 Workload Identity 的关联集群。如果您无法满足这些要求,则必须使用 Google Cloud 服务帐号注册关联的集群以进行身份验证。

如需了解特定的集群类型,请参阅以下内容:

  • OpenShift 集群:如上所述,在配置自定义 SCC 后,可以通过启用舰队 Workload Identity 来注册。
  • 种类集群:要求启用服务帐号颁发者发现才能使用舰队 Workload Identity。Kubernetes 1.20 版中默认启用此选项。如果您需要启用此功能,请按照服务帐号令牌量投影中的说明操作。启用服务帐号令牌量项目后,系统会自动启用服务帐号颁发者发现功能。

后续步骤

按照说明注册集群