×

轮换或删除云提供商凭据

安装 OpenShift Container Platform 后,某些组织需要轮换或删除在初始安装期间使用的云提供商凭据。

要允许集群使用新凭据,必须更新 云凭据操作符 (CCO) 用于管理云提供商凭据的密钥。

使用云凭据操作符实用程序轮换云提供商凭据

云凭据操作符 (CCO) 实用程序 ccoctl 支持更新在 IBM Cloud® 上安装的集群的密钥。

轮换 API 密钥

您可以轮换现有服务 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 提供程序的名称。例如:ibmcloudpowervs
    2 与集群关联的 kubeconfig 文件。例如,<安装目录>/auth/kubeconfig
    3 存储凭据请求的目录。
    4 OpenShift Container Platform 集群的名称。

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

手动轮换云提供商凭据

如果由于任何原因更改了您的云提供商凭据,则必须手动更新云凭据操作符 (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 配置为使用的模式具有足够的权限。

步骤
  1. 在 Web 控制台的**管理员**视角中,导航到**工作负载** → **密钥**。

  2. Secrets页面上的表格中,找到您的云提供商的根密钥。

    平台 密钥名称

    AWS

    aws-creds

    Azure

    azure-credentials

    GCP

    gcp-credentials

    RHOSP

    openstack-credentials

    VMware vSphere

    vsphere-creds

  3. 点击密钥所在行的选项菜单 kebab 并选择编辑密钥

  4. 记录字段的内容。您可以使用此信息来验证更新凭据后值是否不同。

  5. 使用云提供商的新身份验证信息更新字段中的文本,然后单击保存

  6. 如果您正在更新未启用 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
  7. 如果您的集群的 CCO 配置为使用 mint 模式,请删除各个CredentialsRequest对象引用的每个组件密钥。

    1. 以具有cluster-admin角色的用户身份登录到 OpenShift Container Platform CLI。

    2. 获取所有引用的组件密钥的名称和命名空间

      $ 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

      AWS 的部分示例输出
      {
        "name": "ebs-cloud-credentials",
        "namespace": "openshift-cluster-csi-drivers"
      }
      {
        "name": "cloud-credential-operator-iam-ro-creds",
        "namespace": "openshift-cloud-credential-operator"
      }
    3. 删除每个引用的组件密钥

      $ oc delete secret <secret_name> \(1)
        -n <secret_namespace> (2)
      1 指定密钥的名称。
      2 指定包含密钥的命名空间。
      AWS 密钥删除示例
      $ oc delete secret ebs-cloud-credentials -n openshift-cluster-csi-drivers

      您不需要手动从您的提供商控制台中删除凭据。删除引用的组件密钥将导致 CCO 从平台删除现有凭据并创建新的凭据。

验证

要验证凭据是否已更改

  1. 在 Web 控制台的**管理员**视角中,导航到**工作负载** → **密钥**。

  2. 验证字段的内容是否已更改。

删除云提供商凭据

对于使用 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。

步骤
  1. 在 Web 控制台的**管理员**视角中,导航到**工作负载** → **密钥**。

  2. Secrets页面上的表格中,找到您的云提供商的根密钥。

    平台 密钥名称

    AWS

    aws-creds

    GCP

    gcp-credentials

  3. 点击密钥所在行的选项菜单 kebab 并选择删除密钥

启用基于令牌的身份验证

安装 Microsoft Azure OpenShift Container Platform 集群后,您可以启用 Microsoft Entra Workload ID 以使用短期凭据。

配置云凭据操作员实用程序

要配置现有集群以从集群外部创建和管理云凭据,请提取并准备云凭据操作员实用程序 (ccoctl) 二进制文件。

ccoctl实用程序是一个 Linux 二进制文件,必须在 Linux 环境中运行。

先决条件
  • 您可以访问具有集群管理员访问权限的 OpenShift Container Platform 帐户。

  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 通过运行以下命令为 OpenShift Container Platform 发行版映像设置变量

    $ RELEASE_IMAGE=$(oc get clusterversion -o jsonpath={..desired.image})
  2. 通过运行以下命令从 OpenShift Container Platform 发行版映像中获取 CCO 容器映像

    $ CCO_IMAGE=$(oc adm release info --image-for='cloud-credential-operator' $RELEASE_IMAGE -a ~/.pull-secret)

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

  3. 通过运行以下命令从 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。以下值为有效值
    • rhel8:对于使用 RHEL 8 的主机,请指定此值。

    • rhel9:对于使用 RHEL 9 的主机,请指定此值。

  4. 更改权限以使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 Entra Workload ID

如果您在安装期间未将 Microsoft Azure OpenShift Container Platform 集群配置为使用 Microsoft Entra Workload ID,则可以在现有集群上启用此身份验证方法。

在现有集群上启用 Workload ID 的过程具有破坏性,并且需要大量时间。在继续之前,请注意以下事项

  • 阅读以下步骤,并确保您理解并接受时间要求。确切的时间要求因各个集群而异,但可能至少需要一个小时。

  • 在此过程中,您必须刷新所有服务帐户并重新启动集群上的所有 Pod。这些操作会对工作负载造成破坏。为了减轻这种影响,您可以暂时停止这些服务,然后在集群准备好后重新部署它们。

  • 启动此流程后,请勿尝试更新集群,直至流程完成。如果触发更新,则在现有集群上启用工作负载 ID 的流程将失败。

先决条件
  • 您已在 Microsoft Azure 上安装了 OpenShift Container Platform 集群。

  • 您可以使用具有cluster-admin权限的帐户访问集群。

  • 您已安装 OpenShift CLI (oc)。

  • 您已提取并准备了 Cloud Credential Operator 实用程序 (ccoctl) 二进制文件。

  • 您可以使用 Azure CLI (az) 访问您的 Azure 帐户。

步骤
  1. ccoctl实用程序生成的清单创建一个输出目录。此过程使用./output_dir作为示例。

  2. 通过运行以下命令,将集群的服务帐户公共签名密钥提取到输出目录

    $ 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的文件作为示例。
  3. 使用提取的服务帐户公共签名密钥,通过运行以下命令创建 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 指定包含集群的服务帐户公共签名密钥的文件。
  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 配置。
  5. 通过运行以下命令,使用从输出目录中的生成的清单中获取的 OIDC 发行者 URL 设置OIDC_ISSUER_URL变量

    $ OIDC_ISSUER_URL=`awk '/serviceAccountIssuer/ { print $2 }' ./output_dir/manifests/cluster-authentication-02-config.yaml`
  6. 通过运行以下命令,更新集群authentication配置的spec.serviceAccountIssuer参数

    $ oc patch authentication cluster \
      --type=merge \
      -p "{\"spec\":{\"serviceAccountIssuer\":\"${OIDC_ISSUER_URL}\"}}"
  7. 通过运行以下命令监控配置更新进度

    $ oc adm wait-for-stable-cluster

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

    All clusteroperators are stable
  8. 通过运行以下命令重新启动集群中的所有 Pod

    $ oc adm reboot-machine-config-pool mcp/worker mcp/master

    重新启动 Pod 会更新serviceAccountIssuer字段并刷新服务帐户公共签名密钥。

  9. 通过运行以下命令监控重新启动和更新过程

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

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

    All nodes rebooted
  10. 通过运行以下命令将 Cloud Credential Operator 的spec.credentialsMode参数更新为Manual

    $ oc patch cloudcredential cluster \
      --type=merge \
      --patch '{"spec":{"credentialsMode":"Manual"}}'
  11. 通过运行以下命令从 OpenShift Container Platform 发行版镜像中提取CredentialsRequest对象的列表

    $ oc adm release extract \
      --credentials-requests \
      --included \
      --to <path_to_directory_for_credentials_requests> \
      --registry-config ~/.pull-secret

    此命令可能需要几分钟才能运行。

  12. 通过运行以下命令,使用 Azure 资源组名称设置AZURE_INSTALL_RG变量

    $ AZURE_INSTALL_RG=`oc get infrastructure cluster -o jsonpath --template '{ .status.platformStatus.azure.resourceGroupName }'`
  13. 使用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 区域的资源组的名称。
  14. 通过运行以下命令应用用于工作负载 ID 的 Azure Pod 身份 Webhook 配置

    $ oc apply -f ./output_dir/manifests/azure-ad-pod-identity-webhook-config.yaml
  15. 通过运行以下命令应用ccoctl实用程序生成的密钥

    $ find ./output_dir/manifests -iname "openshift*yaml" -print0 | xargs -I {} -0 -t oc replace -f {}

    此过程可能需要几分钟。

  16. 通过运行以下命令重新启动集群中的所有 Pod

    $ oc adm reboot-machine-config-pool mcp/worker mcp/master

    重新启动 Pod 会更新serviceAccountIssuer字段并刷新服务帐户公共签名密钥。

  17. 通过运行以下命令监控重新启动和更新过程

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

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

    All nodes rebooted
  18. 通过运行以下命令监控配置更新进度

    $ oc adm wait-for-stable-cluster

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

    All clusteroperators are stable
  19. 可选:通过运行以下命令删除 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)

    aws-creds

    Microsoft Azure

    azure-credentials

    Google Cloud Platform (GCP)

    gcp-credentials

    错误确认集群中不存在根密钥。

    AWS 集群的示例输出
    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_idazure_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