第 10 章 更改云供应商凭证配置


对于支持的配置,您可以更改 OpenShift Container Platform 与云供应商进行身份验证的方式。

要确定集群使用哪个云凭证策略,请参阅 确定 Cloud Credential Operator 模式

有些机构需要轮转验证集群的服务密钥。您可以使用 Cloud Credential Operator (CCO)实用程序(ccoctl)更新安装在以下云供应商上的集群的密钥:

10.1.1. 轮转 AWS OIDC 绑定服务帐户签名者密钥

如果 Amazon Web Services (AWS)上的 OpenShift Container Platform 集群的 Cloud Credential Operator (CCO)被配置为使用 STS 以手动模式运行,您可以轮转绑定服务帐户签名者密钥。

要轮转密钥,您需要删除集群中的现有密钥,这会导致 Kubernetes API 服务器创建新密钥。要减少这个过程中的身份验证失败,您必须立即将新公钥添加到现有签发者文件中。在集群使用新密钥进行身份验证后,您可以删除所有剩余的密钥。

重要

轮转 OIDC 绑定服务帐户签名者密钥的过程具有破坏性,需要花费大量时间。有些步骤是时间敏感的。在继续操作前,请观察以下注意事项:

  • 阅读以下步骤,并确保您了解并接受时间要求。具体的时间要求因单个集群而异,但可能需要至少一个小时。
  • 要降低身份验证失败的风险,请确保了解并准备对时间敏感的步骤。
  • 在此过程中,您必须刷新所有服务帐户并重启集群中的所有 pod。这些操作对工作负载具有破坏性。要缓解这种影响,您可以临时停止这些服务,然后在集群就绪时重新部署它们。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问 OpenShift CLI (oc)。
  • 您已为 ccoctl 工具创建了用于以下权限的 AWS 帐户:

    • s3:GetObject
    • s3:PutObject
    • s3:PutObjectTagging
    • 对于将 OIDC 配置存储在 IAM 身份提供程序通过公共 CloudFront 分发 URL 访问的专用 S3 存储桶中的集群,运行 ccoctl 工具的 AWS 帐户需要 cloudfront:ListDistributions 权限。
  • 您已配置了 ccoctl 工具。
  • 集群处于稳定状态。您可以运行以下命令来确认集群稳定:

    $ oc adm wait-for-stable-cluster --minimum-stable-period=5s

