帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
服务账户的 IAM 角色
容器组(pod)的容器中的应用程序可以使用 AWS SDK 或 AWS CLI 以向使用 AWS Identity and Access Management(IAM)权限的 AWS 服务 发出 API 请求。应用程序必须通过 AWS 凭证签署 AWS API 请求。服务账户的 IAM 角色(IRSA)可管理供应用程序使用的凭证,这与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式相似。您可以将 IAM 角色与 Kubernetes 服务账户关联并配置容器组(pod)来使用服务账户,而不是创建 AWS 凭证并将其分配到容器或使用 Amazon EC2 实例的角色。您不能将服务账户的 IAM 角色用于 AWS Outposts 上的 Amazon EKS 本地集群。
服务账户的 IAM 角色提供下列优势:
-
最低权限 – 您可以将 IAM 权限范围限定到服务账户,并且只有使用该服务账户的容器组(pod)可以访问这些权限。此功能还消除了对
kiam
或kube2iam
等第三方解决方案的需求。 -
凭证隔离 – 容器组(pod)的容器只能检索与该容器所使用服务账户关联的 IAM 角色的凭证。容器永远无法访问其他容器组(pod)中其他容器所使用的凭证。在使用服务账户的 IAM 角色时,容器还具有分配给 Amazon EKS 节点 IAM 角色的权限,除非您阻止容器组(pod)访问 Amazon EC2 实例元数据服务(IMDS)。有关更多信息,请参阅限制对分配给 Worker 节点的实例配置文件的访问
。 -
可审核性 – 可通过 AWS CloudTrail 进行访问和事件日志记录以帮助确保可追溯性审核。
通过完成下列步骤为服务账户启用 IAM 角色:
-
为集群创建 IAM OIDC 提供者 – 您只需为集群完成一次此操作。
注意
如果启用了 EKS VPC 端点,则无法从该 VPC 内部访问 EKS OIDC 服务端点。因此,您在 VPC 中使用
eksctl
创建 OIDC 提供者等操作将不起作用,并且在尝试请求https://oidc.eks
时将导致超时。错误消息示例如下:. region
.amazonaws.com.rproxy.goskope.comserver cant find oidc.eks.region.amazonaws.com: NXDOMAIN
要完成此步骤,您可以在 VPC 外部运行该命令,例如在 AWS CloudShell 中或在连接到互联网的计算机上。您也可在 VPC 中创建水平分割条件解析器(例如 Route 53 Resolver),以便为 OIDC 发布者 URL 使用不同的解析器,而不对其使用 VPC DNS。有关 CoreDNS 中条件转发的示例,请参阅 GitHub 上的 Amazon EKS feature request
。 -
将 IAM 角色分配给 Kubernetes 服务账户 – 针对您希望应用程序拥有的每组唯一权限完成此步骤。
-
将容器组(pod)配置为使用 Kubernetes 服务账户 – 为需要访问 AWS 服务的每个 容器组(pod)完成此过程。
-
将 IRSA 与 AWS SDK 结合使用 – 确认工作负载使用支持版本的 AWS SDK,并且工作负载使用默认凭证链。
IAM、Kubernetes 和 OpenID Connect(OIDC)背景信息
2014 年,AWS Identity and Access Management 使用 OpenID Connect(OIDC)增加了对联合身份验证的支持。此功能允许您通过支持的身份提供商对 AWS API 调用进行身份验证,并获得有效的 OIDC JSON Web 令牌 (JWT)。您可以将此令牌传递到 AWS STS AssumeRoleWithWebIdentity
API 操作并接收 IAM 临时角色凭证。您可以使用这些凭证与任意 AWS 服务交互,包括 Amazon S3 和 DynamoDB。
每个 JWT 令牌均由签名密钥对签名。密钥由 Amazon EKS 管理的 OIDC 提供者提供,私钥每 7 天轮换一次。Amazon EKS 会保留公钥直至其过期。如果您连接外部 OIDC 客户端,请注意您需要在公钥过期之前刷新签名密钥。了解如何获取签名密钥以验证 OIDC 令牌。
Kubernetes 长期以来将服务账户用作其内部身份系统。Pod 可以使用自动装载的令牌(这是非 OIDC JWT,只有 Kubernetes API 服务器可以验证)进行 Kubernetes API 服务器的身份验证。这些旧服务账户令牌不会过期,轮换签名密钥是一个困难的过程。在 Kubernetes 1.12
版本中,添加了对新 ProjectedServiceAccountToken
功能的支持。此功能是 OIDC JSON Web 令牌,包含了服务账户身份,且支持可配置的受众。
Amazon EKS 为包含 ProjectedServiceAccountToken
JSON Web 令牌的签名密钥的每个集群托管公有 OIDC 发现端点,这样 IAM 等外部系统就可以验证和接收 Kubernetes 颁发的 OIDC 令牌。