说明
kubernetes集群数据迁移流程。部分环境部署时,未规划数据盘,原数据盘无法动态扩容,磁盘爆满后,节点故障,需临时救援迁移数据到新磁盘。
此数据迁移不涉及特殊组件,无法覆盖全部场景,例如openebs需要单独做数据迁移。
环境检查
kubernetes目前常见runtime是docker和containerd。
确认runtime和node状态
查询kubernetes集群信息,在master node操作,
| kubectl get node -A -o wide |
例如下图,最后一列显示真实使用的runtime。

查看POD状态,在master node操作,
| kubectl get pod -A -o wide |
特殊情况,新版docker使用containerd,需要同时调整docker和containerd。旧版仅使用docker。
检查组件状态
| systemctl status containerd.service systemctl status docker systemctl status kubelet.service |
应当看到active (running)
确认数据爆满的节点
挨个访问node,确认有多少node数据爆满,确认有多少node需做数据迁移。
注意:仔细确认场景,若将场景2误判为场景1,存在node无法启动,且pod重复发放的问题。
场景1
仅个别node数据爆满,即便关停这些node,其他node有充足的存储空间承载所有pod。假设数据爆满的node是node2.
场景2
所有node数据爆满,所有node无法承载新pod。
关停组件
注意:不存在的组件无需操作。
迁移数据之前,需关停组件。
场景1
将node设置为不可调度。在master node操作,
| kubectl cordon node2 |
驱逐node2上所有资源到其他node。
务必确认已经没有node停留在node2,再进行下一步。
| kubectl drain node2 --ignore-daemonsets --delete-emptydir-data --force kubectl get pod -A -o wide |
关停node2的组件。在node2操作
| systemctl stop containerd.service systemctl stop docker systemctl stop kubelet.service |
场景2
应当在所有node关闭组件。
| systemctl stop containerd.service systemctl stop docker systemctl stop kubelet.service |
准备专用目录
注意:此目录必须可动态扩容,且挂载的磁盘容量较大。
假设磁盘挂载给目录/data
| mkdir /data/backup |
迁移并备份数据
务必备份一遍数据,规避数据异常问题。
| rsync -avz /var/lib/docker/ /data/docker/ mv /var/lib/docker/ /data/backup/docker/ rsync -avz /var/lib/kubelet/ /data/kubelet/ mv /var/lib/kubelet/ /data/backup/kubelet/ rsync -avz /var/lib/containerd/ /data/containerd/ mv /var/lib/containerd/ /data/containerd/ |
修改配置
解释:为何配置软连接,而不是仅修改配置文件中数据目录的配置。
Google Gemini认为,当前最新版本k8s及相关组件存在硬编码数据目录的情况,若修改配置文件,可能存在遗漏或者部分配置无法修改的问题。Google推荐软连接方法用于生产环境。
| ln -s /data/docker /var/lib/docker ln -s /data/kubelet /var/lib/kubelet ln -s /data/containerd /var/lib/containerd |
特殊情况
新版docker和containerd需修改配置文件。
| vim /etc/containerd/config.toml |
开头部分配置改为。若无此配置,不修改,不添加。
| root = "/data/containerd" |
检查Docker配置,
| vim /etc/docker/daemon.json |
添加配置
| "data-root": "/data/docker |
推荐添加配置,规避日志爆满问题,
| "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } |
启动组件验证
场景1
在master node操作,
| kubectl uncordon node2 |
在node2操作,
| systemctl start containerd.service systemctl start docker systemctl start kubelet.service |
场景2
在所有node操作
| systemctl start containerd.service systemctl start docker systemctl start kubelet.service |
查询验证
| kubectl get node -A -o wide |
确认所有node状态正确

在STATUS列看到Ready
查看POD状态,确认无异常POD
| kubectl get pod -A -o wide |
Extracted Images