流程

  1. 配置以下环境变量:

    INFRA_ID=$(oc get infrastructures cluster -o jsonpath='{.status.infrastructureName}')
    CLUSTER_NAME=${INFRA_ID%-*} 
    1
    1 1
    这个值应该与安装过程中在 install-config.yaml 文件的 metadata.name 字段中指定的集群名称匹配。
    注意

    您的集群可能与本例不同,资源名称可能无法与集群名称相同。确保为集群指定正确的相应资源名称。

    • 对于将 OIDC 配置存储在公共 S3 存储桶中的 AWS 集群,请配置以下环境变量:

      AWS_BUCKET=$(oc get authentication cluster -o jsonpath={'.spec.serviceAccountIssuer'} | awk -F'://' '{print$2}' |awk -F'.' '{print$1}')
    • 对于将 OIDC 配置存储在 IAM 身份提供程序通过公共 CloudFront 发布 URL 访问的专用 S3 存储桶中的 AWS 集群,请完成以下步骤:

      1. 运行以下命令提取公共 CloudFront 发布 URL:

        $ basename $(oc get authentication cluster -o jsonpath={'.spec.serviceAccountIssuer'} )

        输出示例

        <subdomain>.cloudfront.net

        其中 <subdomain> 是一个由字母数字组成的字符串。

      2. 运行以下命令来确定私有 S3 存储桶名称:

        $ aws cloudfront list-distributions --query "DistributionList.Items[].{DomainName: DomainName, OriginDomainName: Origins.Items[0].DomainName}[?contains(DomainName, '<subdomain>.cloudfront.net')]"

        输出示例

        [
            {
                "DomainName": "<subdomain>.cloudfront.net",
                "OriginDomainName": "<s3_bucket>.s3.us-east-2.amazonaws.com"
            }
        ]

        其中 <s3_bucket> 是集群的私有 S3 存储桶名称。

      3. 配置以下环境变量:

        AWS_BUCKET=$<s3_bucket>

        其中 <s3_bucket> 是集群的私有 S3 存储桶名称。

  2. 运行以下命令,创建一个临时目录来使用并为它分配一个环境变量:

    $ TEMPDIR=$(mktemp -d)
  3. 要让 Kubernetes API 服务器创建新的绑定服务帐户签名密钥,您需要删除下一个绑定服务帐户签名密钥。

    重要

    完成此步骤后,Kubernetes API 服务器开始推出新密钥。要降低身份验证失败的风险,请尽快完成剩余的步骤。剩余的步骤可能会对工作负载造成破坏。

    准备就绪后,运行以下命令来删除下一个绑定服务帐户签名密钥:

    $ oc delete secrets/next-bound-service-account-signing-key \
      -n openshift-kube-apiserver-operator
  4. 运行以下命令,从 Kubernetes API 服务器创建的服务帐户签名密钥 secret 下载公钥:

    $ oc get secret/next-bound-service-account-signing-key \
      -n openshift-kube-apiserver-operator \
      -ojsonpath='{ .data.service-account\.pub }' | base64 \
      -d > ${TEMPDIR}/serviceaccount-signer.public
  5. 运行以下命令,使用公钥创建一个 key.json 文件:

    $ ccoctl aws create-identity-provider \
      --dry-run \
    1
    
      --output-dir ${TEMPDIR} \
      --public-key-file=${TEMPDIR}/serviceaccount-signer.public \
    2
    
      --name fake \
    3
    
      --region us-east-1 
    4
    1
    --dry-run 选项会将文件(包括新 keys.json 文件)输出到磁盘,而不会发出 API 调用。
    2
    指定您在上一步中下载的公钥的路径。
    3
    因为 -dry-run 选项不会发出任何 API 调用,所以有些参数并不需要实际值。
    4
    指定任何有效的 AWS 区域,如 us-east-1。这个值不需要与集群所在的区域匹配。
  6. 运行以下命令来重命名 keys.json 文件:

    $ cp ${TEMPDIR}/<number>-keys.json ${TEMPDIR}/jwks.new.json

    其中 <number> 是一个两位数字的值,具体因您的环境而异。

  7. 运行以下命令,从云供应商下载现有的 key.json 文件:

    $ aws s3api get-object \
      --bucket ${AWS_BUCKET} \
      --key keys.json ${TEMPDIR}/jwks.current.json
  8. 运行以下命令组合两个 keys.json 文件:

    $ jq -s '{ keys: map(.keys[])}' ${TEMPDIR}/jwks.current.json ${TEMPDIR}/jwks.new.json > ${TEMPDIR}/jwks.combined.json
  9. 要在轮转过程中为旧密钥和新密钥启用身份验证,请运行以下命令将组合的 keys.json 文件上传到云供应商:

    $ aws s3api put-object \
      --bucket ${AWS_BUCKET} \
      --tagging "openshift.io/cloud-credential-operator/${CLUSTER_NAME}=owned" \
      --key keys.json \
      --body ${TEMPDIR}/jwks.combined.json
  10. 等待 Kubernetes API 服务器更新并使用新密钥。您可以运行以下命令来监控更新进度:

    $ oc adm wait-for-stable-cluster

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All clusteroperators are stable
  11. 为确保集群中的所有 pod 使用新密钥,您必须重启它们。

    重要

    此步骤对于被配置为在多个节点之间实现高可用性的服务可以维护正常运行,但可能会导致不具有高可用性的服务停机。

    运行以下命令重启集群中的所有 pod:

    $ oc adm reboot-machine-config-pool mcp/worker mcp/master
  12. 运行以下命令监控重启和更新进程:

    $ oc adm wait-for-node-reboot nodes --all

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All nodes rebooted
  13. 运行以下命令监控更新进度:

    $ oc adm wait-for-stable-cluster

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All clusteroperators are stable
  14. 运行以下命令,将组合的 keys.json 文件替换为在云供应商中更新的 keys.json 文件。

    $ aws s3api put-object \
      --bucket ${AWS_BUCKET} \
      --tagging "openshift.io/cloud-credential-operator/${CLUSTER_NAME}=owned" \
      --key keys.json \
      --body ${TEMPDIR}/jwks.new.json

如果 Google Cloud (GCP) 上的 OpenShift Container Platform 集群的 Cloud Credential Operator (CCO) 被配置为使用 GCP Workload Identity 以手动模式运行,您可以轮转绑定服务帐户签名者密钥。

