如何将AWS EBS备份恢复的新卷绑定到EKS StatefulSet Pod
如何将AWS Backup恢复的新EBS卷绑定到EKS StatefulSet的Pod
核心思路
StatefulSet的Pod依赖固定命名的PVC(格式为<statefulset名>-<volume模板名>-<序号>),恢复后的EBS卷需要通过手动创建匹配的PV/PVC,替换原有绑定关系,再让StatefulSet重新挂载。
步骤1:停止StatefulSet的Pod
先缩容StatefulSet到0,避免Pod自动重建干扰操作:
kubectl scale statefulset <你的StatefulSet名称> --replicas=0
步骤2:清理原有PV/PVC
删除对应Pod的PVC(比如你的StatefulSet名为mysql,卷模板名为data,序号0的PVC就是data-mysql-0):
kubectl delete pvc <原有PVC名称>
- 如果原有PV是动态生成的,删除PVC后PV会自动被删除(取决于存储类的回收策略);如果PV是手动创建的,需要额外执行:
kubectl delete pv <原有PV名称>
步骤3:创建关联恢复EBS卷的PV
先拿到恢复后的EBS卷ID:
- 可以通过AWS控制台查看,或者用AWS CLI命令:
aws ec2 describe-volumes --filters "Name=tag:Name,Values=<恢复后的卷名称>"
找到输出里的
VolumeId(格式为vol-xxxxxxxxx)。- 可以通过AWS控制台查看,或者用AWS CLI命令:
编写PV的YAML文件(比如
restored-pv.yaml):
apiVersion: v1 kind: PersistentVolume metadata: name: restored-pv-0 # 自定义PV名称 spec: capacity: storage: 10Gi # 必须和EBS卷实际大小一致 accessModes: - ReadWriteOnce # 和原有卷的访问模式保持一致 persistentVolumeReclaimPolicy: Retain # 可选:Delete/Retain,根据需求选择 storageClassName: gp2 # 必须和你的存储类名称一致 awsElasticBlockStore: volumeID: vol-xxxxxxxxx # 替换为刚才拿到的EBS卷ID fsType: ext4 # 和原有卷的文件系统保持一致(比如xfs)
- 应用PV:
kubectl apply -f restored-pv.yaml
步骤4:创建匹配StatefulSet的PVC
PVC必须使用原有PVC的名称,这样StatefulSet启动Pod时会自动关联它。编写PVC的YAML文件(比如restored-pvc.yaml):
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-mysql-0 # 替换为原有PVC的名称 spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi # 和PV大小一致 storageClassName: gp2 volumeName: restored-pv-0 # 指定刚才创建的PV名称,强制绑定
应用PVC:
kubectl apply -f restored-pvc.yaml
步骤5:重启StatefulSet并验证
扩容StatefulSet到原有副本数:
kubectl scale statefulset <你的StatefulSet名称> --replicas=<原有副本数>
验证Pod启动和挂载情况:
# 查看Pod状态 kubectl get pods # 检查卷挂载 kubectl exec <Pod名称> -- df -h
注意事项
- AZ一致性:恢复后的EBS卷所在的可用区必须和Pod调度的节点AZ一致,否则会挂载失败。如果不一致,可以先将EBS卷迁移到目标AZ,或者调整StatefulSet的节点亲和性。
- 多副本处理:如果是多副本StatefulSet,每个副本的PVC都需要重复上述PV/PVC创建步骤,确保每个序号对应的PVC都绑定到对应的恢复卷。
- 存储类匹配:PV和PVC的
storageClassName必须和原有配置完全一致,否则无法绑定。
内容的提问来源于stack exchange,提问作者Rainbird
相关产品推荐
相关产品推荐

