2.8. 使用短期凭证验证 pod
有些 OpenShift Container Platform 集群 对集群外创建和管理的独立组件使用短期安全凭证。这些集群上的客户工作负载中的应用程序可以使用集群使用的短期身份验证方法进行身份验证。
2.8.1. 为工作负载配置短期身份验证
要在应用程序中使用此验证方法,您必须完成以下步骤:
- 在云供应商的 Identity and Access Management (IAM)设置中创建一个联邦身份服务帐户。
- 创建 OpenShift Container Platform 服务帐户,用于模拟云供应商的服务帐户。
- 配置与应用程序相关的任何工作负载,以使用 OpenShift Container Platform 服务帐户。
2.8.1.1. 环境和用户访问权限要求
要配置这个验证方法,您必须满足以下要求:
- 集群必须使用 短期安全凭证。
-
您必须可以使用具有
cluster-admin
角色的用户访问 OpenShift CLI (oc
)。 - 在云供应商控制台中,您必须具有具有特权的用户访问,以管理 Identity and Access Management (IAM)和联邦身份配置。
2.8.2. 为 GCP 上的应用程序配置 GCP Workload Identity 身份验证
要将短期身份验证用于使用 GCP Workload Identity 身份验证的 GCP 集群上的应用程序,您必须完成以下步骤:
创建联邦 GCP 服务帐户
您可以使用 Google Cloud 控制台创建工作负载身份池和供应商,并允许 OpenShift Container Platform 服务帐户模拟 GCP 服务帐户。
先决条件
- 您的 GCP 集群正在运行 OpenShift Container Platform 版本 4.17.4 或更高版本,并使用 GCP Workload Identity。
- 您可以使用具有管理 Identity and Access Management (IAM)和工作负载身份配置权限的用户访问 Google Cloud 控制台。
- 您已创建了用于应用程序的 Google Cloud 项目。
流程
- 在 Google Cloud 项目的 IAM 配置中,识别集群用于 GCP Workload Identity 身份验证的身份池和供应商。
为外部身份授予模拟 GCP 服务帐户的权限。通过这些权限,OpenShift Container Platform 服务帐户可以充当联邦工作负载身份。
如需更多信息,请参阅有关 允许外部工作负载访问 Google Cloud 资源的 GCP 文档。
为 GCP 创建 OpenShift Container Platform 服务帐户
您可以创建一个 OpenShift Container Platform 服务帐户,并注解它来模拟 GCP 服务帐户。
先决条件
- 您的 GCP 集群正在运行 OpenShift Container Platform 版本 4.17.4 或更高版本,并使用 GCP Workload Identity。
- 您已创建了一个联邦 GCP 服务帐户。
-
您可以使用具有
cluster-admin
角色的用户访问 OpenShift CLI (oc
)。 -
您可以使用具有管理 Identity and Access Management (IAM)和工作负载身份配置权限的用户访问 Google Cloud CLI (
gcloud
)。
流程
运行以下命令,创建一个 OpenShift Container Platform 服务帐户以用于 GCP Workload Identity pod 身份验证:
$ oc create serviceaccount <service_account_name>
运行以下命令,使用身份提供程序和 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>"}}}'
将 &
lt;project_number>
; , <identity_pool
> , 和 <identity_provider
> 替换为您的配置的值。注意对于
<project_number
>,请指定 Google Cloud 项目号,而不是项目 ID。运行以下命令,使用 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
格式运行以下命令,注解服务帐户以使用
直接
外部凭证配置注入模式:$ oc patch serviceaccount <service_account_name> -p '{"metadata": {"annotations": {"cloud.google.com/injection-mode": "direct"}}}'
在这个模式中,Workload Identity Federation Webhook 控制器直接生成 GCP 外部凭证配置,并将它们注入 pod。
运行以下命令,使用 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: "app-x@project.iam.googleapis.com" 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
部署通过 GCP Workload Identity 进行身份验证的客户工作负载
要在应用程序中使用短期身份验证,您必须将其相关的 pod 配置为使用 OpenShift Container Platform 服务帐户。使用 OpenShift Container Platform 服务帐户会触发 Webhook 来模拟 pod,以便它们能够模拟 GCP 服务帐户。
以下示例演示了如何部署使用 OpenShift Container Platform 服务帐户的 pod 并验证配置。
先决条件
- 您的 GCP 集群正在运行 OpenShift Container Platform 版本 4.17.4 或更高版本,并使用 GCP Workload Identity。
- 您已创建了一个联邦 GCP 服务帐户。
- 您已为 GCP 创建了一个 OpenShift Container Platform 服务帐户。
流程
要创建使用 GCP Workload Identity 验证的 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 服务帐户的名称。
运行以下命令来应用部署文件:
$ 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
环境变量存在表示使用 GCP Workload Identity 进行身份验证的 pod。要验证其他配置详情,请检查 pod 规格。以下 pod 规格示例显示了 webhook 变异的环境变量和卷字段。
带有
直接
注入模式的 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/app-x@project.iam.gserviceaccount.com: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