除了满足一般前提条件之外,注册 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.io和storage.googleapis.com会拉取 GKE Connect Agent 映像。
如果要使用舰队 Workload Identity 注册集群,则还必须可以访问以下网域:
securetoken.googleapis.comiamcredentials.googleapis.comsts.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(推荐,如适用)。如需详细了解启用舰队 Workload Identity 的优势,请参阅使用舰队 Workload Identity。
- Google Cloud 服务账号
如果集群满足我们的附加集群前提条件(如下所述),则可以在启用集群 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}
其中:
关联集群的前提条件
根据要注册为关联集群的第三方 Kubernetes 集群的类型,您可能需要满足一些额外的要求才能安装 Connect Agent 和/或使用舰队 Workload Identity。
配置安全上下文限制 (SCC)(OpenShift 集群)
在 OpenShift OKE 和 OKD 集群上,管理员可以使用 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 版中默认启用此选项。如果您需要启用此功能,请按照服务账号令牌量投影中的说明操作。启用服务账号令牌量项目后,系统会自动启用服务账号颁发者发现功能。
后续步骤
按照说明注册集群。