除了满足一般前提条件之外,注册 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.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(推荐,如适用)。如需详细了解启用舰队 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 版中默认启用此选项。如果您需要启用此功能,请按照服务账号令牌量投影中的说明操作。启用服务账号令牌量项目后,系统会自动启用服务账号颁发者发现功能。
后续步骤
按照说明注册集群。