Kubernetes 恢复虚拟机快照后 Pod 一直 ContainerCreating,Calico Unauthorized 问题排查全过程(新手踩坑记录)
最近在做 Kubernetes 实验的时候,我遇到了一个非常离谱的问题:恢复虚拟机快照之后,Pod 一直卡在 ContainerCreating。
当时我一度以为是镜像拉取失败、网络问题,甚至怀疑是时间同步的问题。折腾了很久才发现,原来是 Calico 网络插件认证失效。
这篇文章就记录一下我整个排查和解决的过程,希望以后自己再遇到类似问题能少走点弯路。
一、事情的起因
我当时在虚拟机里跑了一个 Kubernetes 集群,里面已经部署了一些组件,比如:
-
monitoring(Prometheus 监控)
-
argocd
-
ai-services(我自己部署的 ollama 服务)
后来因为实验需要,我直接 恢复了 VMware 的快照。
恢复之后第一件事我就看了一下集群状态:
kubectl get pods -A
结果发现:
ai-services ollama-xxxx 0/1 ContainerCreating
一直卡着不动。
二、最开始的错误判断
一开始我以为是 镜像拉取问题。
因为 ContainerCreating 很多时候是:
-
拉取镜像
-
创建容器
-
挂载卷
-
启动容器
所以我第一反应是:
-
Docker Hub 网络慢
-
镜像没拉下来
但是等了很久也没动静。
三、查看 Pod 详细信息
于是我开始用 Kubernetes 排错最常用的一条命令:
kubectl describe pod <pod名字> -n ai-services
然后在 Events 里面看到了关键报错:
Failed to create pod sandbox:
plugin type="calico" failed (add):
error getting ClusterInformation:
connection is unauthorized: Unauthorized
看到这里基本就确定了:
不是镜像问题,是网络插件的问题。
我用的 Kubernetes 网络插件是 Calico。
四、为什么恢复快照会导致这个问题
后来查了一下原理,大概是这样的:
Kubernetes 里面很多组件都会用 ServiceAccount Token 去访问 API Server。
比如:
-
kubelet
-
calico
-
controller
而这些 Token 是会刷新的。
当我 恢复虚拟机快照的时候,就会出现一个问题:
API Server 状态 = 新的
Calico Pod 里的 Token = 旧的
于是 Calico 访问 API Server 的时候就会报:
Unauthorized
然后就导致:
Pod 网络创建失败
↓
Pod sandbox 创建失败
↓
Pod 一直 ContainerCreating
五、解决办法(其实非常简单)
知道原因之后解决方法就很简单了:
重启 Calico。
执行:
kubectl delete pod -n kube-system -l k8s-app=calico-node
然后再执行:
kubectl delete pod -n kube-system -l k8s-app=calico-kube-controllers
Kubernetes 会自动重新创建这些 Pod。
新的 Pod 会重新获取 Token。
六、验证是否恢复正常
然后我再看了一下系统组件:
kubectl get pods -n kube-system
等 calico-node 变成:
Running
再查看业务 Pod:
kubectl get pods -A
这时候我的 ollama 终于变成:
Running
问题解决。
七、这次踩坑总结
这次最大的教训就是:
恢复虚拟机快照对 Kubernetes 影响非常大。
因为 Kubernetes 里面很多组件都是有:
-
Token
-
证书
-
状态同步
一旦时间回退或者状态回退,就可能导致认证问题。
以后如果我再遇到:
Pod ContainerCreating
Calico Unauthorized
我会第一时间想到:
重启 Calico。
八、给和我一样的新手的建议
如果你也遇到类似情况,可以按这个顺序排查:
1️⃣ 看 Pod 状态
kubectl get pods -A
2️⃣ 查看 Pod 详细信息
kubectl describe pod <pod名>
3️⃣ 看 Events
如果出现:
calico Unauthorized
直接重启 Calico:
kubectl delete pod -n kube-system -l k8s-app=calico-node
基本就能解决。
结尾
这次折腾了很久,其实最后发现解决方法只有一条命令。
有时候 Kubernetes 排错就是这样:
你可能会怀疑网络、怀疑镜像、怀疑配置,但最后发现只是某个组件需要重启。
记录一下这次踩坑,希望以后少踩坑。
更多推荐




所有评论(0)