EKS集群EBS CSI驱动基于服务账号IAM角色存证失败求助
从PVC报错信息来看,核心问题是EBS CSI控制器无法获取有效AWS凭证(NoCredentialProviders: no valid providers in chain),针对你采用的IAM Role for Service Account(IRSA)机制,按以下步骤排查:
1. 确认StorageClass配置有效性
先解决报错里的storageclass.storage.k8s.io "ebs-sc" not found警告,执行命令检查目标StorageClass是否存在且配置正确:
kubectl get storageclasses.storage.k8s.io ebs-sc -o yaml
需确认:
provisioner字段值为ebs.csi.aws.com- 若使用延迟绑定(
volumeBindingMode: WaitForFirstConsumer),需确保Pod已调度到节点(当前日志显示已选节点,此条件满足)
2. 验证IRSA角色与ServiceAccount的绑定关系
EBS CSI控制器默认使用kube-system命名空间下的ebs-csi-controller-sa服务账号,检查其是否关联了正确的IAM角色:
kubectl get serviceaccount ebs-csi-controller-sa -n kube-system -o yaml
查看输出中的metadata.annotations是否包含eks.amazonaws.com/role-arn,且ARN指向正确的IAM角色。
检查IAM角色的信任策略
登录AWS控制台或使用AWS CLI查看该IAM角色的信任策略,确保其允许EKS OIDC提供商为指定服务账号扮演角色:
aws iam get-role --role-name YOUR_EBS_CSI_IAM_ROLE_NAME --query "Role.AssumeRolePolicyDocument"
信任策略需包含类似如下内容(替换占位符为你的集群信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::YOUR_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_REGION.amazonaws.com/id/YOUR_OIDC_ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.YOUR_REGION.amazonaws.com/id/YOUR_OIDC_ID:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
检查IAM角色的权限策略
确认该IAM角色已附加AmazonEBSCSIDriverPolicy托管策略,或自定义策略包含以下必要权限:
ec2:CreateVolumeec2:DeleteVolumeec2:AttachVolumeec2:DetachVolumeec2:DescribeVolumesec2:DescribeAvailabilityZonesec2:DescribeInstances
3. 确认EKS集群OIDC提供商已配置
IRSA依赖EKS集群的OIDC身份提供商,检查集群是否已配置:
aws eks describe-cluster --name YOUR_CLUSTER_NAME --query "cluster.identity.oidc.issuer"
若输出为空,需先创建OIDC提供商:
eksctl utils associate-iam-oidc-provider --cluster YOUR_CLUSTER_NAME --approve
4. 验证CSI控制器Pod的凭证挂载与环境变量
检查CSI控制器Pod是否正确加载了IRSA凭证:
- 查看运行中的控制器Pod:
kubectl get pods -n kube-system -l app=ebs-csi-controller
- 进入其中一个Pod的
ebs-plugin容器,检查凭证文件是否存在:
kubectl exec -it ebs-csi-controller-XXXXXX-XXXX -n kube-system -c ebs-plugin -- ls /var/run/secrets/eks.amazonaws.com/serviceaccount/
正常应返回ca.crt和token文件。
3. 检查关键环境变量是否存在:
kubectl exec -it ebs-csi-controller-XXXXXX-XXXX -n kube-system -c ebs-plugin -- env | grep AWS_
需包含AWS_WEB_IDENTITY_TOKEN_FILE和AWS_ROLE_ARN两个变量,且值与配置一致。
5. 重新部署CSI控制器(若配置有误)
如果以上步骤发现配置错误,更新ServiceAccount注释或IAM角色后,重启CSI控制器Pod:
kubectl rollout restart deployment ebs-csi-controller -n kube-system
若使用Helm安装,重新指定IRSA角色ARN后升级:
helm upgrade ebs-csi-driver aws-ebs-csi-driver --namespace kube-system --set serviceAccount.annotations."eks.amazonaws.com/role-arn"="arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_EBS_CSI_IAM_ROLE_NAME"
内容的提问来源于stack exchange,提问作者bric_turnbull

