首页 > 解决方案 > 如何在 Kubernetes 中检测 Pod 中发生的异常?

问题描述

我有一个多节点 Kubernetes 集群。多个服务部署为 Pod。它们通过rabbitmq相互通信,rabbitmq也作为集群中的Pod存在。

问题场景:

很多时候服务无法连接到 Rabbitmq 中所需的队列。Rabbitmq pod 日志和服务 Pod 中也会报告相同的日志。这主要是由于连接问题而发生的,并且不一致。由于此故障,功能中断。而且由于这不是崩溃,因此 pod 在 kubernetes 中始终处于运行状态。为了解决这个问题,我们必须手动去重启 Pod。

我想为每个 pod 创建一个活性探针。但是这应该如何捕捉异常呢?由于服务中的许多进程都可以尝试访问连接,因此它们中的任何一个都可能失败。

标签: dockerkubernetesrabbitmqkubectl

解决方案


我建议为 liveness 探针实现 http 端点,该端点将检查与 rabbitmq 的连接状态,或者当 rabbitmq 连接不起作用时实际失败并退出整个过程。

但是......最好的解决方案是在连接失败时无限期地重试连接,以便透明地恢复临时网络问题。写得好的服务应该等待依赖的服务开始运行,而不是把故障级联到堆栈上。

想象一下,您使用该 rabvbit 或其他服务对 20 项服务进行了活动检查。该服务关闭了一段时间,最终得到的集群有 20 多个处于 CrashLoopBackoff 状态的服务,这是由于故障时的增量回退。这意味着当最初失败的服务恢复时,您的集群将需要一些时间来恢复,而且情况会非常混乱,并且乍一看更难理解发生了什么。


推荐阅读