docker - 如何在 Kubernetes 中检测 Pod 中发生的异常?
问题描述
我有一个多节点 Kubernetes 集群。多个服务部署为 Pod。它们通过rabbitmq相互通信,rabbitmq也作为集群中的Pod存在。
问题场景:
很多时候服务无法连接到 Rabbitmq 中所需的队列。Rabbitmq pod 日志和服务 Pod 中也会报告相同的日志。这主要是由于连接问题而发生的,并且不一致。由于此故障,功能中断。而且由于这不是崩溃,因此 pod 在 kubernetes 中始终处于运行状态。为了解决这个问题,我们必须手动去重启 Pod。
我想为每个 pod 创建一个活性探针。但是这应该如何捕捉异常呢?由于服务中的许多进程都可以尝试访问连接,因此它们中的任何一个都可能失败。
解决方案
我建议为 liveness 探针实现 http 端点,该端点将检查与 rabbitmq 的连接状态,或者当 rabbitmq 连接不起作用时实际失败并退出整个过程。
但是......最好的解决方案是在连接失败时无限期地重试连接,以便透明地恢复临时网络问题。写得好的服务应该等待依赖的服务开始运行,而不是把故障级联到堆栈上。
想象一下,您使用该 rabvbit 或其他服务对 20 项服务进行了活动检查。该服务关闭了一段时间,最终得到的集群有 20 多个处于 CrashLoopBackoff 状态的服务,这是由于故障时的增量回退。这意味着当最初失败的服务恢复时,您的集群将需要一些时间来恢复,而且情况会非常混乱,并且乍一看更难理解发生了什么。
推荐阅读
- postgresql - Kafka Connect JDBC Sink quote.sql.identifiers 不工作
- javascript - 如果按下单选按钮,则尝试提取计算
- docusignapi - 避免在使用复合模板创建 DocuSign 信封时多次重复收件人信息
- ionic3 - 错误:无法读取未定义的属性“解决”
- node.js - 在 Docker 映像中创建 Let's Encrypt 证书和 Certbot
- angular - 如何在嵌套组件中只执行一次订阅 ngOnInit
- linux - Docker登录x509:未知权威签署的证书
- python - 如何过滤不包含在另一个列表中的元组(x,y)列表?
- elasticsearch - Minikube - 如果使用现有索引,则无法从弹性搜索中获得任何结果
- c - 如何在我的 gcc 编译器中链接第 3 方库 bzip2?