0Pricing
AWS Solutions Architect · 课时

服务账户的 IAM 角色(IRSA)

使用 IRSA 将精细化的 IAM 角色绑定到 Kubernetes 服务账户,使 Pod 无需节点级权限即可访问 AWS 服务

服务账户的 IAM 角色(IRSA) 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

Pod 的 IAM 问题

在 EKS 中运行的 Pod 如果需要调用 AWS API(例如从 S3 读取数据或向 DynamoDB 写入数据),就需要 AWS 凭证。一个简单但不安全的做法是创建 IAM 用户,并将其访问密钥硬编码为环境变量。这种做法不安全,也违背最小权限原则,因为同一节点上的所有 Pod 都会共享这些凭证。IAM Roles for Service Accounts (IRSA) 通过将细粒度的 IAM 角色直接绑定到 Kubernetes 服务账户来解决这一问题。

IRSA 的工作原理:OIDC 联合身份验证

IRSA 通过OpenID Connect (OIDC) 联合身份验证工作。EKS 会为您的集群创建 OIDC 提供商。当 Pod 引用一个注释中包含 IAM 角色 ARN 的服务账户时,EKS 会将签名的投影服务账户令牌注入 Pod。Pod 中的 AWS SDK 使用 AWS STS 的 AssumeRoleWithWebIdentity API,将此令牌交换为临时 AWS 凭证,无需长期密钥。

# View the OIDC issuer URL for your cluster
aws eks describe-cluster \
  --name my-cluster \
  --query 'cluster.identity.oidc.issuer' \
  --output text

# Example output:
# https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLEIDSTRING

第 1 步:关联 OIDC 提供商

在使用 IRSA 之前,您必须将EKS OIDC 签发者关联为 AWS 账户中的受信任身份提供商。这会创建一个 IAM OIDC 提供商资源,AWS STS 将识别该资源。eksctl 命令会自动完成此操作。创建完成后,您可以在 IAM 控制台的“身份提供商”下进行验证。

# Associate the OIDC provider using eksctl (simplest method)
eksctl utils associate-iam-oidc-provider \
  --region us-east-1 \
  --cluster my-cluster \
  --approve

# Verify the provider was created
aws iam list-open-id-connect-providers \
  --query 'OpenIDConnectProviderList[].Arn'

第 2 步:创建 IAM 角色

IRSA 使用的 IAM 角色必须包含信任策略,允许 OIDC 提供商代入该角色,并将范围限定为特定的 Kubernetes 命名空间和服务账户。该条件使用 OIDC 令牌中的 sub 声明,其值设置为 system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME。这样可以确保只有使用该特定服务账户的 Pod 才能代入此角色,而不是集群中的任意 Pod。

# Trust policy for the IRSA role (JSON)
# {
#   "Version": "2012-10-17",
#   "Statement": [{
#     "Effect": "Allow",
#     "Principal": {
#       "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLEID"
#     },
#     "Action": "sts:AssumeRoleWithWebIdentity",
#     "Condition": {
#       "StringEquals": {
#         "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLEID:sub":
#           "system:serviceaccount:production:s3-reader"
#       }
#     }
#   }]
# }

第 3 步:为服务账户添加注释

在目标命名空间中创建一个 Kubernetes ServiceAccount,并为其添加 IAM 角色 ARN 注释。当 Pod 引用此服务账户时,EKS 会自动注入 OIDC 令牌和两个环境变量(AWS_WEB_IDENTITY_TOKEN_FILE 和 AWS_ROLE_ARN)。AWS SDK 会自动检测这些内容,并调用 STS 获取临时凭证,应用程序无需进行任何代码更改。

# Create and annotate the Kubernetes service account
kubectl create serviceaccount s3-reader -n production

kubectl annotate serviceaccount s3-reader \
  -n production \
  eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/S3ReaderRole

# Verify the annotation
kubectl describe serviceaccount s3-reader -n production

第 4 步:在 Pod 中引用服务账户

在 Pod 或部署规范中,将 serviceAccountName 设置为已添加注释的服务账户。当 EKS 调度 Pod 时,它会自动将 OIDC 令牌挂载到 /var/run/secrets/eks.amazonaws.com/serviceaccount/token,并设置所需的环境变量。Pod 内的任何 AWS SDK 调用都会透明地使用映射的 IAM 角色凭证,无需显式配置凭证。

# Pod spec using IRSA service account
apiVersion: v1
kind: Pod
metadata:
  name: s3-app
  namespace: production
