如何在AWS自建K8s集群中部署EBS-CSI实现PVC自动配置?
在AWS EC2自建K8s集群部署EBS CSI驱动
前提条件
- Kubernetes集群版本 ≥ 1.20(EBS CSI驱动v1.0及以上版本要求)
- 集群EC2节点需具备操作EBS卷的IAM权限
- 可选:已安装Helm 3(用于更便捷的驱动安装)
1. 配置EC2节点IAM权限
自建集群无法使用EKS的IAM Roles for Service Accounts(IRSA),直接为集群所有EC2节点的实例角色附加以下IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateVolume", "ec2:AttachVolume", "ec2:DeleteVolume", "ec2:DescribeVolumes", "ec2:DescribeInstances", "ec2:DetachVolume" ], "Resource": "*" } ] }
建议将该策略命名为AmazonEBSCSIDriverPolicy,确保所有节点实例角色都关联此策略。
2. 安装EBS CSI驱动
方法一:Helm安装
- 添加EBS CSI Helm仓库:
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver/ helm repo update
- 安装驱动(适配自建集群,禁用IRSA相关配置):
helm upgrade --install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set controller.serviceAccount.create=false \ --set controller.serviceAccount.name=ebs-csi-controller-sa \ --set node.serviceAccount.create=false \ --set node.serviceAccount.name=ebs-csi-node-sa
提示:如果集群未预创建对应ServiceAccount,可删除
create=false和name参数,让Helm自动创建。
方法二:Kubectl直接部署
执行官方稳定版manifest:
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
验证组件运行状态:
kubectl get pods -n kube-system -l app=ebs-csi-controller kubectl get pods -n kube-system -l app=ebs-csi-node
确保所有Pod处于Running状态。
3. 验证EBS CSI功能
步骤1:创建StorageClass
如果集群没有默认的EBS存储类,创建以下StorageClass:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: type: gp3
执行kubectl apply -f storageclass.yaml,可将其设为默认存储类:
kubectl patch storageclass ebs-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
步骤2:创建测试PVC
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ebs-pvc spec: accessModes: - ReadWriteOnce storageClassName: ebs-sc resources: requests: storage: 10Gi
执行kubectl apply -f pvc.yaml,等待PVC状态变为Bound。
步骤3:创建测试Pod并挂载PVC
apiVersion: v1 kind: Pod metadata: name: test-ebs-pod spec: containers: - name: nginx image: nginx:alpine volumeMounts: - name: ebs-volume mountPath: /data volumes: - name: ebs-volume persistentVolumeClaim: claimName: ebs-pvc
执行kubectl apply -f pod.yaml,待Pod启动后验证挂载:
kubectl exec test-ebs-pod -- df -h /data
若输出中显示EBS卷的挂载信息,说明配置成功。
注意事项
- 确保EC2节点所在VPC有足够的EBS卷配额
- 不同EC2实例类型支持的挂载EBS卷数量上限不同,需参考AWS官方文档
- 若需使用加密EBS卷,需为实例角色添加
kms:CreateGrant、kms:DescribeKey等相关权限
内容的提问来源于stack exchange,提问作者Bhargav Vekariya
相关产品推荐
相关产品推荐

