Kubernetes中Pod/容器运行但kubectl get pods未列出,疑似存在隐藏部署
排查Kubernetes中隐藏Pod导致指标异常的问题
这问题确实有点诡异——明明应该有两个部署在跑,kubectl get pods只看到一组Pod,但InfluxDB里却出现了两个不同的Pod名称标签,说明确实有“隐形”的容器在发送数据。我之前遇到过类似的情况,咱们一步步来拆解排查:
第一步:先确认Kubernetes基础状态,排除“自己看错了”的情况
- 检查命名空间和上下文:很多时候是不小心切了错误的集群/命名空间。先跑
kubectl config get-contexts确认当前上下文是不是目标集群,再用kubectl get pods --all-namespaces查看所有命名空间的Pod,说不定另一个部署的Pod在你没注意的命名空间里。 - 确认Deployment的状态:执行
kubectl get deployments --all-namespaces,看看是不是真的存在两个Deployment,它们的DESIRED和AVAILABLE副本数是否匹配。如果其中一个Deployment的AVAILABLE是0,但DESIRED是1,说明Pod可能处于异常状态没被正常显示。
第二步:检查“非活跃”状态的Pod
有时候Pod已经被标记为终止或异常,但容器还在运行(比如应用没正确处理终止信号),kubectl get pods默认可能不会显示这些状态的Pod:
- 执行
kubectl get pods --all-namespaces -o wide --field-selector=status.phase!=Running,看看有没有处于Terminating、Error或CrashLoopBackOff状态的Pod。这些Pod虽然不在正常运行列表里,但容器可能还在发送指标。 - 如果发现了Terminating状态的Pod,可以检查为什么它无法正常终止:跑
kubectl describe pod <pod-name>看事件日志,或者登录节点用docker logs <container-id>查看容器的退出日志。如果是应用没处理SIGTERM信号,需要修复应用的优雅退出逻辑,或者用kubectl delete pod <pod-name> --force --grace-period=0强制清理。
第三步:直接检查节点上的容器(绕过Kubernetes API)
如果Kubernetes API Server和kubelet之间的通信出了问题,API Server可能无法同步节点上的容器状态,导致kubectl看不到实际运行的容器:
- 登录到集群的每个节点,用容器 runtime 的命令查看所有运行中的容器:
- 如果用Docker:
docker ps | grep -E "(golang|telegraf)" - 如果用containerd:
crictl ps | grep -E "(golang|telegraf)"
- 如果用Docker:
- 如果在节点上找到了kubectl没显示的容器,说明kubelet没有把这些容器的状态上报给API Server。此时可以检查kubelet的日志(比如
journalctl -u kubelet),看有没有API Server通信失败的错误,或者重启kubelet服务试试。
第四步:验证InfluxDB指标的时效性
有时候可能是旧数据“捣乱”:比如之前运行的Pod虽然被删除了,但InfluxDB里的历史指标没清理,导致你看到的两个Pod名称里有一个是旧的。
- 查看InfluxDB中指标的时间戳,确认两个Pod名称的指标是不是都是最近产生的。如果其中一个是旧数据,可以设置InfluxDB的数据保留策略,自动清理过期指标。
最后,如果以上步骤都没解决
可以提供以下信息来进一步定位:
kubectl describe deployment <deploy-name>(两个Deployment都要)的输出- 节点上
docker ps/crictl ps的结果 - InfluxDB指标的时间范围和具体标签值
内容的提问来源于stack exchange,提问作者theoneandonly2




