低版本kubernetes节点卡死重置恢复方法

Kubernetes节点卡死重置恢复方法

在Kubernetes集群中,由于各种原因可能导致节点出现卡死情况。本文将介绍如何通过彻底清理和重启来解决低版本Kubernetes节点的卡死问题,并提供一些兜底方案以应对特殊情况。

引言

当Kubernetes节点出现卡死时,通常需要进行系统级别的重置操作以便恢复服务。以下是推荐的操作步骤以及在特殊情况下可采用的兜底方案。这些方法可以帮助你快速解决问题并恢复正常的服务运行状态。

推荐方案

1. 停止所有容器

首先停止当前运行的所有容器。

docker stop $(docker ps -q)

2. 删除所有容器(包括停止和正在运行的)

接下来,删除所有的Docker容器以确保彻底清理。

docker rm $(docker ps -a -q)

3. 重启 Docker 和 Kubelet

最后,重启 Docker 和 Kubelet 来重新启动节点上的容器服务。

systemctl restart docker && systemctl restart kubelet

兜底方案(非必要不使用)

在某些极端情况下,推荐的重置方法可能无法解决问题。例如:

rm -rf containers/ overlay2/

此时可能会遇到如下的错误信息:

rm: cannot remove 'containers/[...]/mounts/shm': Device or resource busy

1. 强制卸载所有挂载点

可以通过强制卸载容器运行时的挂载点来解决问题。

umount -lf /var/lib/docker/containers/*/mounts/shm
umount -lf /var/lib/docker/overlay2/*/merged

或者使用批量卸载命令:

mount | grep kubelet | awk '{print $3}' | xargs -I {} umount -l {}

2. 杀死残留的 shim 和 runc 进程

如果存在僵尸进程,可以先杀掉它们。

ps -ef | grep -E 'containerd-shim|runc' | grep -v grep | awk '{print $2}' | xargs kill -9

3. 重启 Docker 和 Kubelet

完成上述操作后,再次重启Docker和Kubelet。

systemctl restart docker && systemctl restart kubelet

使用兜底方案的特征

1. 大量 containerd-shim 僵尸残留进程

当出现以下日志时:

docker.service: Unit process xxx (containerd-shim) remains running after unit stopped.
This usually indicates unclean termination of a previous run

说明Kubernetes节点中的Docker容器在正常停止时未能正确回收Shim进程,导致大量僵尸进程占用资源。

2. Docker 内部元数据并发锁冲突(关键卡死点)

遇到如下错误:

Error (Unable to complete atomic operation, key modified) deleting object [endpoint ...] retrying....

这表明Docker内部的网络端点和对象数据库出现了原子操作失败的情况,导致资源无法正常释放。

3. 持续 shim 断开清理告警

出现以下警告信息:

cleaning up after shim disconnected

4. Docker 卡死

遇到如下情况时表明Docker已经卡死:

KubeletNotReady container runtime status check may not have completed yet
Skipping pod synchronization err="container runtime status check failed"
Ready: False KubeletNotReady: PLEG is not healthy: pleg was last seen active 3m27s ago; threshold is 3m0s

kubelet 日志查看

可以通过以下命令查看kubelet的日志信息:

journalctl -u kubelet --no-pager

总结

本文介绍了处理低版本Kubernetes节点卡死问题的方法,包括推荐的清理和重启方案以及在特殊情况下使用的兜底方案。通过这些步骤,可以有效解决由僵尸进程、并发锁冲突等问题引起的节点卡死情况。

建议在执行兜底方案时谨慎操作,并先尝试使用推荐方法来解决问题。如果需要进一步诊断具体原因,请参考kubelet日志文件以获取更多线索。