$ ccoctl <provider_name> refresh-keys \ (1)
--kubeconfig <openshift_kubeconfig_file> \ (2)
--credentials-requests-dir <path_to_credential_requests_directory> \ (3)
--name <name> (4)
安装 OpenShift Container Platform 后,某些组织需要轮换或删除在初始安装期间使用的云提供商凭据。
要允许集群使用新凭据,必须更新 云凭据操作符 (CCO) 用于管理云提供商凭据的密钥。
云凭据操作符 (CCO) 实用程序 ccoctl
支持更新在 IBM Cloud® 上安装的集群的密钥。
您可以轮换现有服务 ID 的 API 密钥并更新相应的密钥。
您已配置 ccoctl
二进制文件。
您在已安装的实时 OpenShift Container Platform 集群中拥有现有服务 ID。
使用 ccoctl
实用程序轮换服务 ID 的 API 密钥并更新密钥
$ ccoctl <provider_name> refresh-keys \ (1)
--kubeconfig <openshift_kubeconfig_file> \ (2)
--credentials-requests-dir <path_to_credential_requests_directory> \ (3)
--name <name> (4)
1 | 提供程序的名称。例如:ibmcloud 或 powervs 。 |
2 | 与集群关联的 kubeconfig 文件。例如,<安装目录>/auth/kubeconfig 。 |
3 | 存储凭据请求的目录。 |
4 | OpenShift Container Platform 集群的名称。 |
如果您的集群使用由 |
如果由于任何原因更改了您的云提供商凭据,则必须手动更新云凭据操作符 (CCO) 用于管理云提供商凭据的密钥。
轮换云凭据的过程取决于 CCO 配置为使用的模式。轮换使用 mint 模式运行的集群的凭据后,必须手动删除由已删除凭据创建的组件凭据。
您的集群安装在支持使用您正在使用的 CCO 模式手动轮换云凭据的平台上
对于 mint 模式,支持 Amazon Web Services (AWS) 和 Google Cloud Platform (GCP)。
对于直通模式,支持 Amazon Web Services (AWS)、Microsoft Azure、Google Cloud Platform (GCP)、Red Hat OpenStack Platform (RHOSP) 和 VMware vSphere。
您已更改用于与云提供商交互的凭据。
新凭据对您集群中 CCO 配置为使用的模式具有足够的权限。
在 Web 控制台的**管理员**视角中,导航到**工作负载** → **密钥**。
在Secrets页面上的表格中,找到您的云提供商的根密钥。
平台 | 密钥名称 |
---|---|
AWS |
|
Azure |
|
GCP |
|
RHOSP |
|
VMware vSphere |
|
点击密钥所在行的选项菜单 并选择编辑密钥。
记录值字段的内容。您可以使用此信息来验证更新凭据后值是否不同。
使用云提供商的新身份验证信息更新值字段中的文本,然后单击保存。
如果您正在更新未启用 vSphere CSI Driver Operator 的 vSphere 集群的凭据,则必须强制重新部署 Kubernetes 控制器管理器以应用更新的凭据。
如果启用了 vSphere CSI Driver Operator,则无需执行此步骤。 |
要应用更新的 vSphere 凭据,请以具有cluster-admin
角色的用户身份登录到 OpenShift Container Platform CLI 并运行以下命令
$ oc patch kubecontrollermanager cluster \
-p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date )"'"}}' \
--type=merge
在凭据推出期间,Kubernetes 控制器管理器操作员的状态报告Progressing=true
。要查看状态,请运行以下命令
$ oc get co kube-controller-manager
如果您的集群的 CCO 配置为使用 mint 模式,请删除各个CredentialsRequest
对象引用的每个组件密钥。
以具有cluster-admin
角色的用户身份登录到 OpenShift Container Platform CLI。
获取所有引用的组件密钥的名称和命名空间
$ oc -n openshift-cloud-credential-operator get CredentialsRequest \
-o json | jq -r '.items[] | select (.spec.providerSpec.kind=="<provider_spec>") | .spec.secretRef'
其中<provider_spec>
是您的云提供商的相应值
AWS:AWSProviderSpec
GCP:GCPProviderSpec
{
"name": "ebs-cloud-credentials",
"namespace": "openshift-cluster-csi-drivers"
}
{
"name": "cloud-credential-operator-iam-ro-creds",
"namespace": "openshift-cloud-credential-operator"
}
删除每个引用的组件密钥
$ oc delete secret <secret_name> \(1)
-n <secret_namespace> (2)
1 | 指定密钥的名称。 |
2 | 指定包含密钥的命名空间。 |
$ oc delete secret ebs-cloud-credentials -n openshift-cluster-csi-drivers
您不需要手动从您的提供商控制台中删除凭据。删除引用的组件密钥将导致 CCO 从平台删除现有凭据并创建新的凭据。
要验证凭据是否已更改
在 Web 控制台的**管理员**视角中,导航到**工作负载** → **密钥**。
验证值字段的内容是否已更改。
对于使用 mint 模式的云凭据操作员 (CCO) 的集群,管理员级凭据存储在kube-system
命名空间中。CCO 使用admin
凭据来处理集群中的CredentialsRequest
对象并为具有有限权限的组件创建用户。
在使用 mint 模式的 CCO 安装 OpenShift Container Platform 集群后,您可以从集群中的kube-system
命名空间中删除管理员级凭据密钥。CCO 仅在需要协调新的或修改的CredentialsRequest
自定义资源(例如次要集群版本更新)的更改期间才需要管理员级凭据。
在执行次要版本集群更新(例如,从 OpenShift Container Platform 4.16 更新到 4.17)之前,必须使用管理员级凭据重新安装凭据密钥。如果凭据不存在,则更新可能会被阻止。 |
您的集群安装在支持从 CCO 中删除云凭据的平台上。支持的平台是 AWS 和 GCP。
在 Web 控制台的**管理员**视角中,导航到**工作负载** → **密钥**。
在Secrets页面上的表格中,找到您的云提供商的根密钥。
平台 | 密钥名称 |
---|---|
AWS |
|
GCP |
|
点击密钥所在行的选项菜单 并选择删除密钥。
安装 Microsoft Azure OpenShift Container Platform 集群后,您可以启用 Microsoft Entra Workload ID 以使用短期凭据。
要配置现有集群以从集群外部创建和管理云凭据,请提取并准备云凭据操作员实用程序 (ccoctl
) 二进制文件。
|
您可以访问具有集群管理员访问权限的 OpenShift Container Platform 帐户。
您已安装 OpenShift CLI (oc
)。
通过运行以下命令为 OpenShift Container Platform 发行版映像设置变量
$ RELEASE_IMAGE=$(oc get clusterversion -o jsonpath={..desired.image})
通过运行以下命令从 OpenShift Container Platform 发行版映像中获取 CCO 容器映像
$ CCO_IMAGE=$(oc adm release info --image-for='cloud-credential-operator' $RELEASE_IMAGE -a ~/.pull-secret)
确保 |
通过运行以下命令从 OpenShift Container Platform 发行版映像中的 CCO 容器映像中提取ccoctl
二进制文件
$ oc image extract $CCO_IMAGE \
--file="/usr/bin/ccoctl.<rhel_version>" \(1)
-a ~/.pull-secret
1 | 对于<rhel_version> ,请指定与主机使用的 Red Hat Enterprise Linux (RHEL) 版本相对应的值。如果未指定值,则默认使用ccoctl.rhel8 。以下值为有效值
|
更改权限以使ccoctl
可执行,方法是运行以下命令
$ chmod 775 ccoctl.<rhel_version>
要验证ccoctl
是否已准备好使用,请显示帮助文件。运行命令时,请使用相对文件名,例如
$ ./ccoctl.rhel9
OpenShift credentials provisioning tool
Usage:
ccoctl [command]
Available Commands:
aws Manage credentials objects for AWS cloud
azure Manage credentials objects for Azure
gcp Manage credentials objects for Google cloud
help Help about any command
ibmcloud Manage credentials objects for {ibm-cloud-title}
nutanix Manage credentials objects for Nutanix
Flags:
-h, --help help for ccoctl
Use "ccoctl [command] --help" for more information about a command.
如果您在安装期间未将 Microsoft Azure OpenShift Container Platform 集群配置为使用 Microsoft Entra Workload ID,则可以在现有集群上启用此身份验证方法。
在现有集群上启用 Workload ID 的过程具有破坏性,并且需要大量时间。在继续之前,请注意以下事项
|
您已在 Microsoft Azure 上安装了 OpenShift Container Platform 集群。
您可以使用具有cluster-admin
权限的帐户访问集群。
您已安装 OpenShift CLI (oc
)。
您已提取并准备了 Cloud Credential Operator 实用程序 (ccoctl
) 二进制文件。
您可以使用 Azure CLI (az
) 访问您的 Azure 帐户。
为ccoctl
实用程序生成的清单创建一个输出目录。此过程使用./output_dir
作为示例。
通过运行以下命令,将集群的服务帐户公共签名密钥提取到输出目录
$ oc get configmap \
--namespace openshift-kube-apiserver bound-sa-token-signing-certs \
--output 'go-template={{index .data "service-account-001.pub"}}' > ./output_dir/serviceaccount-signer.public (1)
1 | 此过程使用名为serviceaccount-signer.public 的文件作为示例。 |
使用提取的服务帐户公共签名密钥,通过运行以下命令创建 OpenID Connect (OIDC) 发行者和具有 OIDC 配置文件的 Azure Blob 存储容器
$ ./ccoctl azure create-oidc-issuer \
--name <azure_infra_name> \(1)
--output-dir ./output_dir \
--region <azure_region> \(2)
--subscription-id <azure_subscription_id> \(3)
--tenant-id <azure_tenant_id> \
--public-key-file ./output_dir/serviceaccount-signer.public (4)
1 | name 参数的值用于创建 Azure 资源组。要使用现有 Azure 资源组而不是创建新的资源组,请使用现有组名指定--oidc-resource-group-name 参数。 |
2 | 指定现有集群的区域。 |
3 | 指定现有集群的订阅 ID。 |
4 | 指定包含集群的服务帐户公共签名密钥的文件。 |
通过运行以下命令,验证 Azure Pod 身份 Webhook 的配置文件是否已创建
$ ll ./output_dir/manifests
total 8
-rw-------. 1 cloud-user cloud-user 193 May 22 02:29 azure-ad-pod-identity-webhook-config.yaml (1)
-rw-------. 1 cloud-user cloud-user 165 May 22 02:29 cluster-authentication-02-config.yaml
1 | 文件azure-ad-pod-identity-webhook-config.yaml 包含 Azure Pod 身份 Webhook 配置。 |
通过运行以下命令,使用从输出目录中的生成的清单中获取的 OIDC 发行者 URL 设置OIDC_ISSUER_URL
变量
$ OIDC_ISSUER_URL=`awk '/serviceAccountIssuer/ { print $2 }' ./output_dir/manifests/cluster-authentication-02-config.yaml`
通过运行以下命令,更新集群authentication
配置的spec.serviceAccountIssuer
参数
$ oc patch authentication cluster \
--type=merge \
-p "{\"spec\":{\"serviceAccountIssuer\":\"${OIDC_ISSUER_URL}\"}}"
通过运行以下命令监控配置更新进度
$ oc adm wait-for-stable-cluster
此过程可能需要 15 分钟或更长时间。以下输出表示该过程已完成
All clusteroperators are stable
通过运行以下命令重新启动集群中的所有 Pod
$ oc adm reboot-machine-config-pool mcp/worker mcp/master
重新启动 Pod 会更新serviceAccountIssuer
字段并刷新服务帐户公共签名密钥。
通过运行以下命令监控重新启动和更新过程
$ oc adm wait-for-node-reboot nodes --all
此过程可能需要 15 分钟或更长时间。以下输出表示该过程已完成
All nodes rebooted
通过运行以下命令将 Cloud Credential Operator 的spec.credentialsMode
参数更新为Manual
$ oc patch cloudcredential cluster \
--type=merge \
--patch '{"spec":{"credentialsMode":"Manual"}}'
通过运行以下命令从 OpenShift Container Platform 发行版镜像中提取CredentialsRequest
对象的列表
$ oc adm release extract \
--credentials-requests \
--included \
--to <path_to_directory_for_credentials_requests> \
--registry-config ~/.pull-secret
此命令可能需要几分钟才能运行。 |
通过运行以下命令,使用 Azure 资源组名称设置AZURE_INSTALL_RG
变量
$ AZURE_INSTALL_RG=`oc get infrastructure cluster -o jsonpath --template '{ .status.platformStatus.azure.resourceGroupName }'`
使用ccoctl
实用程序为所有CredentialsRequest
对象创建托管身份,方法是运行以下命令
$ ccoctl azure create-managed-identities \
--name <azure_infra_name> \
--output-dir ./output_dir \
--region <azure_region> \
--subscription-id <azure_subscription_id> \
--credentials-requests-dir <path_to_directory_for_credentials_requests> \
--issuer-url "${OIDC_ISSUER_URL}" \
--dnszone-resource-group-name <azure_dns_zone_resourcegroup_name> \(1)
--installation-resource-group-name "${AZURE_INSTALL_RG}"
1 | 指定包含 DNS 区域的资源组的名称。 |
通过运行以下命令应用用于工作负载 ID 的 Azure Pod 身份 Webhook 配置
$ oc apply -f ./output_dir/manifests/azure-ad-pod-identity-webhook-config.yaml
通过运行以下命令应用ccoctl
实用程序生成的密钥
$ find ./output_dir/manifests -iname "openshift*yaml" -print0 | xargs -I {} -0 -t oc replace -f {}
此过程可能需要几分钟。
通过运行以下命令重新启动集群中的所有 Pod
$ oc adm reboot-machine-config-pool mcp/worker mcp/master
重新启动 Pod 会更新serviceAccountIssuer
字段并刷新服务帐户公共签名密钥。
通过运行以下命令监控重新启动和更新过程
$ oc adm wait-for-node-reboot nodes --all
此过程可能需要 15 分钟或更长时间。以下输出表示该过程已完成
All nodes rebooted
通过运行以下命令监控配置更新进度
$ oc adm wait-for-stable-cluster
此过程可能需要 15 分钟或更长时间。以下输出表示该过程已完成
All clusteroperators are stable
可选:通过运行以下命令删除 Azure 根凭据密钥
$ oc delete secret -n kube-system azure-credentials
您可以通过检查 Cloud Credential Operator (CCO) 配置和集群中的其他值来验证集群是否为各个组件使用短期安全凭据。
您使用 Cloud Credential Operator 实用程序 (ccoctl
) 部署了 OpenShift Container Platform 集群以实现短期凭据。
您已安装 OpenShift CLI (oc
)。
您已以具有cluster-admin
权限的用户身份登录。
通过运行以下命令验证 CCO 是否配置为以手动模式运行
$ oc get cloudcredentials cluster \
-o=jsonpath={.spec.credentialsMode}
以下输出确认 CCO 正在手动模式下运行
Manual
通过运行以下命令验证集群是否没有root
凭据
$ oc get secrets \
-n kube-system <secret_name>
其中<secret_name>
是您云提供商的根密钥的名称。
平台 | 密钥名称 |
---|---|
Amazon Web Services (AWS) |
|
Microsoft Azure |
|
Google Cloud Platform (GCP) |
|
错误确认集群中不存在根密钥。
Error from server (NotFound): secrets "aws-creds" not found
通过运行以下命令验证组件是否正在为各个组件使用短期安全凭据
$ oc get authentication cluster \
-o jsonpath \
--template='{ .spec.serviceAccountIssuer }'
此命令显示集群Authentication
对象中.spec.serviceAccountIssuer
参数的值。与您的云提供商关联的 URL 的输出表示集群正在使用手动模式以及从集群外部创建和管理的短期凭据。
Azure 集群:通过运行以下命令验证组件是否正在假定密钥清单中指定的 Azure 客户端 ID
$ oc get secrets \
-n openshift-image-registry installer-cloud-credentials \
-o jsonpath='{.data}'
包含azure_client_id
和azure_federated_token_file
字段的输出确认组件正在假定 Azure 客户端 ID。
Azure 集群:通过运行以下命令验证 Pod 身份 Webhook 是否正在运行
$ oc get pods \
-n openshift-cloud-credential-operator
NAME READY STATUS RESTARTS AGE
cloud-credential-operator-59cf744f78-r8pbq 2/2 Running 2 71m
pod-identity-webhook-548f977b4c-859lz 1/1 Running 1 70m