18.6. 在 GCP Workload Identity 中使用手动模式


Google Cloud Platform (GCP) 支持使用 GCP Workload Identity 的手动模式。

注意

此凭证策略只支持新的 OpenShift Container Platform 集群,且必须在安装过程中进行配置。您无法重新配置使用不同凭证策略的现有集群,以使用此功能。

18.6.1. 关于 GCP Workload Identity 的手动模式

在 GCP Workload Identity 中,各个 OpenShift Container Platform 集群组件可以使用简短的、有限权限的凭证模拟 IAM 服务帐户。

使用正确配置的 OpenID Connect (OIDC) 身份提供程序以及 IAM 服务帐户来自动请求新的和刷新的凭证。OpenShift Container Platform 为服务帐户令牌签名,这些令牌由 GCP 信任,并可投射到 pod 中并用于身份验证。默认情况下,令牌会在一小时后刷新。

图 18.3. 工作负载身份身份验证流

使用 GCP Workload Identity 时 GCP 和集群间的详细身份验证流

在 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

1
组件的命名空间。
2
组件 secret 的名称。
3
Base64 编码的服务帐户。

使用长期凭证的 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>"
}

1
凭据类型是 service_account
2
用于向 GCP 验证的专用 RSA 密钥。这个密钥必须保持安全,且不会被轮转。

使用 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"
      }
   }
}

1
凭证类型是 external_account
2
目标受众是 GCP Workload Identity provider。
3
可以通过这些凭据模拟的服务帐户的资源 URL。
4
pod 中服务帐户令牌的路径。通常这是 OpenShift Container Platform 组件的 /var/run/secrets/openshift/serviceaccount/token
注意

在 OpenShift Container Platform 4.10.8 中,因为发现了一个对镜像 registry 有负面影响的问题,删除了使用 GCP Workload Identity 的镜像 registry 支持。要使用 Workload Identity 的 OpenShift Container Platform 4.10.8 集群上使用镜像 registry,您必须将镜像 registry 配置为使用长期凭证。

在 OpenShift Container Platform 4.10.21 中,恢复了对使用带有镜像 registry 的 GCP Workload Identity 的支持。如需有关 OpenShift Container Platform 4.10.8 和 4.10.20 中此功能状态的更多信息,请参阅相关的知识库文章

18.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 权限足以满足现有组件并可供任何新组件使用。

18.6.2.1. 配置 Cloud Credential Operator 工具

当 Cloud Credential Operator(CCO)以手动模式运行时,要从集群外部创建和管理云凭证,提取并准备 CCO 实用程序(ccoctl)二进制文件。

注意

ccoctl 工具是在 Linux 环境中运行的 Linux 二进制文件。

先决条件

  • 您可以访问具有集群管理员权限的 OpenShift Container Platform 帐户。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 获取 OpenShift Container Platform 发行镜像:

    $ RELEASE_IMAGE=$(./openshift-install version | awk '/release image/ {print $3}')
  2. 从 OpenShift Container Platform 发行镜像获取 CCO 容器镜像:

    $ CCO_IMAGE=$(oc adm release info --image-for='cloud-credential-operator' $RELEASE_IMAGE)
    注意

    确保 $RELEASE_IMAGE 的架构与将使用 ccoctl 工具的环境架构相匹配。

  3. 将 CCO 容器镜像中的 ccoctl 二进制文件提取到 OpenShift Container Platform 发行镜像中:

    $ oc image extract $CCO_IMAGE --file="/usr/bin/ccoctl" -a ~/.pull-secret
  4. 更改权限以使 ccoctl 可执行:

    $ chmod 775 ccoctl

验证

  • 要验证 ccoctl 是否可以使用,请显示帮助文件:

    $ ccoctl --help

    ccoctl --help 的输出

    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
    
    Flags:
      -h, --help   help for ccoctl
    
    Use "ccoctl [command] --help" for more information about a command.