要轮转密钥,您需要删除集群中的现有密钥,这会导致 Kubernetes API 服务器创建新密钥。要减少这个过程中的身份验证失败,您必须立即将新公钥添加到现有签发者文件中。在集群使用新密钥进行身份验证后,您可以删除所有剩余的密钥。

重要

轮转 OIDC 绑定服务帐户签名者密钥的过程具有破坏性,需要花费大量时间。有些步骤是时间敏感的。在继续操作前,请观察以下注意事项:

  • 阅读以下步骤,并确保您了解并接受时间要求。具体的时间要求因单个集群而异,但可能需要至少一个小时。
  • 要降低身份验证失败的风险,请确保了解并准备对时间敏感的步骤。
  • 在此过程中,您必须刷新所有服务帐户并重启集群中的所有 pod。这些操作对工作负载具有破坏性。要缓解这种影响,您可以临时停止这些服务,然后在集群就绪时重新部署它们。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问 OpenShift CLI (oc)。
  • 您已在 ccoctl 工具使用的 Google Cloud 帐户中添加以下身份验证选项之一:

    • IAM Workload Identity Pool Admin 角色
    • 以下粒度权限:

      • storage.objects.create
      • storage.objects.delete
  • 您已配置了 ccoctl 工具。
  • 集群处于稳定状态。您可以运行以下命令来确认集群稳定:

    $ oc adm wait-for-stable-cluster --minimum-stable-period=5s

流程

  1. 配置以下环境变量:

    CURRENT_ISSUER=$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}')
    GCP_BUCKET=$(echo ${CURRENT_ISSUER} | cut -d "/" -f4)
    注意

    您的集群可能与本例不同,资源名称可能无法与集群名称相同。确保为集群指定正确的相应资源名称。

  2. 运行以下命令,创建一个临时目录来使用并为它分配一个环境变量:

    $ TEMPDIR=$(mktemp -d)
  3. 要让 Kubernetes API 服务器创建新的绑定服务帐户签名密钥,您需要删除下一个绑定服务帐户签名密钥。

    重要

    完成此步骤后,Kubernetes API 服务器开始推出新密钥。要降低身份验证失败的风险,请尽快完成剩余的步骤。剩余的步骤可能会对工作负载造成破坏。

    准备就绪后,运行以下命令来删除下一个绑定服务帐户签名密钥:

    $ oc delete secrets/next-bound-service-account-signing-key \
      -n openshift-kube-apiserver-operator
  4. 运行以下命令,从 Kubernetes API 服务器创建的服务帐户签名密钥 secret 下载公钥:

    $ oc get secret/next-bound-service-account-signing-key \
      -n openshift-kube-apiserver-operator \
      -ojsonpath='{ .data.service-account\.pub }' | base64 \
      -d > ${TEMPDIR}/serviceaccount-signer.public
  5. 运行以下命令,使用公钥创建一个 key.json 文件:

    $ ccoctl gcp create-workload-identity-provider \
      --dry-run \
    1
    
      --output-dir=${TEMPDIR} \
      --public-key-file=${TEMPDIR}/serviceaccount-signer.public \
    2
    
      --name fake \
    3
    
      --project fake \
      --workload-identity-pool fake
    1
    --dry-run 选项会将文件(包括新 keys.json 文件)输出到磁盘,而不会发出 API 调用。
    2
    指定您在上一步中下载的公钥的路径。
    3
    因为 -dry-run 选项不会发出任何 API 调用,所以有些参数并不需要实际值。
  6. 运行以下命令来重命名 keys.json 文件:

    $ cp ${TEMPDIR}/<number>-keys.json ${TEMPDIR}/jwks.new.json

    其中 <number> 是一个两位数字的值,具体因您的环境而异。

  7. 运行以下命令,从云供应商下载现有的 key.json 文件:

    $ gcloud storage cp gs://${GCP_BUCKET}/keys.json ${TEMPDIR}/jwks.current.json
  8. 运行以下命令组合两个 keys.json 文件:

    $ jq -s '{ keys: map(.keys[])}' ${TEMPDIR}/jwks.current.json ${TEMPDIR}/jwks.new.json > ${TEMPDIR}/jwks.combined.json
  9. 要在轮转过程中为旧密钥和新密钥启用身份验证,请运行以下命令将组合的 keys.json 文件上传到云供应商:

    $ gcloud storage cp ${TEMPDIR}/jwks.combined.json gs://${GCP_BUCKET}/keys.json
  10. 等待 Kubernetes API 服务器更新并使用新密钥。您可以运行以下命令来监控更新进度:

    $ oc adm wait-for-stable-cluster

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All clusteroperators are stable
  11. 为确保集群中的所有 pod 使用新密钥,您必须重启它们。

    重要

    此步骤对于被配置为在多个节点之间实现高可用性的服务可以维护正常运行,但可能会导致不具有高可用性的服务停机。

    运行以下命令重启集群中的所有 pod:

    $ oc adm reboot-machine-config-pool mcp/worker mcp/master
  12. 运行以下命令监控重启和更新进程:

    $ oc adm wait-for-node-reboot nodes --all

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All nodes rebooted
  13. 运行以下命令监控更新进度:

    $ oc adm wait-for-stable-cluster

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All clusteroperators are stable
  14. 运行以下命令,将组合的 keys.json 文件替换为在云供应商中更新的 keys.json 文件。

    $ gcloud storage cp ${TEMPDIR}/jwks.new.json gs://${GCP_BUCKET}/keys.json