spec:
  serviceAccountName: s3-reader
  containers:
  - name: app
    image: 111122223333.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
    # AWS SDK auto-detects IRSA — no credential config needed
    # AWS_WEB_IDENTITY_TOKEN_FILE and AWS_ROLE_ARN are injected

IRSA 与节点 IAM 角色:主要区别

使用节点 IAM 角色时,节点上的每个 Pod 都会继承相同的权限;如果某个 Pod 被攻破,攻击者就可以访问该节点获准访问的所有 AWS 服务。使用IRSA时,每个 Pod(通过其服务账户)只会代入所需的角色。这在 Pod 层面遵循了最小权限原则,并限制了任何安全事件的影响范围。AWS 建议所有新的 EKS 部署都使用 IRSA,而不是节点级角色。

使用 eksctl 创建 IRSA 角色

eksctl 可以通过使用 create iamserviceaccount,在一条命令中创建 OIDC 关联、IAM 角色、信任策略以及 Kubernetes ServiceAccount 注释。这是设置 IRSA 的最简单方式,无需手动编写信任策略 JSON。您只需指定命名空间、服务账户名称以及要附加的 IAM 策略 ARN,剩余工作由 eksctl 处理。

# Create everything needed for IRSA in one command
eksctl create iamserviceaccount \
  --name s3-reader \
  --namespace production \
  --cluster my-cluster \
  --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
  --approve \
  --override-existing-serviceaccounts

用于 AWS 附加组件的 IRSA

许多 EKS 附加组件和控制器都需要 IRSA 才能运行:集群自动扩缩容器需要调用 EC2 Auto Scaling API 的权限,AWS 负载均衡器控制器需要创建和管理 ELB 资源的权限,外部 DNS需要 Route 53 写入权限,而EBS CSI 驱动程序需要创建和挂载 EBS 卷的权限。请始终为这些系统组件使用 IRSA,切勿在节点 IAM 角色级别授予这些权限。

# Create IRSA for the EBS CSI driver
eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster my-cluster \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-name AmazonEKS_EBS_CSI_DriverRole

令牌刷新与凭证轮换

IRSA 令牌的有效期较短,Kubernetes 令牌投影控制器会在令牌过期前自动轮换令牌。默认令牌受众是 sts.amazonaws.com,有效期为 24 小时,但控制器会在其生命周期达到 80% 时刷新令牌。通过 IRSA 获取的 AWS STS 凭证同样是临时凭证(通常为 1 小时)。这种自动轮换消除了长期 IAM 访问密钥所带来的凭证轮换负担。

# Inspect the projected service account token inside a pod
kubectl exec -n production s3-app -- \
  cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token

# Decode the JWT header and payload to see expiry and audience
# jwt.io or: base64 -d <<< "PAYLOAD_SECTION"

使用 CloudTrail 审计 IRSA 使用情况

每当 Pod 通过 IRSA 代入 IAM 角色时,AWS CloudTrail 都会记录一个 AssumeRoleWithWebIdentity 事件。该事件包含被代入角色的 ARN、OIDC 令牌主体(system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT)以及源 IP。这为审计哪些 Pod 在何时访问了哪些 AWS 服务提供了完整记录,对于受监管环境中的合规性和事件调查至关重要。

# Search CloudTrail for IRSA calls
aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRoleWithWebIdentity \
  --start-time '2024-01-01T00:00:00Z' \
  --query 'Events[].{Time:EventTime,Role:CloudTrailEvent}' \
  --output table

快速检查

测试您对本课 AWS Solutions Architect (SAA-C03) 概念的理解。

课程回顾

在本课中,您学习了:IRSA 使用 OIDC 联合身份验证将 Kubernetes 服务账户令牌交换为临时 AWS 凭证;IAM 角色信任策略将访问范围限定为特定的命名空间和服务账户;而且IRSA 提供的 Pod 级最小权限远优于节点级 IAM 角色。接下来,我们将学习 CloudWatch 指标、命名空间和维度,以便监控您的 AWS 资源。

常见问题解答

「服务账户的 IAM 角色(IRSA)」课时是免费的吗?

是的 — 「服务账户的 IAM 角色(IRSA)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「服务账户的 IAM 角色(IRSA)」这节课中我会学到什么?

使用 IRSA 将精细化的 IAM 角色绑定到 Kubernetes 服务账户,使 Pod 无需节点级权限即可访问 AWS 服务 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「服务账户的 IAM 角色(IRSA)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. EKS 控制平面与工作节点
  2. 用于无服务器 Pod 的 Fargate 配置文件
  3. EKS 网络:VPC CNI 与负载均衡
  4. 服务账户的 IAM 角色(IRSA)
← 返回 AWS Solutions Architect