如何平滑切换Containerd数据目录
大家好,我是秋意零。
这是工作中遇到的一个问题。搭建的服务平台,在使用的过程中频繁出现镜像本地拉取不到问题(在项目群聊中老是被人@出来😅)原因是由于/目录空间不足导致,本地镜像被kubelet自动清理。
有多不足呢,平台监控频繁显示磁盘空间达到80%以上,一看/目录空间竟然只有50G。。这也影响到系统的长期使用了。
从这个分区上看,应该是在安装系统时采用了系统默认分区。在得知是测试相关人员才学会安装系统时,也就能理解了。
个人建议:在安装系统时,请不要使用默认的分区。可参考下列分区规范:
- /boot分区:1G
- /swap分区:2G
- /分区:剩余的所有空间
我作为运维人员,其实也早发现了该问题,出于对业务的不熟悉,以为他们有自己的需求。以至于没有反馈,然而没想到这个安装系统的人员是才学会的,这就比较尴尬了。。(哪有什么个性需求)
该系统部署的K8s集群。所以目前使用根/目录空间的比较严重的是Containerd运行时,容器的系统(rootfs)目录。
目前已知解决办法有两个:
- 磁盘扩容;
- 修改Containerd持久化目录,使其不使用根/目录空间。
由于,暂时没有多余的盘符添加。这里采用修改Containerd持久化目录,来处理。
Containerd 数据目录介绍
containerd
的 root
和 state
目录各有不同的用途:
- root 目录 (
/var/lib/containerd
):
-
- 这个目录用于存储
containerd
的持久数据,包括镜像、容器的文件系统层等数据。 - 通常是较为永久的存储,用于在服务重启后仍然可以保留的数据。
- 这个目录用于存储
- state 目录 (
/run/containerd
):
-
- 这个目录用于存储
containerd
的临时状态信息,例如运行时的临时文件和套接字。 - 由于它位于
/run
下,这些文件通常不会在系统重启后保留。
- 这个目录用于存储
下列操作部分只迁移切换了/var/lib/containerd
目录下的数据。在进行测试迁移/run/containerd
目录数据时这里由于始终有容器在使用该目录下的文件,未能将数据移至其它地方。所以在不清楚影响的情况下,不敢冒然操作。
不知各位佬有没用什么好的方法呢?
平滑切换 操作部分
如果需要修改多个节点的Containerd数据目录,重复执行下列步骤即可。
1)设置需要操作节点,为不可调度
# 设置节点为不可调度状态
kubectl cordon k8s-node-1
重启操作节点上的Pod,使其重新调度到其它节点
kubectl delete pod -nrbd-system $(kubectl get pod -nrbd-system -owide | grep k8s-node-1 | awk '{print $1}')
2)移动Containerd数据目录中的数据
创建新磁盘,划分区,设置开启自动挂载
# 创建需要修改目录
mkdir -p /test/var/lib/containerdmkdir -p /public/containerd_data
# 设置开启自动挂载
cat >> /etc/rc.d/rc.local << EOF
sleep 3
mount /dev/sdb1 /test
EOF
关闭Containerd
systemctl stop containerd
移动数据,并创建软连接
mv /var/lib/containerd/* /test/var/lib/containerd
rm -rf /var/lib/containerd/
ln -s /test/var/lib/containerd /var/lib/containerd
3)恢复
启动Containerd
systemctl restart containerd
systemctl restart kubelet
恢复节点为可调度状态
kubectl uncordon k8s-node-1
4)其它
如果出现节点状态是NotReady状态,那么重启对应节点上的网络插件即可
[root@k8s-master-1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready control-plane 6d18h v1.25.10
k8s-node-1 NotReady worker 6d18h v1.25.10# 重启网络插件
kubectl delete pod -n kube-system calico-node-jrf8p