10.1.3. 轮转 Azure OIDC 绑定服务帐户签名者密钥

如果 Microsoft Azure 上的 OpenShift Container Platform 集群的 Cloud Credential Operator (CCO)配置为使用 Microsoft Entra Workload ID 以手动模式运行,您可以轮转绑定服务帐户签名者密钥。

要轮转密钥,您需要删除集群中的现有密钥,这会导致 Kubernetes API 服务器创建新密钥。要减少这个过程中的身份验证失败,您必须立即将新公钥添加到现有签发者文件中。在集群使用新密钥进行身份验证后,您可以删除所有剩余的密钥。

重要

轮转 OIDC 绑定服务帐户签名者密钥的过程具有破坏性,需要花费大量时间。有些步骤是时间敏感的。在继续操作前,请观察以下注意事项:

  • 阅读以下步骤,并确保您了解并接受时间要求。具体的时间要求因单个集群而异,但可能需要至少一个小时。
  • 要降低身份验证失败的风险,请确保了解并准备对时间敏感的步骤。
  • 在此过程中,您必须刷新所有服务帐户并重启集群中的所有 pod。这些操作对工作负载具有破坏性。要缓解这种影响,您可以临时停止这些服务,然后在集群就绪时重新部署它们。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问 OpenShift CLI (oc)。
  • 您已为 ccoctl 工具创建了全局 Azure 帐户,用于以下权限:

    • Microsoft.Storage/storageAccounts/listkeys/action
    • Microsoft.Storage/storageAccounts/read
    • Microsoft.Storage/storageAccounts/write
    • Microsoft.Storage/storageAccounts/blobServices/containers/read
    • Microsoft.Storage/storageAccounts/blobServices/containers/write
  • 您已配置了 ccoctl 工具。
  • 集群处于稳定状态。您可以运行以下命令来确认集群稳定:

    $ oc adm wait-for-stable-cluster --minimum-stable-period=5s

