You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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角色凭证,无需存储长期密钥:

  1. 获取AKS集群的OIDC issuer URL:
    az aks show -g <资源组名> -n <集群名> --query "oidcIssuerProfile.issuerUrl" -o tsv
    
  2. 在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访问权限的策略
  3. 在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角色名>
    
  4. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:35:23