数据迁移-kubernetes磁盘爆满问题处理

说明

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