如何为AKS集群配置IAM角色以访问AWS S3存储桶?
在AKS中实现Pod访问AWS S3存储桶的方案
EKS的《IAM roles for Kubernetes Service Accounts》(IRSA)是AWS针对自家EKS集群的原生集成方案,AKS并没有直接支持这一机制,但可以通过以下几种替代方案实现Pod基于IAM权限访问AWS S3:
方案1:通过Kubernetes Secret存储IAM用户凭证(简单直接)
这是最易上手的方式,利用AWS SDK的凭证自动识别机制,将IAM用户的凭证挂载到Pod中:
- 创建具备S3访问权限的IAM用户,比如附加允许
s3:ListBucket、s3:GetObject等操作的自定义策略 - 生成该用户的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY - 在AKS集群中创建存储凭证的Secret:
kubectl create secret generic aws-s3-creds \ --from-literal=AWS_ACCESS_KEY_ID=<你的access-key> \ --from-literal=AWS_SECRET_ACCESS_KEY=<你的secret-key> - 在Pod/Deployment配置中,将Secret注入为环境变量:
apiVersion: apps/v1 kind: Deployment metadata: name: s3-access-app spec: template: spec: containers: - name: app-container image: your-app-image env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-s3-creds key: AWS_ACCESS_KEY_ID - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-s3-creds key: AWS_SECRET_ACCESS_KEY - 注意事项:通过RBAC限制只有指定ServiceAccount能访问该Secret,定期轮换IAM用户凭证以降低风险。
方案2:基于OIDC身份提供商模拟IRSA效果(安全度高)
利用AKS支持的OIDC issuer和AWS的Web Identity Federation,实现Pod通过ServiceAccount的OIDC token获取临时IAM角色凭证,无需存储长期密钥:
- 获取AKS集群的OIDC issuer URL:
az aks show -g <资源组名> -n <集群名> --query "oidcIssuerProfile.issuerUrl" -o tsv - 在AWS IAM中创建角色:
- 信任策略配置为允许AKS的OIDC提供商的指定ServiceAccount扮演该角色,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<AWS账号ID>:oidc-provider/<AKS-OIDC-issuer的主机部分>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "<AKS-OIDC-issuer的主机部分>:sub": "system:serviceaccount:<命名空间>:<ServiceAccount名称>" } } } ] } - 给该角色附加S3访问权限的策略
- 信任策略配置为允许AKS的OIDC提供商的指定ServiceAccount扮演该角色,示例策略:
- 在AKS中创建带有注解的ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: name: aws-s3-sa namespace: default annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<AWS账号ID>:role/<你的IAM角色名> - 在Pod中配置使用Web Identity凭证:
可以通过AWS SDK的Web Identity Credentials Provider自动处理,或者部署自定义sidecar(比如基于aws-cli的脚本)定期获取临时凭证并注入环境变量。
方案3:通过STS AssumeRole获取临时凭证(权限最小化)
创建仅具备sts:AssumeRole权限的低权限IAM用户,让Pod先通过该用户的凭证调用STS API获取目标S3角色的临时凭证,再访问S3:
- 创建目标IAM角色(附S3权限),信任策略允许低权限用户调用
sts:AssumeRole - 创建低权限IAM用户,仅授予调用
sts:AssumeRole到目标角色的权限 - 将低权限用户的凭证存储在K8s Secret中,Pod挂载后,应用通过代码调用
AssumeRole接口获取临时凭证,用临时凭证访问S3 - 注意事项:需要在应用中处理临时凭证的过期刷新逻辑,适合对安全性要求较高的场景
内容的提问来源于stack exchange,提问作者RyanDotnet
相关产品推荐
相关产品推荐