流程

  1. 配置以下环境变量:

    CURRENT_ISSUER=$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}')
    AZURE_STORAGE_ACCOUNT=$(echo ${CURRENT_ISSUER} | cut -d "/" -f3 | cut -d "." -f1)
    AZURE_STORAGE_CONTAINER=$(echo ${CURRENT_ISSUER} | cut -d "/" -f4)
    注意

    您的集群可能与本例不同,资源名称可能无法与集群名称相同。确保为集群指定正确的相应资源名称。

  2. 运行以下命令,创建一个临时目录来使用并为它分配一个环境变量:

    $ TEMPDIR=$(mktemp -d)
  3. 要让 Kubernetes API 服务器创建新的绑定服务帐户签名密钥,您需要删除下一个绑定服务帐户签名密钥。

    重要

    完成此步骤后,Kubernetes API 服务器开始推出新密钥。要降低身份验证失败的风险,请尽快完成剩余的步骤。剩余的步骤可能会对工作负载造成破坏。

    准备就绪后,运行以下命令来删除下一个绑定服务帐户签名密钥:

    $ oc delete secrets/next-bound-service-account-signing-key \
      -n openshift-kube-apiserver-operator
  4. 运行以下命令,从 Kubernetes API 服务器创建的服务帐户签名密钥 secret 下载公钥:

    $ oc get secret/next-bound-service-account-signing-key \
      -n openshift-kube-apiserver-operator \
      -ojsonpath='{ .data.service-account\.pub }' | base64 \
      -d > ${TEMPDIR}/serviceaccount-signer.public
  5. 运行以下命令,使用公钥创建一个 key.json 文件:

    $ ccoctl aws create-identity-provider \
    1
    
      --dry-run \
    2
    
      --output-dir ${TEMPDIR} \
      --public-key-file=${TEMPDIR}/serviceaccount-signer.public \
    3
    
      --name fake \
    4
    
      --region us-east-1 
    5
    1
    ccoctl azure 命令没有包括 --dry-run 选项。要使用 -dry-run 选项,需要为 Azure 集群指定 aws
    2
    --dry-run 选项会将文件(包括新 keys.json 文件)输出到磁盘,而不会发出 API 调用。
    3
    指定您在上一步中下载的公钥的路径。
    4
    因为 -dry-run 选项不会发出任何 API 调用,所以有些参数并不需要实际值。
    5
    指定任何有效的 AWS 区域,如 us-east-1。这个值不需要与集群所在的区域匹配。
  6. 运行以下命令来重命名 keys.json 文件:

    $ cp ${TEMPDIR}/<number>-keys.json ${TEMPDIR}/jwks.new.json

    其中 <number> 是一个两位数字的值,具体因您的环境而异。

  7. 运行以下命令,从云供应商下载现有的 key.json 文件:

    $ az storage blob download \
      --container-name ${AZURE_STORAGE_CONTAINER} \
      --account-name ${AZURE_STORAGE_ACCOUNT} \
      --name 'openid/v1/jwks' \
      -f ${TEMPDIR}/jwks.current.json
  8. 运行以下命令组合两个 keys.json 文件:

    $ jq -s '{ keys: map(.keys[])}' ${TEMPDIR}/jwks.current.json ${TEMPDIR}/jwks.new.json > ${TEMPDIR}/jwks.combined.json
  9. 要在轮转过程中为旧密钥和新密钥启用身份验证,请运行以下命令将组合的 keys.json 文件上传到云供应商:

    $ az storage blob upload \
      --overwrite \
      --account-name ${AZURE_STORAGE_ACCOUNT} \
      --container-name ${AZURE_STORAGE_CONTAINER} \
      --name 'openid/v1/jwks' \
      -f ${TEMPDIR}/jwks.combined.json
  10. 等待 Kubernetes API 服务器更新并使用新密钥。您可以运行以下命令来监控更新进度:

    $ oc adm wait-for-stable-cluster

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All clusteroperators are stable
  11. 为确保集群中的所有 pod 使用新密钥,您必须重启它们。

    重要

    此步骤对于被配置为在多个节点之间实现高可用性的服务可以维护正常运行,但可能会导致不具有高可用性的服务停机。

    运行以下命令重启集群中的所有 pod:

    $ oc adm reboot-machine-config-pool mcp/worker mcp/master
  12. 运行以下命令监控重启和更新进程:

    $ oc adm wait-for-node-reboot nodes --all

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All nodes rebooted
  13. 运行以下命令监控更新进度:

    $ oc adm wait-for-stable-cluster

    这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:

    All clusteroperators are stable
  14. 运行以下命令,将组合的 keys.json 文件替换为在云供应商中更新的 keys.json 文件。

    $ az storage blob upload \
      --overwrite \
      --account-name ${AZURE_STORAGE_ACCOUNT} \
      --container-name ${AZURE_STORAGE_CONTAINER} \
      --name 'openid/v1/jwks' \
      -f ${TEMPDIR}/jwks.new.json

10.1.4. 轮转 IBM Cloud 凭证

您可以为现有服务 ID 轮转 API 密钥,并更新对应的 secret。

先决条件

  • 您已配置了 ccoctl 工具。
  • 已安装 live OpenShift Container Platform 集群中现有的服务 ID。

流程

  • 运行以下命令,使用 ccoctl 工具轮转服务 ID 的 API 密钥并更新 secret:

    $ ccoctl <provider_name> refresh-keys \
    1
    
        --kubeconfig <openshift_kubeconfig_file> \
    2
    
        --credentials-requests-dir <path_to_credential_requests_directory> \
    3
    
        --name <name> 
    4
    1
    供应商的名称。例如:ibmcloudpowervs
    2
    与集群关联的 kubeconfig 文件。例如,<installation_directory>/auth/kubeconfig.
    3
    存储了凭据请求的目录。
    4
    OpenShift Container Platform 集群的名称。
    注意

    如果您的集群使用 TechPreviewNoUpgrade 功能集启用的技术预览功能,则必须包含 --enable-tech-preview 参数。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部