×

某些 OpenShift Container Platform 集群使用 短期安全凭证用于在集群外部创建和管理的各个组件。这些集群上的客户工作负载中的应用程序可以使用集群使用的短期身份验证方法进行身份验证。

为工作负载配置短期身份验证

要在应用程序中使用此身份验证方法,您必须完成以下步骤:

  1. 在云提供商的标识和访问管理 (IAM) 设置中创建一个联合身份服务帐户。

  2. 创建一个 OpenShift Container Platform 服务帐户,该帐户可以模拟云提供商的服务帐户。

  3. 配置与您的应用程序相关的任何工作负载以使用 OpenShift Container Platform 服务帐户。

环境和用户访问要求

要配置此身份验证方法,您必须满足以下要求:

  • 您的集群必须使用 短期安全凭证

  • 您必须以具有 `cluster-admin` 角色的用户身份访问 OpenShift CLI (`oc`)。

  • 在您的云提供商控制台中,您必须具有访问权限,该权限是具有管理标识和访问管理 (IAM) 和联合身份配置的特权的用户。

为 GCP 上的应用程序配置 GCP 工作负载身份验证

要对使用 GCP 工作负载身份验证的 GCP 集群上的应用程序使用短期身份验证,您必须完成以下步骤:

创建联合 GCP 服务帐户

您可以使用 Google Cloud 控制台创建一个工作负载身份池和提供程序,并允许 OpenShift Container Platform 服务帐户模拟 GCP 服务帐户。

先决条件
  • 您的 GCP 集群运行的是 OpenShift Container Platform 4.17.4 或更高版本,并使用 GCP 工作负载身份。

  • 您可以作为具有管理身份和访问管理 (IAM) 和工作负载身份配置权限的用户访问 Google Cloud 控制台。

  • 您已创建了一个 Google Cloud 项目来与您的应用程序一起使用。

步骤
  1. 在 Google Cloud 项目的 IAM 配置中,确定集群用于 GCP 工作负载身份验证的身份池和提供程序。

  2. 授予外部身份模拟 GCP 服务帐户的权限。使用这些权限,OpenShift Container Platform 服务帐户可以作为联合工作负载身份工作。

    有关更多信息,请参阅关于允许您的外部工作负载访问 Google Cloud 资源的 GCP 文档。

为 GCP 创建 OpenShift Container Platform 服务帐户

您可以创建一个 OpenShift Container Platform 服务帐户并对其进行注释以模拟 GCP 服务帐户。

先决条件
  • 您的 GCP 集群运行的是 OpenShift Container Platform 4.17.4 或更高版本,并使用 GCP 工作负载身份。

  • 您已创建联合 GCP 服务帐户。

  • 您可以作为具有 `cluster-admin` 角色的用户访问 OpenShift CLI (oc)。

  • 您可以作为具有管理身份和访问管理 (IAM) 和工作负载身份配置权限的用户访问 Google Cloud CLI (gcloud)。

步骤
  1. 通过运行以下命令创建用于 GCP 工作负载身份 Pod 身份验证的 OpenShift Container Platform 服务帐户:

    $ oc create serviceaccount <service_account_name>
  2. 通过运行以下命令使用身份提供程序和 GCP 服务帐户注释服务帐户:

    $ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/workload-identity-provider": "projects/<project_number>/locations/global/workloadIdentityPools/<identity_pool>/providers/<identity_provider>"}}}'

    <project_number><identity_pool><identity_provider> 替换为您的配置值。

    对于<project_number>,请指定 Google Cloud 项目编号,而不是项目 ID。

  3. 通过运行以下命令使用 GCP 服务帐户的电子邮件地址注释服务帐户:

    $ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/service-account-email": "<service_account_email>"}}}'

    <service_account_email>替换为 GCP 服务帐户的电子邮件地址。

    GCP 服务帐户电子邮件地址通常使用格式<service_account_name>@<project_id>.iam.gserviceaccount.com

  4. 通过运行以下命令注释服务帐户以使用direct外部凭据配置注入模式:

    $ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/injection-mode": "direct"}}}'

    在此模式下,工作负载身份联合 Webhook 控制器直接生成 GCP 外部凭据配置并将其注入 Pod 中。

  5. 使用 Google Cloud CLI (gcloud) 通过运行以下命令指定工作负载的权限:

    $ gcloud projects add-iam-policy-binding <project_id> --member "<service_account_email>" --role "projects/<project_id>/roles/<role_for_workload_permissions>"

    <role_for_workload_permissions>替换为工作负载的角色。指定授予工作负载所需权限的角色。

