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