18.6.2.2. 使用 Cloud Credential Operator 实用程序创建 GCP 资源

您可以使用 ccoctl gcp create-all 命令自动创建 GCP 资源。

注意

默认情况下,ccoctl 在运行命令的目录中创建对象。要在其他目录中创建对象,请使用 --output-dir 标志。此流程使用 <path_to_ccoctl_output_dir> 来引用这个目录。

先决条件

您必须:

  • 提取并准备好 ccoctl 二进制文件。

流程

  1. 运行以下命令,从 OpenShift Container Platform 发行镜像中提取 CredentialsRequest 对象列表:

    $ oc adm release extract \
    --credentials-requests \
    --cloud=gcp \
    --to=<path_to_directory_with_list_of_credentials_requests>/credrequests \ 1
    --quay.io/<path_to>/ocp-release:<version>
    1
    credrequests 是存储 CredentialsRequest 对象列表的目录。如果该目录不存在,此命令就会创建该目录。
    注意

    运行此命令可能需要一些时间。

  2. 如果您的集群使用集群功能禁用一个或多个可选组件,请删除任何禁用组件的 CredentialsRequest 自定义资源。

    GCP 上的 OpenShift Container Platform 4.12 的 credrequests 目录的内容示例

    0000_26_cloud-controller-manager-operator_16_credentialsrequest-gcp.yaml 1
    0000_30_machine-api-operator_00_credentials-request.yaml 2
    0000_50_cloud-credential-operator_05-gcp-ro-credentialsrequest.yaml 3
    0000_50_cluster-image-registry-operator_01-registry-credentials-request-gcs.yaml 4
    0000_50_cluster-ingress-operator_00-ingress-credentials-request.yaml 5
    0000_50_cluster-network-operator_02-cncc-credentials.yaml 6
    0000_50_cluster-storage-operator_03_credentials_request_gcp.yaml 7

    1
    需要 Cloud Controller Manager Operator CR。
    2
    Machine API Operator CR 是必需的。
    3
    需要 Cloud Credential Operator CR。
    4
    Image Registry Operator CR 是必需的。
    5
    Ingress Operator CR 是必需的。
    6
    Network Operator CR 是必需的。
    7
    Storage Operator CR 是一个可选组件,可能会在集群中禁用。
  3. 使用 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

您可以通过查询 GCP 来验证是否已创建 IAM 服务帐户。如需更多信息,请参阅有关列出 IAM 服务帐户的 GCP 文档。

18.6.2.3. 运行安装程序

先决条件

  • 使用托管集群的云平台配置帐户。
  • 获取 OpenShift Container Platform 发行镜像。

流程

  1. 进入包含安装程序的目录并创建 install-config.yaml 文件:

    $ openshift-install create install-config --dir <installation_directory>

    其中 <installation_directory> 是安装程序在其中创建文件的目录。

  2. 编辑 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
  3. 创建所需的 OpenShift Container Platform 安装清单:

    $ openshift-install create manifests
  4. ccoctl 生成的清单复制到安装程序创建的 manifests 目录中:

    $ cp /<path_to_ccoctl_output_dir>/manifests/* ./manifests/
  5. ccoctltls 目录中生成的私钥复制到安装目录中:

    $ cp -a /<path_to_ccoctl_output_dir>/tls .
  6. 运行 OpenShift Container Platform 安装程序:

    $ ./openshift-install create cluster

18.6.2.4. 验证安装

  1. 连接到 OpenShift Container Platform 集群。
  2. 验证集群没有 root 凭证:

    $ oc get secrets -n kube-system gcp-credentials

    输出应类似于:

    Error from server (NotFound): secrets "gcp-credentials" not found
  3. 验证组件是否假设 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"
          }
       }
    }

    1
    凭证类型是 external_account
    2
    Image Registry Operator 使用的服务帐户的资源 URL。

18.6.3. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.