如何将快照恢复的Azure Managed Disk绑定到AKS集群的PersistentVolumeClaim
你判断的无法直接修改现有PV的DiskURI是对的,Kubernetes中PV的磁盘路径相关字段属于创建后不可变字段,需要通过重建PV的方式实现磁盘替换,全程保留原有PVC资源,可正常使用动态扩容能力,具体操作步骤如下:
前置校验
确认你使用的StorageClass custom-azure-disk-retain 的回收策略为Retain,该策略下删除PV资源不会触发底层Azure Managed Disk的删除,是本次操作的核心前提。
操作步骤
停止使用目标PVC的工作负载
将关联该PVC的Deployment/StatefulSet副本数缩为0,确保PVC处于未被使用的状态,避免操作过程中出现资源锁冲突:kubectl scale deployment <工作负载名称> -n prd --replicas=0备份原有PV配置
先查询与目标PVC绑定的PV名称:kubectl get pvc mysql-pvc -n prd -o jsonpath='{.spec.volumeName}'导出该PV的配置作为备份,防止操作失误可快速回滚:
kubectl get pv <上一步查询到的PV名称> -o yaml > pv-backup.yaml删除原有PV资源
因为StorageClass为Retain策略,删除PV资源只会删除Kubernetes中的PV对象,不会删除底层对应的Azure磁盘:kubectl delete pv <原有PV名称>基于恢复的新磁盘手动创建PV,绑定原有PVC
编写PV配置文件restored-mysql-pv.yaml,所有参数需要和原有PVC的要求完全匹配:apiVersion: v1 kind: PersistentVolume metadata: name: mysql-restored-pv spec: capacity: storage: 50Gi # 和原有PVC申请的存储大小一致,后续扩容可直接修改PVC配置 accessModes: - ReadWriteOnce # 和PVC配置的accessModes完全一致 persistentVolumeReclaimPolicy: Retain storageClassName: custom-azure-disk-retain # 和PVC指定的StorageClass完全一致 azureDisk: kind: Managed diskName: mysql-restored-disk # 你从快照恢复的新磁盘名称 diskURI: <THE_URI> # 恢复磁盘的完整Azure资源ID claimRef: name: mysql-pvc # 目标PVC的名称 namespace: prd # PVC所在的命名空间应用配置创建PV:
kubectl apply -f restored-mysql-pv.yaml验证绑定状态
执行以下命令确认PVC状态为Bound,且绑定的PV为你新创建的mysql-restored-pv:kubectl get pvc mysql-pvc -n prd恢复工作负载
将缩容的工作负载副本数调整回原有值即可完成恢复:kubectl scale deployment <工作负载名称> -n prd --replicas=<原有副本数>
方案优势
该方案完全保留原有PVC资源,工作负载的卷挂载配置无需做任何修改,同时因为新PV绑定了正确的StorageClass,后续可以直接修改PVC的
spec.resources.requests.storage值触发动态扩容,和之前的使用体验完全一致,规避了你之前直接挂载磁盘的方案无法使用PVC能力的问题。
内容的提问来源于stack exchange,提问作者Charlie

