如何在Kubernetes中将所有hostPath存储卷更换为NFS并创建PVC且不丢失数据
裸金属Kubernetes集群hostPath存储切换为NFS存储操作指南(无数据丢失方案)
集群基础信息
Kubernetes version: 1.22.2 Installation method: bare-metal Host OS: Ubuntu 20.04 CNI and version: Flannel 0.15.0 CRI and version: Docker 20.10.9
操作步骤
1. 前置环境部署
- 所有Kubernetes集群节点安装NFS客户端依赖:
apt update && apt install nfs-common -y - 独立部署NFS服务端:
选择一台集群内或和集群网络互通的机器作为NFS服务端,执行安装:
创建NFS共享目录,配置apt update && apt install nfs-kernel-server -y/etc/exports开放集群节点网段访问权限,重启nfs-server服务生效,确保所有集群节点都可以正常挂载该NFS共享目录。 - 部署NFS存储类(StorageClass)
在集群中部署nfs-subdir-external-provisioner组件,配置对应NFS服务端地址、共享路径,创建NFS类型的StorageClass,可根据需要设置为集群默认存储类。
2. 存量数据迁移(核心防丢失步骤)
- 首先排查集群内所有使用hostPath存储的工作负载(Deployment、StatefulSet、DaemonSet等),记录每个hostPath卷对应的所在节点、本地路径、Pod内挂载路径、所属业务、目录占用空间。
- 按业务优先级从低到高迁移,迁移单个业务前先将工作负载副本数缩为0,停止业务写入,避免数据不一致:
kubectl scale <workload-type> <workload-name> --replicas=0 -n <namespace> - 为每个hostPath卷创建对应PVC,PVC的
storageClassName指定为已部署的NFS存储类,存储容量不小于原hostPath目录的实际占用空间。 - 启动临时辅助Pod,同时挂载新建的PVC和原hostPath所在节点的本地目录,使用
rsync全量同步数据,保留文件权限、所有者、软链接等属性:
同步完成后校验两端文件数量、大小、权限完全一致。rsync -avz /原hostPath本地目录/ /辅助Pod内PVC挂载路径/ - 修改原工作负载的卷配置,删除原hostPath配置,替换为新建PVC的挂载配置,将工作负载副本数恢复为原数值,启动业务。
- 业务启动后验证功能正常、数据完整,确认无误后原hostPath目录数据建议保留7天以上再删除,预留回滚空间。
注意事项
- StatefulSet使用
volumeClaimTemplates的场景,直接修改模板中的存储类为NFS类型,滚动更新前单独同步每个Pod对应hostPath的数据到对应PVC即可。 - NFS共享目录权限需要和原hostPath目录权限保持一致,避免Pod启动后出现读写权限异常。
- 建议先迁移非核心业务验证流程正确性,再执行核心业务迁移。
内容的提问来源于stack exchange,提问作者Aterow
相关产品推荐
相关产品推荐