验证
  • 要验证服务帐户配置,请通过运行以下命令检查ServiceAccount清单:

    $ oc get serviceaccount <service_account_name>

    在以下示例中,service-a/app-x OpenShift Container Platform 服务帐户可以模拟名为app-x的 GCP 服务帐户。

    示例输出
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: app-x
      namespace: service-a
      annotations:
        cloud.google.com/workload-identity-provider: "projects/<project_number>/locations/global/workloadIdentityPools/<identity_pool>/providers/<identity_provider>" (1)
        cloud.google.com/service-account-email: "[email protected]"
        cloud.google.com/audience: "sts.googleapis.com" (2)
        cloud.google.com/token-expiration: "86400" (3)
        cloud.google.com/gcloud-run-as-user: "1000"
        cloud.google.com/injection-mode: "direct" (4)
    1 集群服务帐户的工作负载身份提供程序。
    2 工作负载身份提供程序的允许的受众。
    3 令牌过期时间段(秒)。
    4 direct外部凭据配置注入模式。

部署使用 GCP 工作负载身份进行身份验证的客户工作负载

要在您的应用程序中使用短期身份验证,您必须将其相关的 Pod 配置为使用 OpenShift Container Platform 服务帐户。使用 OpenShift Container Platform 服务帐户会触发 Webhook 来更改 Pod,以便它们可以模拟 GCP 服务帐户。

以下示例演示如何部署使用 OpenShift Container Platform 服务帐户并验证配置的 Pod。

先决条件
  • 您的 GCP 集群运行的是 OpenShift Container Platform 4.17.4 或更高版本,并使用 GCP 工作负载身份。

  • 您已创建联合 GCP 服务帐户。

  • 您已为 GCP 创建了一个 OpenShift Container Platform 服务帐户。

步骤
  1. 要创建使用 GCP 工作负载身份进行身份验证的 Pod,请创建一个类似于以下示例的部署 YAML 文件:

    示例部署
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ubi9
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ubi9
      template:
        metadata:
          labels:
            app: ubi9
        spec:
          serviceAccountName: "<service_account_name>" (1)
          containers:
            - name: ubi
              image: 'registry.access.redhat.com/ubi9/ubi-micro:latest'
              command:
                - /bin/sh
                - '-c'
                - |
                  sleep infinity
    1 指定 OpenShift Container Platform 服务帐户的名称。
  2. 通过运行以下命令应用部署文件:

    $ oc apply -f deployment.yaml
验证
  • 要验证 Pod 是否正在使用短期身份验证,请运行以下命令:

    $ oc get pods -o json | jq -r '.items[0].spec.containers[0].env[] | select(.name=="GOOGLE_APPLICATION_CREDENTIALS")'
    示例输出
    {   "name": "GOOGLE_APPLICATION_CREDENTIALS",   "value": "/var/run/secrets/workload-identity/federation.json" }

    GOOGLE_APPLICATION_CREDENTIALS环境变量的存在表明 Pod 使用 GCP 工作负载身份进行身份验证。

  • 要验证其他配置详细信息,请检查 Pod 规范。以下示例 Pod 规范显示了 Webhook 更改的环境变量和卷字段。

    使用direct注入模式的示例 Pod 规范
    apiVersion: v1
    kind: Pod
    metadata:
      name: app-x-pod
      namespace: service-a
    annotations:
      cloud.google.com/skip-containers: "init-first,sidecar"
      cloud.google.com/external-credentials-json: |- (1)
        {
          "type": "external_account",
          "audience": "//iam.googleapis.com/projects/<project_number>/locations/global/workloadIdentityPools/on-prem-kubernetes/providers/<identity_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/[email protected]:generateAccessToken",
          "credential_source": {
            "file": "/var/run/secrets/sts.googleapis.com/serviceaccount/token",
            "format": {
              "type": "text"
            }
          }
        }
    spec:
      serviceAccountName: app-x
      initContainers:
      - name: init-first
        image: container-image:version
      containers:
      - name: sidecar
        image: container-image:version
      - name: container-name
        image: container-image:version
        env: (2)
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/gcloud/config/federation.json
        - name: CLOUDSDK_COMPUTE_REGION
          value: asia-northeast1
        volumeMounts:
        - name: gcp-iam-token
          readOnly: true
          mountPath: /var/run/secrets/sts.googleapis.com/serviceaccount
        - mountPath: /var/run/secrets/gcloud/config
          name: external-credential-config
          readOnly: true
      volumes:
      - name: gcp-iam-token
        projected:
          sources:
          - serviceAccountToken:
              audience: sts.googleapis.com
              expirationSeconds: 86400
              path: token
      - downwardAPI:
          defaultMode: 288
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.annotations['cloud.google.com/external-credentials-json']
            path: federation.json
        name: external-credential-config
    1 Webhook 控制器生成的外部凭据配置。Kubernetes downwardAPI 将配置安装到容器文件系统中。
    2 用于基于令牌的身份验证的 Webhook 注入的环境变量。