步骤 1:停止使用 PVC 的应用
- 将相关 Pod 或 Deployment 副本数设为 0
确保目标 PVC 不再被任何 Pod 使用,避免数据写入冲突。kubectl scale deploy <deployment-name> --replicas=0
步骤 2:备份原节点上的数据
-
确认 PVC 对应的 PV 和存储路径
查询 PVC 绑定的 PV:kubectl get pvc <pvc-name> -o yaml | grep volumeName
-
查看 PV 的
local.path
字段获取数据路径:kubectl get pv <pv-name> -o yaml
-
示例输出片段:
spec: ... local: path: /opt/local-path-provisioner/pvc-12345678-90ab-cdef-1234-567890abcdef nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node01 # 原节点名称
-
登录原节点备份数据
将数据复制到临时目录或压缩打包:# 在原节点上执行 cp -r /opt/local-path-provisioner/pvc-12345678-90ab-cdef-1234-567890abcdef /tmp/pvc-backup tar czvf /tmp/pvc-backup.tar.gz -C /opt/local-path-provisioner/pvc-12345678-90ab-cdef-1234-567890abcdef .
步骤 3:迁移数据到目标节点
-
将备份文件复制到目标节点
使用scp
或文件传输工具:scp /tmp/pvc-backup.tar.gz user@target-node:/tmp/
-
在目标节点恢复数据
解压到local-path
的存储目录(需确保路径与配置一致):# 在目标节点上执行 mkdir -p /opt/local-path-provisioner/pvc-new-uid # 替换为新的唯一目录名 tar xzvf /tmp/pvc-backup.tar.gz -C /opt/local-path-provisioner/pvc-new-uid
步骤 4:创建新 PV/PVC 并绑定到目标节点
-
创建新 PV
手动创建 PV,绑定目标节点和新路径:apiVersion: v1 kind: PersistentVolume metadata: name: migrated-pv spec: capacity: storage: 5Gi # 调整大小 volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # 建议设置为 Retain 避免误删 local: path: /opt/local-path-provisioner/pvc-new-uid # 目标节点上的路径 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - target-node # 目标节点名称 storageClassName: local-path kubectl apply -f migrated-pv.yaml
-
创建新 PVC 并绑定到新 PV
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: migrated-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi # 需与 PV 一致 storageClassName: local-path volumeName: migrated-pv # 显式绑定到新 PV kubectl apply -f migrated-pvc.yaml
步骤 5:更新应用使用新 PVC
-
修改 Pod/Deployment 配置
将 Pod 模板中的 PVC 名称改为migrated-pvc
,并确保 Pod 可调度到目标节点(可通过节点选择器或容忍度配置)。 -
重启应用
kubectl scale deploy <deployment-name> --replicas=1
注意事项
-
数据一致性
迁移前确保应用已停止,避免数据损坏。 -
权限问题
目标节点上的目录权限需与源节点一致,确保 Pod 有权限访问。 -
StorageClass 配置
确认目标节点的local-path
StorageClass 配置路径与 PV 中local.path
匹配。 -
局限性
local-path
存储不适合生产关键数据,建议迁移到网络存储(如 NFS、Ceph)以实现动态迁移和高可用。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容