解开 Kubernetes 中 Pod 健康检查失败之谜

这篇具有很好参考价值的文章主要介绍了解开 Kubernetes 中 Pod 健康检查失败之谜。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Pipedrive Infra 在不同的云中(主要是 AWS 和本地 OpenStack)运营自管理的 Kubernetes 集群。

截至撰写本文时,我们管理着 20 多个不同的集群,规模大小不一,有些非常具体,有些则较小。

Pod 健康检查失败的历史

我们很久以前就注意到,有时 Pod 健康检查会无缘无故地失败,然后几乎立即恢复。但是,由于这种情况很少发生且不会影响任何事情,所以没有人认为这是一个问题。

但是,随后它变得更加频繁,这意味着开发人员开始更频繁地收到有关其部署健康状况的警报。当这种情况发生时,通常会首先询问基础设施团队,但没有任何报告:一切看起来都很健康。

我们决定找出这个问题的根本原因。起初,这种情况非常罕见,很难捕捉到事件。


步骤1:日志

  • Kubernetes 工作节点的 syslog — 没有任何信息。

  • Kubelet 日志 — 没有任何信息。

  • Containerd 日志 — 没有任何信息。

  • CNI 日志 — 没有任何信息。

  • 最近失败检查的 Pod 中的日志 — 没有任何信息:它们似乎很正常。

  • 失败的 Pod “朋友”的日志 — 没有任何信息:它们似乎没有检测到任何友好服务的停机时间。

但是健康检查仍然失败,而且发生得更加频繁,出现在更多的地方!

需要注意的是:

  • 它与云没有关系:我们在 AWS ec2 和本地虚拟机中都经历了相同的失败节奏。

  • 与 CNI 无关:不同的云使用不同的 CNI。我们在本地使用 calico,在 AWS 中使用 AWS CNI。

  • 与 Containerd 或 Kubernetes 版本无关:它在任何地方都失败了。

  • 不依赖于集群负载:它发生在测试环境中,在高峰期和夜间。

由于看起来是一个“网络问题”,所以这个问题被分配给了网络团队,他们想要查看实际的流量,并使用 tcpdump 进行了调查。


步骤2:tcpdump

在流量捕获中,我们注意到当 Kubelet 向 Pod 发送 TCP SYN 时,Pod 会回复 TCP SYN-ACK,但是 Kubelet 没有跟随 TCP ACK。经过一些重试后,Kubelet 建立了一个没有问题的 TCP 会话 — 这是一个完全随机的故障。

为了确保,我们检查了失败的 TCP 流中的 seq 和 ack 数字,一切都非常正常。

我们开始怀疑工作节点上的源进程:如果 Kubelet 发生了什么事情,它不想继续怎么办?


步骤3:ss

我们每秒钟检查一次“ss -natp”的输出。这应该显示一些东西 — 至少每个进程的连接数。

我们很快发现,失败的连接被卡在 SYN-SENT 中。这与我们在 tcpdump 中看到的不符,应该是 SYN-RECV。


步骤4:conntrack

在 Conntrack 中,损坏的连接被卡在 SYN-RECV 中,这至少是可以预期的。

在通过防火墙后将返回流量返回给 Kubelet 时可能会发生什么?什么可以防止 TCP SYN-ACK 到达 Kubelet 打开的套接字?

此时,我们已经没有更多的想法了,但我们注意到卡在 SYN-SENT 或 SYN-RECV 中的连接并不完全是随机的,因为所有源端口似乎都相似。

我们允许使用广泛的端口作为源:

net.ipv4.ip_local_port_range=12000 65001

有问题的端口看起来像是 30XXX 或 31XXX,这个范围看起来非常熟悉。


步骤5:ipvs

我们使用 ipvsadm 检查了我们的 ipvs 配置,并发现所有卡在连接中的端口都被 Kubernetes nodeport 保留了。

发现根本原因是这样的:Kubelet使用一个随机源端口(例如31055)向pod发起TCP会话。TCP SYN到达pod,pod回复TCP SYN-ACK到端口31055。回复命中IPVS,我们在Kubernetes服务上使用nodeport 31055的负载均衡器。TCP SYN-ACK被重定向到服务端点(其他pod)。结果是可预测的:没有人回答。

解决健康检查失败的方法是禁止使用nodeport范围作为TCP会话的源端口。

幸运的是,只需要一行代码:

net.ipv4.ip_local_reserved_ports=”30000–32768"

在所有节点上实施后,问题立即得到解决。具有讽刺意味的是,几个小时的故障排除只产生了一行代码。

