AWS EKS环境下通过Kubernetes ServiceAccount访问EFS的权限认证故障排查求助
排查EFS CSI Driver权限认证失败问题
从你提供的日志和配置来看,核心问题是EFS CSI Controller的ServiceAccount无法通过IRSA(IAM Roles for Service Accounts)获取AWS权限,导致动态创建EFS访问点失败,进而PVC无法绑定、Pod调度异常。下面是按优先级排序的排查步骤:
1. 验证IAM角色的信任策略(Trust Policy)是否正确
IRSA的核心是让K8s ServiceAccount能假定对应的IAM角色,这依赖于角色的信任策略是否允许EKS集群的OIDC提供商进行角色切换。你只提到了权限策略,但信任策略配置错误是这类问题最常见的原因。
检查命令:
aws iam get-role --role-name AmazonEKS_EFS_CSI_Driver_Policy --query Role.AssumeRolePolicyDocument
正确的信任策略模板(需要替换成你的集群OIDC信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111111111111:oidc-provider/oidc.eks.<region>.amazonaws.com/id/<OIDC_ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<region>.amazonaws.com/id/<OIDC_ID>:aud": "sts.amazonaws.com", "oidc.eks.<region>.amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] }
说明:
<region>替换为你的EKS集群区域<OIDC_ID>是你EKS集群的OIDC提供商ID,可以通过aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text获取,取最后一段路径的字符串- 确保
sub字段严格匹配你的ServiceAccount的命名空间和名称(kube-system/efs-csi-controller-sa)
2. 确认ServiceAccount的IRSA注解配置无误
检查你的ServiceAccount注解中的角色ARN是否完全正确:
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111111111111:role/AmazonEKS_EFS_CSI_Driver_Policy
- 确认账号ID(111111111111)和角色名(AmazonEKS_EFS_CSI_Driver_Policy)没有拼写错误
- 确保角色在当前AWS账号下存在,并且已经正确创建
3. 验证IAM权限策略是否包含动态配置所需权限
你使用的是efs-ap(动态访问点)模式,官方的EFS CSI Driver权限策略需要包含以下关键权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "efs:DescribeAccessPoints", "efs:DescribeFileSystems", "efs:CreateAccessPoint", "efs:DeleteAccessPoint" ], "Resource": "*" } ] }
注意:如果你的EFS文件系统有资源策略,需要确保该IAM角色被允许访问该文件系统。
4. 检查EFS文件系统的资源策略
登录AWS控制台,进入EFS服务,找到你的文件系统(fs-92107410),查看其资源策略是否存在拒绝该IAM角色访问的规则,或者是否显式允许该角色的ARN进行操作。
如果资源策略设置了限制,需要添加允许该角色的语句,例如:
{ "Version": "2012-10-17", "Id": "ExamplePolicy01", "Statement": [ { "Sid": "AllowIAMRoleAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:role/AmazonEKS_EFS_CSI_Driver_Policy" }, "Action": [ "efs:ClientMount", "efs:ClientWrite", "efs:DescribeAccessPoints" ], "Resource": "arn:aws:efs:<region>:111111111111:file-system/fs-92107410" } ] }
5. 确认EKS集群已关联OIDC提供商
IRSA要求EKS集群必须启用并关联AWS OIDC提供商,你可以通过以下命令检查:
aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc"
如果输出中没有issuer字段,说明你需要先为集群创建OIDC提供商:
eksctl utils associate-iam-oidc-provider --cluster <cluster-name> --approve
最后验证步骤
完成上述排查后,可以重启EFS CSI Controller Pod,让其重新加载权限:
kubectl rollout restart deployment efs-csi-controller -n kube-system
然后查看PVC状态和Pod日志,确认是否能正常创建访问点和绑定卷。
内容的提问来源于stack exchange,提问作者Miantian




