新AWS EKS集群PVC卡滞等待EBS CSI供应者,如何修复?
问题背景
我们部署了AWS EKS集群,使用基于Cloud Native Buildpacks的Tekton Pipeline,但PipelineRun一直处于Pending状态,无法生成Pod资源。经排查,是创建的PersistentVolumeClaim(PVC)始终处于Pending状态,事件提示等待外部存储供应者ebs.csi.aws.com创建卷。
PVC配置
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: buildpacks-source-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 500Mi
PVC状态详情
Name: buildpacks-source-pvc Namespace: default StorageClass: gp2 Status: Pending Volume: Labels: <none> Annotations: volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com volume.kubernetes.io/selected-node: ip-999-99-99-99.eu-central-1.compute.internal volume.kubernetes.io/storage-provisioner: ebs.csi.aws.com Finalizers: [kubernetes.io/pvc-protection] Capacity: Access Modes: VolumeMode: Filesystem Used By: affinity-assistant-0b3d266b91-0 affinity-assistant-53a7c08baf-0 affinity-assistant-a375f28de3-0 affinity-assistant-e8cb1a6e15-0 buildpacks-test-pipeline-run-9rz4l-fetch-repository-pod Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ExternalProvisioning 3m43s (x561 over 143m) persistentvolume-controller waiting for a volume to be created, either by external provisioner "ebs.csi.aws.com" or manually created by system administrator
什么是EBS CSI?
EBS CSI(Elastic Block Store Container Storage Interface)是AWS推出的符合CNCF容器存储接口标准的驱动,用于在Kubernetes集群中管理AWS EBS卷。它替代了传统的Kubernetes内置in-tree存储驱动,提供更灵活的存储管理能力,支持动态创建EBS卷、挂载/卸载卷、快照管理等操作,让Kubernetes集群可以无缝对接AWS的EBS存储服务。
解决PVC卡滞Pending的步骤
1. 检查EBS CSI驱动是否已安装并正常运行
EBS CSI驱动包含控制器组件(部署为Deployment)和节点组件(部署为DaemonSet),需确保两者都处于正常运行状态:
- 查看控制器Pod状态:
kubectl get pods -n kube-system -l app=ebs-csi-controller - 查看节点插件DaemonSet状态:
kubectl get daemonset ebs-csi-node -n kube-system
如果组件未安装或状态异常,需重新部署EBS CSI驱动。
2. 验证IAM权限配置
EBS CSI驱动需要足够的IAM权限来操作EBS卷,需确认:
- 驱动使用的服务账号已关联
AmazonEBSCSIDriverPolicy权限策略,或自定义策略包含以下核心权限:ec2:CreateVolumeec2:AttachVolumeec2:DetachVolumeec2:DeleteVolumeec2:DescribeVolumes
- 集群节点角色(若使用节点角色而非服务账号)也需包含上述权限。
3. 检查StorageClass配置
确认使用的gp2存储类已正确配置为使用EBS CSI驱动:
kubectl describe storageclass gp2
需确保Provisioner字段为ebs.csi.aws.com,且ReclaimPolicy、VolumeBindingMode等参数设置合理(例如VolumeBindingMode设为WaitForFirstConsumer时需确保Pod已调度到节点)。
4. 排查CSI驱动日志
查看EBS CSI控制器插件的日志,定位具体错误原因:
kubectl logs -n kube-system -l app=ebs-csi-controller -c ebs-plugin
常见错误包括权限不足、可用区EBS卷资源不足、驱动版本与EKS集群版本不兼容等。
5. 手动创建PersistentVolume(可选)
若上述步骤无法解决问题,可手动创建PV并与PVC绑定,绕过动态供应流程:
apiVersion: v1 kind: PersistentVolume metadata: name: buildpacks-source-pv spec: capacity: storage: 500Mi accessModes: - ReadWriteOnce csi: driver: ebs.csi.aws.com volumeHandle: <your-ebs-volume-id> storageClassName: gp2
替换<your-ebs-volume-id>为已创建的EBS卷ID,应用后PVC将自动绑定该PV。
内容的提问来源于stack exchange,提问作者jonashackt

