19.6. 在 GCP Workload Identity 中使用手动模式
Google Cloud Platform (GCP) 支持使用 GCP Workload Identity 的手动模式。
此凭证策略只支持新的 OpenShift Container Platform 集群,且必须在安装过程中进行配置。您无法重新配置使用不同凭证策略的现有集群,以使用此功能。
19.6.1. 关于 GCP Workload Identity 的手动模式
在 GCP Workload Identity 中,各个 OpenShift Container Platform 集群组件可以使用简短的、有限权限的凭证模拟 IAM 服务帐户。
使用正确配置的 OpenID Connect (OIDC) 身份提供程序以及 IAM 服务帐户来自动请求新的和刷新的凭证。GCP 信任的服务帐户令牌由 OpenShift Container Platform 签名,并可投射到 pod 中并用于身份验证。令牌会在一小时后刷新。
图 19.3. 工作负载身份身份验证流
在 GCP Workload Identity 中使用手动模式会更改提供给各个 OpenShift Container Platform 组件的 GCP 凭证的内容。
GCP secret 格式
apiVersion: v1 kind: Secret metadata: namespace: <target_namespace> 1 name: <target_secret_name> 2 data: service_account.json: <service_account> 3
使用长期凭证的 Base64 编码 service_account.json
文件的内容
{ "type": "service_account", 1 "project_id": "<project_id>", "private_key_id": "<private_key_id>", "private_key": "<private_key>", 2 "client_email": "<client_email_address>", "client_id": "<client_id>", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/<client_email_address>" }
使用 GCP Workload Identity 的 Base64 编码 service_account.json
文件的内容
{ "type": "external_account", 1 "audience": "//iam.googleapis.com/projects/123456789/locations/global/workloadIdentityPools/test-pool/providers/test-provider", 2 "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/<client_email_address>:generateAccessToken", 3 "credential_source": { "file": "<path_to_token>", 4 "format": { "type": "text" } } }
19.6.2. 使用 GCP Workload Identity 为手动模式安装 OpenShift Container Platform 集群
要安装配置为在带有 GCP Workload Identity 的手动模式中使用 Cloud Credential Operator (CCO) 的集群:
因为在使用 GCP Workload Identity 时集群以手动模式运行,所以无法使用所需的权限为组件创建新凭证。当升级到 OpenShift Container Platform 的不同次要版本时,通常会有新的 GCP 权限要求。在升级使用 GCP Workload Identity 的集群前,集群管理员必须手动确保 GCP 权限足以满足现有组件并可供任何新组件使用。
19.6.2.1. 配置 Cloud Credential Operator 工具
当 Cloud Credential Operator(CCO)以手动模式运行时,要从集群外部创建和管理云凭证,提取并准备 CCO 实用程序(ccoctl
)二进制文件。
ccoctl
工具是在 Linux 环境中运行的 Linux 二进制文件。
先决条件
- 您可以访问具有集群管理员权限的 OpenShift Container Platform 帐户。
-
已安装 OpenShift CLI(
oc
)。
流程
运行以下命令来获取 OpenShift Container Platform 发行镜像:
$ RELEASE_IMAGE=$(./openshift-install version | awk '/release image/ {print $3}')
运行以下命令,从 OpenShift Container Platform 发行镜像获取 CCO 容器镜像:
$ CCO_IMAGE=$(oc adm release info --image-for='cloud-credential-operator' $RELEASE_IMAGE -a ~/.pull-secret)
注意确保
$RELEASE_IMAGE
的架构与将使用ccoctl
工具的环境架构相匹配。运行以下命令,将 CCO 容器镜像中的
ccoctl
二进制文件提取到 OpenShift Container Platform 发行镜像中:$ oc image extract $CCO_IMAGE --file="/usr/bin/ccoctl" -a ~/.pull-secret
运行以下命令更改权限以使
ccoctl
可执行:$ chmod 775 ccoctl
验证
要验证
ccoctl
是否准备就绪,可以尝试显示帮助文件。运行命令时使用相对文件名,例如:$ ./ccoctl.rhel9
输出示例
OpenShift credentials provisioning tool Usage: ccoctl [command] Available Commands: alibabacloud Manage credentials objects for alibaba cloud aws Manage credentials objects for AWS cloud gcp Manage credentials objects for Google cloud help Help about any command ibmcloud Manage credentials objects for IBM Cloud nutanix Manage credentials objects for Nutanix Flags: -h, --help help for ccoctl Use "ccoctl [command] --help" for more information about a command.
19.6.2.2. 使用 Cloud Credential Operator 实用程序创建 GCP 资源
您可以使用 ccoctl gcp create-all
命令自动创建 GCP 资源。
默认情况下,ccoctl
在运行命令的目录中创建对象。要在其他目录中创建对象,请使用 --output-dir
标志。此流程使用 <path_to_ccoctl_output_dir>
来引用这个目录。
先决条件
您必须:
-
提取并准备好
ccoctl
二进制文件。
流程
运行以下命令设置
$RELEASE_IMAGE
变量:$ RELEASE_IMAGE=$(./openshift-install version | awk '/release image/ {print $3}')
运行以下命令,从 OpenShift Container Platform 发行镜像中提取
CredentialsRequest
对象列表:$ oc adm release extract \ --from=$RELEASE_IMAGE \ --credentials-requests \ --cloud=gcp \ --to=<path_to_directory_with_list_of_credentials_requests>/credrequests 1
- 1
credrequests
是存储CredentialsRequest
对象列表的目录。如果该目录不存在,此命令就会创建该目录。
注意运行此命令可能需要一些时间。
如果您的集群使用集群功能禁用一个或多个可选组件,请删除任何禁用组件的
CredentialsRequest
自定义资源。GCP 上 OpenShift Container Platform 4.13 的
credrequests
目录的内容示例0000_26_cloud-controller-manager-operator_16_credentialsrequest-gcp.yaml 1 0000_30_cluster-api_00_credentials-request.yaml 2 0000_30_machine-api-operator_00_credentials-request.yaml 3 0000_50_cloud-credential-operator_05-gcp-ro-credentialsrequest.yaml 4 0000_50_cluster-image-registry-operator_01-registry-credentials-request-gcs.yaml 5 0000_50_cluster-ingress-operator_00-ingress-credentials-request.yaml 6 0000_50_cluster-network-operator_02-cncc-credentials.yaml 7 0000_50_cluster-storage-operator_03_credentials_request_gcp.yaml 8
- 1
- 需要 Cloud Controller Manager Operator CR。
- 2
- 对于使用
TechPreviewNoUpgrade
功能集的集群,需要 Cluster API Operator CR。 - 3
- Machine API Operator CR 是必需的。
- 4
- 需要 Cloud Credential Operator CR。
- 5
- Image Registry Operator CR 是必需的。
- 6
- Ingress Operator CR 是必需的。
- 7
- Network Operator CR 是必需的。
- 8
- Storage Operator CR 是一个可选组件,可能会在集群中禁用。
使用
ccoctl
工具处理credrequests
目录中的所有CredentialsRequest
对象:$ ccoctl gcp create-all \ --name=<name> \ --region=<gcp_region> \ --project=<gcp_project_id> \ --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests
其中:
-
<gcp_region>
是所有用于跟踪的 GCP 资源的用户定义名称。 -
<gcp_region>
是要在其中创建云资源的 GCP 区域。 -
<gcp_project_id>
是将要在其中创建云资源的 GCP 项目 ID。 -
<path_to_directory_with_list_of_credentials_requests>/credrequests
是包含CredentialsRequest
清单文件的目录,以创建 GCP 服务帐户。
注意如果您的集群使用
TechPreviewNoUpgrade
功能集启用的技术预览功能,则必须包含--enable-tech-preview
参数。-
验证
要验证 OpenShift Container Platform secret 是否已创建,列出
<path_to_ccoctl_output_dir>/manifests
目录中的文件:$ ls <path_to_ccoctl_output_dir>/manifests
输出示例:
cluster-authentication-02-config.yaml openshift-cloud-controller-manager-gcp-ccm-cloud-credentials-credentials.yaml openshift-cloud-credential-operator-cloud-credential-operator-gcp-ro-creds-credentials.yaml openshift-cloud-network-config-controller-cloud-credentials-credentials.yaml openshift-cluster-api-capg-manager-bootstrap-credentials-credentials.yaml openshift-cluster-csi-drivers-gcp-pd-cloud-credentials-credentials.yaml openshift-image-registry-installer-cloud-credentials-credentials.yaml openshift-ingress-operator-cloud-credentials-credentials.yaml openshift-machine-api-gcp-cloud-credentials-credentials.yaml
您可以通过查询 GCP 来验证是否已创建 IAM 服务帐户。如需更多信息,请参阅有关列出 IAM 服务帐户的 GCP 文档。
19.6.2.3. 运行安装程序
先决条件
- 使用托管集群的云平台配置帐户。
- 获取 OpenShift Container Platform 发行镜像。
流程
进入包含安装程序的目录并创建
install-config.yaml
文件:$ openshift-install create install-config --dir <installation_directory>
其中
<installation_directory>
是安装程序在其中创建文件的目录。编辑
install-config.yaml
配置文件,使其包含将credentialsMode
参数设置为Manual
。install-config.yaml
配置文件示例apiVersion: v1 baseDomain: cluster1.example.com credentialsMode: Manual 1 compute: - architecture: amd64 hyperthreading: Enabled
- 1
- 添加这一行将
credentialsMode
参数设置为Manual
。
创建所需的 OpenShift Container Platform 安装清单:
$ openshift-install create manifests
将
ccoctl
生成的清单复制到安装程序创建的 manifests 目录中:$ cp /<path_to_ccoctl_output_dir>/manifests/* ./manifests/
将
ccoctl
在tls
目录中生成的私钥复制到安装目录中:$ cp -a /<path_to_ccoctl_output_dir>/tls .
运行 OpenShift Container Platform 安装程序:
$ ./openshift-install create cluster
19.6.2.4. 验证安装
- 连接到 OpenShift Container Platform 集群。
验证集群没有
root
凭证:$ oc get secrets -n kube-system gcp-credentials
输出应类似于:
Error from server (NotFound): secrets "gcp-credentials" not found
验证组件是否假设 secret 清单中指定的服务帐户,而不是使用由 CCO 创建的凭证:
带有 Image Registry Operator 的命令示例
$ oc get secrets -n openshift-image-registry installer-cloud-credentials -o json | jq -r '.data."service_account.json"' | base64 -d
输出应显示组件使用的角色和 Web 身份令牌,如下所示:
带有 Image Registry Operator 的输出示例
{ "type": "external_account", 1 "audience": "//iam.googleapis.com/projects/123456789/locations/global/workloadIdentityPools/test-pool/providers/test-provider", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/<client-email-address>:generateAccessToken", 2 "credential_source": { "file": "/var/run/secrets/openshift/serviceaccount/token", "format": { "type": "text" } } }