基于 AWS EBS(Elastic Block Store) 的 Kubernetes 动态存储方案

参考:官方文档

一、前提条件

#AWS 环境
已创建 EKS 集群(或自建 Kubernetes 集群运行在 AWS EC2 上)
确保工作节点的IAM角色拥有ec2:CreateVolume(创建卷)、ec2:AttachVolume(附加卷)等权限
#工具准备
kubectl、awscli 已配置,可访问集群和 AWS API

二、安装 AWS EBS CSI Driver

EBS 动态存储依赖 https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html,用于在 Kubernetes 中管理 EBS 卷的生命周期。
1. 部署 CSI Driver

#添加 Helm 仓库
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update

#安装驱动(替换 YOUR_CLUSTER_NAME 和 AWS_REGION)
helm install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \
  --namespace kube-system \
  --set controller.serviceAccount.create=true \
  --set controller.serviceAccount.annotations."eks\.amazonaws\.com/role-arn"="arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole" \
  --set region=YOUR_AWS_REGION

2. 验证安装

kubectl get pods -n kube-system | grep ebs-csi
#应看到 `ebs-csi-controller` 和 `ebs-csi-node` 运行中

三、创建 StorageClass

定义动态存储策略,指定使用 EBS 卷类型(如 gp3、io1)。
1. 创建 StorageClass 配置文件

# ebs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-gp3
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer  # 延迟绑定,确保卷创建在 Pod 所在节点
parameters:
  type: gp3
  fsType: ext4
  encrypted: "true"  # 可选:启用加密
reclaimPolicy: Delete  # PVC删除时自动删除EBS卷
allowVolumeExpansion: true  # 允许卷扩容

2. 应用配置

kubectl apply -f ebs-storageclass.yaml
kubectl get sc
# 应看到 `ebs-gp3` 存储类

四、创建 PVC 并测试动态分配

1. 创建 PVC 请求存储

# ebs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ebs-gp3
  resources:
    requests:
      storage: 10Gi
kubectl apply -f ebs-pvc.yaml
kubectl get pvc
# 状态应为 Bound,并自动创建对应的 PV

2. 在 Pod 中使用 PVC

# ebs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ebs-test-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: ebs-storage
      mountPath: /usr/share/nginx/html
  volumes:
  - name: ebs-storage
    persistentVolumeClaim:
      claimName: ebs-pvc
kubectl apply -f ebs-pod.yaml
kubectl get pod -o wide
  1. 验证数据持久化
# 进入 Pod 写入测试文件
kubectl exec -it ebs-test-pod -- bash
echo "Hello EBS!" > /usr/share/nginx/html/test.txt

# 删除 Pod 后重新创建,检查文件是否保留
kubectl delete pod ebs-test-pod
kubectl apply -f ebs-pod.yaml
kubectl exec -it ebs-test-pod -- cat /usr/share/nginx/html/test.txt
# 应看到 "Hello EBS!"

五、高级功能(可选)

1. 卷扩容

#修改 PVC 的 storage 请求(如从 10Gi 改为 20Gi)。
执行扩容命令:
kubectl edit pvc ebs-pvc

#观察 PV 是否扩容(需等待几分钟)
kubectl get pv

2. 快照与恢复
创建 VolumeSnapshotClass:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: ebs-snapshot-class
driver: ebs.csi.aws.com
deletionPolicy: Delete

参考:创建快照并恢复官方文档

六、生产环境注意事项

性能调优
根据负载选择卷类型(gp3 通用型,io1 高性能)。
监控 EBS 的 IOPS 和吞吐量(通过 CloudWatch)。
高可用
EBS 卷仅绑定到单个 AZ,跨 AZ 需通过应用层冗余(如 StatefulSet 多副本)。
成本控制
设置 reclaimPolicy: Retain 避免误删数据卷。
定期清理未使用的 PV。

七、故障排查

#PVC 一直处于 Pending 状态
检查 CSI Driver 日志:kubectl logs -n kube-system ebs-csi-controller-xxx。
确认 IAM 权限是否正确。
#Pod 无法挂载卷
确保 Pod 和 EBS 卷在同一个 AZ。
#最终效果
动态分配:提交 PVC 后自动创建 EBS 卷并绑定。
持久化:Pod 重启或迁移后数据不丢失。
弹性扩展:支持在线扩容和快照备份。

更多推荐