记录一次kubesphere的k8s开发环境意外重启后启动问题解决思路


    公司的业务发展比较大,核心服务达到35个,整个k8s 集群达到了60多个pod。由于一些原因服务器需要重启,重启后docker 出现异常。kubesphere界面无法访问或者能够访问部分接口出现401的情况。本篇文章主要分享k8s无法启动时的解决过程,其实核心原因还是没有优雅的关停docker、kubernates服务导致异常的docker容器卡了无法清理。

 1748787002228.png

docker无法正常stop

执行dockerstop命令后,出现下面的警告信息,也就是docker服务还在活跃状态。

[root@localhost ~]# service docker stop
Redirecting to /bin/systemctl stop docker.service
Warning: Stopping docker.service, but it can still be activated by:
docker.socket


明显这个日志无法帮助解决k8s的问题,只会把你带入到另外一个问题旋涡


分析kubelet 日志

执行以下命令查询kubelet日志中的错误信息

journalctl -u kubelet -f         # 实时跟踪日志




输出的关键错误日志如下:

remote_runtime.go:116] "RunPodSandbox from runtime service failed" err="rpc error: 
code = Unknown desc = failed to create a sandbox for pod "kube-apiserver-localhost.localdomain": Error response from daemon: Conflict. The container name "/k8s_POD_kube-apiserver-localhost.localdomain_kube-system_bca292fec85788078b73395da5f9504b_22" is already in use by container "b90f25e9b29488b7a06640924fa633cf613c05b47e22454dc6fa217fd11caefd". You have to remove (or rename) that container to be able to reuse that name."


AI分析如下:

这个错误表明 kubelet 在尝试创建 Pod 沙箱(特别是 kube-apiserver 的 Pod)时遇到了容器命名冲突。

根本原因是 Docker 中已经存在一个同名的容器,导致新的容器无法创建。


问题分析:

      错误本质:Docker 报告容器名称 /k8s_POD_kube-apiserver-localhost.localdomain... 

已经被另一个容器 ID b90f25e9b294... 占用

典型场景:

      前一个容器未正常终止 Kubelet 或 Docker 进程异常崩溃后恢复 手动干预过容器导致状态不一致



解决

# 清理所有已退出的容器(可选,但建议)
sudo docker ps -aq --filter "status=exited" | xargs sudo docker rm -f

然后重启docker和kubelet

# 重启 Docker 和 Kubelet
sudo systemctl restart docker
sudo systemctl restart kubelet

到此问题解决,docker正常启动了,kubelet日志显示正常,kubesphere界面访问正常。然后在开始慢慢恢复服务pod。







来源: 雨林博客(www.yl-blog.com)