第 10 章 更改云供应商凭证配置
对于支持的配置,您可以更改 OpenShift Container Platform 与云供应商进行身份验证的方式。
要确定集群使用哪个云凭证策略,请参阅 确定 Cloud Credential Operator 模式。
10.1. 使用 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
流程
配置以下环境变量:
INFRA_ID=$(oc get infrastructures cluster -o jsonpath='{.status.infrastructureName}') CLUSTER_NAME=${INFRA_ID%-*}1 注意您的集群可能与本例不同,资源名称可能无法与集群名称相同。确保为集群指定正确的相应资源名称。
对于将 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 集群,请完成以下步骤:
运行以下命令提取公共 CloudFront 发布 URL:
$ basename $(oc get authentication cluster -o jsonpath={'.spec.serviceAccountIssuer'} )输出示例
<subdomain>.cloudfront.net其中
<subdomain>是一个由字母数字组成的字符串。运行以下命令来确定私有 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 存储桶名称。配置以下环境变量:
AWS_BUCKET=$<s3_bucket>其中
<s3_bucket>是集群的私有 S3 存储桶名称。
运行以下命令,创建一个临时目录来使用并为它分配一个环境变量:
$ TEMPDIR=$(mktemp -d)要让 Kubernetes API 服务器创建新的绑定服务帐户签名密钥,您需要删除下一个绑定服务帐户签名密钥。
重要完成此步骤后,Kubernetes API 服务器开始推出新密钥。要降低身份验证失败的风险,请尽快完成剩余的步骤。剩余的步骤可能会对工作负载造成破坏。
准备就绪后,运行以下命令来删除下一个绑定服务帐户签名密钥:
$ oc delete secrets/next-bound-service-account-signing-key \ -n openshift-kube-apiserver-operator运行以下命令,从 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运行以下命令,使用公钥创建一个
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-14 运行以下命令来重命名
keys.json文件:$ cp ${TEMPDIR}/<number>-keys.json ${TEMPDIR}/jwks.new.json其中
<number>是一个两位数字的值,具体因您的环境而异。运行以下命令,从云供应商下载现有的
key.json文件:$ aws s3api get-object \ --bucket ${AWS_BUCKET} \ --key keys.json ${TEMPDIR}/jwks.current.json运行以下命令组合两个
keys.json文件:$ jq -s '{ keys: map(.keys[])}' ${TEMPDIR}/jwks.current.json ${TEMPDIR}/jwks.new.json > ${TEMPDIR}/jwks.combined.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.combined.json等待 Kubernetes API 服务器更新并使用新密钥。您可以运行以下命令来监控更新进度:
$ oc adm wait-for-stable-cluster这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All clusteroperators are stable为确保集群中的所有 pod 使用新密钥,您必须重启它们。
重要此步骤对于被配置为在多个节点之间实现高可用性的服务可以维护正常运行,但可能会导致不具有高可用性的服务停机。
运行以下命令重启集群中的所有 pod:
$ oc adm reboot-machine-config-pool mcp/worker mcp/master运行以下命令监控重启和更新进程:
$ oc adm wait-for-node-reboot nodes --all这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All nodes rebooted运行以下命令监控更新进度:
$ oc adm wait-for-stable-cluster这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All clusteroperators are stable运行以下命令,将组合的
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
10.1.2. 轮转 Google Cloud OIDC 绑定服务帐户签名者密钥 复制链接链接已复制到粘贴板!
如果 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
流程
配置以下环境变量:
CURRENT_ISSUER=$(oc get authentication cluster -o jsonpath='{.spec.serviceAccountIssuer}') GCP_BUCKET=$(echo ${CURRENT_ISSUER} | cut -d "/" -f4)注意您的集群可能与本例不同,资源名称可能无法与集群名称相同。确保为集群指定正确的相应资源名称。
运行以下命令,创建一个临时目录来使用并为它分配一个环境变量:
$ TEMPDIR=$(mktemp -d)要让 Kubernetes API 服务器创建新的绑定服务帐户签名密钥,您需要删除下一个绑定服务帐户签名密钥。
重要完成此步骤后,Kubernetes API 服务器开始推出新密钥。要降低身份验证失败的风险,请尽快完成剩余的步骤。剩余的步骤可能会对工作负载造成破坏。
准备就绪后,运行以下命令来删除下一个绑定服务帐户签名密钥:
$ oc delete secrets/next-bound-service-account-signing-key \ -n openshift-kube-apiserver-operator运行以下命令,从 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运行以下命令,使用公钥创建一个
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运行以下命令来重命名
keys.json文件:$ cp ${TEMPDIR}/<number>-keys.json ${TEMPDIR}/jwks.new.json其中
<number>是一个两位数字的值,具体因您的环境而异。运行以下命令,从云供应商下载现有的
key.json文件:$ gcloud storage cp gs://${GCP_BUCKET}/keys.json ${TEMPDIR}/jwks.current.json运行以下命令组合两个
keys.json文件:$ jq -s '{ keys: map(.keys[])}' ${TEMPDIR}/jwks.current.json ${TEMPDIR}/jwks.new.json > ${TEMPDIR}/jwks.combined.json要在轮转过程中为旧密钥和新密钥启用身份验证,请运行以下命令将组合的
keys.json文件上传到云供应商:$ gcloud storage cp ${TEMPDIR}/jwks.combined.json gs://${GCP_BUCKET}/keys.json等待 Kubernetes API 服务器更新并使用新密钥。您可以运行以下命令来监控更新进度:
$ oc adm wait-for-stable-cluster这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All clusteroperators are stable为确保集群中的所有 pod 使用新密钥,您必须重启它们。
重要此步骤对于被配置为在多个节点之间实现高可用性的服务可以维护正常运行,但可能会导致不具有高可用性的服务停机。
运行以下命令重启集群中的所有 pod:
$ oc adm reboot-machine-config-pool mcp/worker mcp/master运行以下命令监控重启和更新进程:
$ oc adm wait-for-node-reboot nodes --all这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All nodes rebooted运行以下命令监控更新进度:
$ oc adm wait-for-stable-cluster这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All clusteroperators are stable运行以下命令,将组合的
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
流程
配置以下环境变量:
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)注意您的集群可能与本例不同,资源名称可能无法与集群名称相同。确保为集群指定正确的相应资源名称。
运行以下命令,创建一个临时目录来使用并为它分配一个环境变量:
$ TEMPDIR=$(mktemp -d)要让 Kubernetes API 服务器创建新的绑定服务帐户签名密钥,您需要删除下一个绑定服务帐户签名密钥。
重要完成此步骤后,Kubernetes API 服务器开始推出新密钥。要降低身份验证失败的风险,请尽快完成剩余的步骤。剩余的步骤可能会对工作负载造成破坏。
准备就绪后,运行以下命令来删除下一个绑定服务帐户签名密钥:
$ oc delete secrets/next-bound-service-account-signing-key \ -n openshift-kube-apiserver-operator运行以下命令,从 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运行以下命令,使用公钥创建一个
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-15 运行以下命令来重命名
keys.json文件:$ cp ${TEMPDIR}/<number>-keys.json ${TEMPDIR}/jwks.new.json其中
<number>是一个两位数字的值,具体因您的环境而异。运行以下命令,从云供应商下载现有的
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运行以下命令组合两个
keys.json文件:$ jq -s '{ keys: map(.keys[])}' ${TEMPDIR}/jwks.current.json ${TEMPDIR}/jwks.new.json > ${TEMPDIR}/jwks.combined.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.combined.json等待 Kubernetes API 服务器更新并使用新密钥。您可以运行以下命令来监控更新进度:
$ oc adm wait-for-stable-cluster这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All clusteroperators are stable为确保集群中的所有 pod 使用新密钥,您必须重启它们。
重要此步骤对于被配置为在多个节点之间实现高可用性的服务可以维护正常运行,但可能会导致不具有高可用性的服务停机。
运行以下命令重启集群中的所有 pod:
$ oc adm reboot-machine-config-pool mcp/worker mcp/master运行以下命令监控重启和更新进程:
$ oc adm wait-for-node-reboot nodes --all这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All nodes rebooted运行以下命令监控更新进度:
$ oc adm wait-for-stable-cluster这个过程可能需要 15 分钟或更长时间。以下输出表示进程已完成:
All clusteroperators are stable运行以下命令,将组合的
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 注意如果您的集群使用
TechPreviewNoUpgrade功能集启用的技术预览功能,则必须包含--enable-tech-preview参数。