如何通过IAM角色替代访问密钥让Kubernetes Pod访问Amazon S3
基于IAM角色实现s3fs-fuse在Kubernetes Pod中挂载S3存储桶的实操方法
该场景无需配置长期Access Key/Secret Key,依托Kubernetes与AWS打通的IAM Roles for Service Accounts(IRSA)机制,即可将IAM权限直接绑定到集群的ServiceAccount身份,让Pod自动获取时效临时凭据完成S3访问,全程无长期密钥落盘。
前置基础要求
- Kubernetes集群需已完成OIDC Provider注册,即集群关联的OIDC身份端点已在IAM控制台完成可信配置,这是IRSA机制运行的必要前提
- 集群节点出口网络需能正常访问AWS STS服务,用于兑换临时访问凭据
操作步骤
1. 创建匹配S3权限的IAM角色
- 角色可信实体选择「Web Identity」类型,关联集群已注册的OIDC Provider作为信任源
- 配置角色信任策略,精准限定仅指定命名空间、指定名称的ServiceAccount可扮演该角色,避免权限无边界扩散
- 为角色附加最小权限策略,仅授予目标S3存储桶访问所需的必要权限:包括桶的ListBucket权限,以及对象的GetObject/PutObject/DeleteObject等s3fs运行必需的操作权限,禁止直接授予全量S3访问的高权限
2. 在集群内创建绑定IAM角色的ServiceAccount
编写ServiceAccount定义,通过注解关联前面创建的IAM角色ARN,示例配置如下:
apiVersion: v1 kind: ServiceAccount metadata: name: s3-access-sa namespace: default annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<你的AWS账号ID>:role/<对应S3权限的IAM角色名>
该注解是IRSA机制的核心标识,kubelet会在Pod启动时基于该注解的角色配置,自动注入临时凭据相关的环境变量与令牌文件。
3. 调整s3fs-fuse的Pod挂载配置
与之前使用长期AK/SK的配置相比,需要做以下调整:
- 在Pod的
spec字段下配置serviceAccountName: s3-access-sa,将前面创建的带IAM角色绑定的ServiceAccount关联到Pod - 移除之前挂载的存储长期AK/SK的Secret卷,删除s3fs启动参数里引用凭据文件的相关配置
- s3fs启动命令无需手动传入任何身份校验参数,示例命令如下:
s3fs <你的目标S3存储桶名称> /mnt/s3 \ -o use_path_request_style \ -o url=https://s3.<你的S3所属区域>.amazonaws.com \ -o no_use_cache
- 确保s3fs镜像版本不低于1.87,该版本开始原生支持AWS默认凭据链路,可自动读取IRSA注入的临时凭据完成身份校验,无需手动指定凭据来源
注意:该流程下无需创建存储AK/SK的passwd文件,也不需要在s3fs参数中传入任何身份校验相关的配置
常见运行排坑
- s3fs作为FUSE挂载工具,需要为Pod的securityContext配置
allowPrivilegeEscalation: true,并添加SYS_ADMIN能力,否则会因系统权限不足挂载失败 - IAM角色的信任策略需严格匹配ServiceAccount的命名空间与名称,宽松的通配符配置会导致角色扮演失败
- 需保证Pod内的AWS SDK组件可正常访问集群OIDC端点,否则无法完成临时凭据兑换流程
内容的提问来源于stack exchange,提问作者babs84
相关产品推荐
相关产品推荐

