基于 AWS EBS(Elastic Block Store) 的 Kubernetes 动态存储方案
·
基于 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
- 验证数据持久化
# 进入 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 重启或迁移后数据不丢失。
弹性扩展:支持在线扩容和快照备份。
更多推荐
所有评论(0)