作者:Roman Kuchin

更多技术干货请关注公号“云原生数据库

 文章来源地址https://www.toymoban.com/news/detail-438054.html

到了这里,关于解开 Kubernetes 中 Pod 健康检查失败之谜的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s之Pod及Probe 探针机制(健康检查机制)

    1.1、定义 Pod 是一组(一个或多个) 容器(docker容器)的集合 (就像在豌豆荚中);这些容器共享存储、网络、以及怎样运行这些容器的声明 - 我们一般不直接创建Pod,而是创建一些工作负载由他们来创建Pod 1.2、Pod的形式 Pod对容器有自恢复能力(Pod自动重启失败的容器)

    2024年02月12日
    浏览(46)
  • 【Kubernetes运维篇】零故障升级Pod健康探测详解

    中文官方参考文档: Pod探测是Kubernetes中的一种机制, 用于检测Pod的状态和健康状况。当探测到Pod状态不正常时,根据重启策略进行相应的Pod操作 ,探测可以帮助Kubernetes集群自动化地管理容器的健康状态,提高应用程序的可靠性和可用性。 探测针对Pod中容器进行操作,所以探

    2024年02月08日
    浏览(50)
  • python - kubernetes中grpc服务健康检查实现

    概述 kubernetes本身不支持gRPC健康检查,本文记录使用 ‘grpc-health-probe’ 实现grpc服务的健康检查 ‘grpc-health-probe’,这是 Kubernetes 原生的健康检查 gRPC 应用程序的方法 官方参考文档:https://kubernetes.io/zh-cn/blog/2018/10/01/health-checking-grpc-servers-on-kubernetes/ 示例 下载grpc-health-probe文件

    2024年02月09日
    浏览(40)
  • 【k8s】:如何进行 Kubernetes 集群健康检查?

    💖The Begin💖点点关注,收藏不迷路💖 在使用 Kubernetes(k8s)部署应用程序时,保证集群的健康状态至关重要。通过定期的健康检查,可以及时发现并解决可能导致应用程序中断或故障的问题,确保集群的稳定性和可靠性。 将列出所有节点的状态,包括节点的名称、状态、版

    2024年04月16日
    浏览(42)
  • Kubernetes(k8s)健康性检查:livenessprobe探测和readinessprobe探测

    目录 一.系统环境 二.前言 三.Kubernetes健康性检查简介 四.创建没有探测机制的pod 五.添加livenessprobe探测 5.1 使用command的方式进行livenessprobe探测 5.2 使用httpGet的方式进行livenessprobe探测 5.3 使用tcpSocket的方式进行livenessprobe探测 六.readinessprobe探测 七.总结 本文主要基于Kubernetes1.

    2024年02月07日
    浏览(48)
  • 🔥🔥网络之谜:记一次失败排查的故事

    在这篇文章中,我们将详细探讨导致故障的可能原因以及解决方案,以便更好地理解故障排查的复杂性和艰巨性,尤其是当出现与本次故障表现相似的问题时。 首先,让我们回顾一下故障的表现。在客户端调用接口时,发现一直在转圈等待,而服务器端却收到了请求并在返回

    2024年02月05日
    浏览(56)
  • Kubernetes对象深入学习之五:TypeMeta无效之谜

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习之五》系列的第五篇,从前文的分析也能看出,代表对象类型的schema.ObjectKind,于对象而言是至关重要的,那是它的类型和身份,既然如此

    2024年02月11日
    浏览(34)
  • 【微服务部署】03-健康检查

    Liveness Readiness Startup 1.1 LivenessProbe 判断服务是否存活 结束“非存活”状态服务 根据重启策略决定是否重启服务 1.2 ReadinessProbe 判断服务是否“就绪” “就绪”状态的服务可以接收请求 非“就绪”状态的服务将会被从流量负载中摘除 1.3 StartupProbe 检测应用程序是否启动成功

    2024年02月11日
    浏览(41)
  • 17、Health Check 健康检查

    强大的自愈能力是kubernetes容器编排引擎的重要特性。 自愈的默认实现方式是自动重启发生故障的容器 。除此之外,还可通过 Liveness和Readiness探测机制 设置更精细的健康检查,进而实现如下要求: 零停机部署 避免部署无效的镜像 更加安全的滚动升级 Liveness探测和Readiness探测

    2024年02月07日
    浏览(49)
  • docker中设置容器健康检查

    在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否: 0 :成功; 1 :失败; 2 :保留值,不要使用 容器启动之后,初始状态会为 starting (启动中)。Docker Engine会等待 interval 时间,开始执行健康

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包