9.2. 服务帐户如何在用户定义的项目中假设 AWS IAM 角色
当您在 AWS 集群上安装 Red Hat OpenShift Service 时,默认包含 Pod 身份 Webhook 资源。
您可以使用 pod 身份 Webhook 在用户定义的项目中启用服务帐户,来假定同一项目中的 pod 中的 AWS Identity and Access Management (IAM) 角色。当假定 IAM 角色时,pod 中的服务帐户会提供临时 STS 凭证供 pod 中的服务帐户使用。如果假设角色具有所需的 AWS 权限,则服务帐户可以在 pod 中运行 AWS SDK 操作。
要为 pod 启用 pod 身份 Webhook,您必须在项目中创建带有 eks.amazonaws.com/role-arn
注解的服务帐户。该注解必须引用您要服务帐户假定的 AWS IAM 角色的 Amazon Resource Name (ARN)。您还必须在 Pod
规格中引用服务帐户,并在与服务帐户相同的项目中部署 pod。
用户定义的项目中的 Pod 身份 Webhook 工作流
下图演示了用户定义的项目中的 pod 身份 Webhook 工作流:
图 9.2. 用户定义的项目中的 Pod 身份 Webhook 工作流
工作流有以下阶段:
-
在用户定义的项目中,用户会创建一个包含
eks.amazonaws.com/role-arn
注解的服务帐户。该注解指向您希望服务帐户假定的 AWS IAM 角色的 ARN。 当使用引用注解的服务帐户的配置在同一项目中部署 pod 时,pod 身份 Webhook 会修改 pod。变异会将以下组件注入 pod,而无需在
Pod
或Deployment
资源配置中指定它们:-
一个
$AWS_ARN_ROLE
环境变量,其中包含运行 AWS SDK 操作所需的权限的 IAM 角色的 ARN。 -
一个
$AWS_WEB_IDENTITY_TOKEN_FILE
环境变量,其中包含 pod 中到服务帐户的 OpenID Connect (OIDC)令牌的完整路径。完整路径为/var/run/secrets/eks.amazonaws.com/serviceaccount/token
。 -
挂载到挂载点
/var/run/secrets/eks.amazonaws.com/serviceaccount
处的aws-iam-token
卷。名为token
的 OIDC 令牌文件包含在卷中。
-
一个
OIDC 令牌从 pod 传递给 OIDC 供应商。如果满足以下要求,供应商会验证服务帐户身份:
- 身份签名由私钥有效并签名。
sts.amazonaws.com
使用者列在 OIDC 令牌中,并与 OIDC 供应商中配置的 audience 匹配。注意pod 身份 Webhook 默认将
sts.amazonaws.com
audience 应用到 OIDC 令牌。- OIDC 令牌没有过期。
- 令牌中的 issuer 值包含 OIDC 供应商的 URL。
- 如果项目和服务帐户位于被假定的 IAM 角色的信任策略范围内,则授权会成功。
- 成功身份验证和授权后,会话令牌形式的临时 AWS STS 凭证会被服务帐户传递给 pod,供服务帐户使用。通过使用凭证,服务帐户会临时授予 IAM 角色中启用的 AWS 权限。
- 当您在 pod 中运行 AWS SDK 操作时,服务帐户为 AWS API 提供临时 STS 凭证以验证其身份。