在 GKE 上进行活动/就绪探测检查时,Kubelet 会定期丢失与 pod 的 TCP 连接

2024-02-02

我们在单个 GKE(谷歌 kubernetes 引擎)集群节点中部署了一个软件系统,该节点使用大约 100 个 pod,在每个 pod 中我们定义了 TCP 就绪探针,现在我们可以看到就绪探针定期失败,并显示Unable to connect to remote host: Connection refused在不同的 Pod 上。

通过集群节点和故障 pod 上的 tcpdump 跟踪,我们发现从集群节点发送的数据包似乎是正确的,而 pod 没有收到 TCP 数据包,但故障 pod 仍然可以接收 IP 广播数据包。

奇怪的是,如果我们从故障 pod 中 ping/curl/wget 集群节点,无论集群节点是否有 http 服务,TCP 连接都会立即恢复,并且就绪检查也会变得正常。

示例如下:

集群节点主机:10.44.0.1 失败的 Pod 主机:10.44.0.92

集群节点cbr0接口上的tcpdump:

#sudo tcpdump -i cbr0  host 10.44.0.92

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on cbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:33:52.913052 ARP, Request who-has 10.44.0.1 tell 10.44.0.92, length 28
17:33:52.913181 ARP, Reply 10.44.0.1 is-at 0a:58:0a:2c:00:01 (oui Unknown), length 28
17:33:57.727497 IP 10.44.0.1.47736 > 10.44.0.92.mysql: Flags [S], seq 756717730, win 28400, options [mss 1420,sackOK,TS val 1084890021 ecr 0,nop,wscale 7], length 0
17:33:57.727537 IP 10.44.0.92.mysql > 10.44.0.1.47736: Flags [R.], seq 0, ack 756717731, win 0, length 0
17:34:07.727563 IP 10.44.0.1.48202 > 10.44.0.92.mysql: Flags [S], seq 2235831098, win 28400, options [mss 1420,sackOK,TS val 1084900021 ecr 0,nop,wscale 7], length 0
17:34:07.727618 IP 10.44.0.92.mysql > 10.44.0.1.48202: Flags [R.], seq 0, ack 2235831099, win 0, length 0
17:34:12.881059 ARP, Request who-has 10.44.0.92 tell 10.44.0.1, length 28
17:34:12.881176 ARP, Reply 10.44.0.92 is-at 0a:58:0a:2c:00:5c (oui Unknown), length 28

这些是从 Kubelet 发送的准备情况检查数据包,我们可以看到故障节点响应Flags [R.], seq 0, ack 756717731, win 0, length 0这是一个 TCP 握手 ACK/SYN 回复,它是一个失败的数据包,并且 TCP 连接将不会建立。

如果我们exec -it到发生故障的 Pod 并从该 Pod 对集群节点执行 ping 操作,如下所示:

root@mariadb:/# ping 10.44.0.1
PING 10.44.0.1 (10.44.0.1): 56 data bytes
64 bytes from 10.44.0.1: icmp_seq=0 ttl=64 time=3.301 ms
64 bytes from 10.44.0.1: icmp_seq=1 ttl=64 time=0.303 ms

然后让我们从 TCP 转储中查看集群节点端发生了什么:

#sudo tcpdump -i cbr0  host 10.44.0.92

17:34:17.728039 IP 10.44.0.92.mysql > 10.44.0.1.48704: Flags [R.], seq 0, ack 2086181490, win 0, length 0
17:34:27.727638 IP 10.44.0.1.49202 > 10.44.0.92.mysql: Flags [S], seq 1769056007, win 28400, options [mss 1420,sackOK,TS val 1084920022 ecr 0,nop,wscale 7], length 0
17:34:27.727693 IP 10.44.0.92.mysql > 10.44.0.1.49202: Flags [R.], seq 0, ack 1769056008, win 0, length 0
17:34:34.016995 ARP, Request who-has 10.44.0.1 tell 10.44.0.92, length 28
17:34:34.018358 ARP, Reply 10.44.0.1 is-at 0a:58:0a:2c:00:01 (oui Unknown), length 28
17:34:34.020020 IP 10.44.0.92 > 10.44.0.1: ICMP echo request, id 53, seq 0, length 64
17:34:34.020101 IP 10.44.0.1 > 10.44.0.92: ICMP echo reply, id 53, seq 0, length 64
17:34:35.017197 IP 10.44.0.92 > 10.44.0.1: ICMP echo request, id 53, seq 1, length 64
17:34:35.017256 IP 10.44.0.1 > 10.44.0.92: ICMP echo reply, id 53, seq 1, length 64
17:34:36.018589 IP 10.44.0.92 > 10.44.0.1: ICMP echo request, id 53, seq 2, length 64
17:34:36.018700 IP 10.44.0.1 > 10.44.0.92: ICMP echo reply, id 53, seq 2, length 64
17:34:37.019791 IP 10.44.0.92 > 10.44.0.1: ICMP echo request, id 53, seq 3, length 64
17:34:37.019837 IP 10.44.0.1 > 10.44.0.92: ICMP echo reply, id 53, seq 3, length 64
17:34:37.730849 IP 10.44.0.1.49666 > 10.44.0.92.mysql: Flags [S], seq 1304758051, win 28400, options [mss 1420,sackOK,TS val 1084930025 ecr 0,nop,wscale 7], length 0
17:34:37.730900 IP 10.44.0.92.mysql > 10.44.0.1.49666: Flags [S.], seq 1267340310, ack 1304758052, win 28160, options [mss 1420,sackOK,TS val 3617117819 ecr 1084930025,nop,wscale 7], length 0
17:34:37.730952 IP 10.44.0.1.49666 > 10.44.0.92.mysql: Flags [.], ack 1, win 222, options [nop,nop,TS val 1084930025 ecr 3617117819], length 0
17:34:37.731149 IP 10.44.0.1.49666 > 10.44.0.92.mysql: Flags [F.], seq 1, ack 1, win 222, options [nop,nop,TS val 1084930025 ecr 3617117819], length 0
17:34:37.731268 IP 10.44.0.92.mysql > 10.44.0.1.49666: Flags [P.], seq 1:107, ack 2, win 220, options [nop,nop,TS val 3617117819 ecr 1084930025], length 106
17:34:37.731322 IP 10.44.0.1.49666 > 10.44.0.92.mysql: Flags [R], seq 1304758053, win 0, length 0
17:34:47.728119 IP 10.44.0.1.50138 > 10.44.0.92.mysql: Flags [S], seq 502800802, win 28400, options [mss 1420,sackOK,TS val 1084940022 ecr 0,nop,wscale 7], length 0
17:34:47.728179 IP 10.44.0.92.mysql > 10.44.0.1.50138: Flags [S.], seq 4294752326, ack 502800803, win 28160, options [mss 1420,sackOK,TS val 3617127816 ecr 1084940022,nop,wscale 7], length 0

我们可以看到ICMP数据包是从pod发送的ping命令的数据包,在ICMP数据包之后,准备检查数据包现在立即变得正确,TCP句柄交换成功。

不仅 ping 可以让它工作,其他命令如curl/wget 也可以让它工作,只需要从故障的 pod 到达集群节点,之后集群节点到 pod 的 TCP 连接就会变得正确。

失败的 Pod 会时不时地发生变化,它可能发生在任何 Pod 上,因为节点上有 100 个 Pod 正在运行,不确定它是否会触发某些系统限制,但是所有其他 Pod 都正常工作,我们没有看到巨大的 CPU 利用率,并且节点上仍然剩余几 GB 内存。

有谁知道问题可能是什么?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GKE 上进行活动/就绪探测检查时,Kubelet 会定期丢失与 pod 的 TCP 连接 的相关文章

随机推荐

  • SUMIF 的 Google Apps 脚本替代方案

    我对 JavaScript 相当陌生 希望通过制作一些简单的脚本来进步我的学习 这些脚本将帮助我自动化一些流程 我的第一个脚本是从电子表格中查找客户的预算 以便我可以计算活动是否需要暂停 到目前为止我已经得到了这个 function mai
  • 切换回packages.config - 答案澄清

    根据规则 我必须提出一个新问题 以获得对另一个问题 答案的一些澄清 这个答案是这样的 https stackoverflow com a 45964469 305916 https stackoverflow com a 45964469
  • 带有 html 内容的 bootstrap 弹出窗口

    我试图将 bootstrap popover 内容与 html 属性分开 就像对其他组件所做的那样 但我无法让它工作
  • Composer更新和Composer全局更新之间的区别

    两者有什么区别composer update and composer global update在yii2中 这与 Yii 没有直接关系 Composer 允许您全局或每个项目 默认 安装依赖项 https getcomposer org
  • 旧代码给出“未使用的参数”错误,但以前从未出现过

    我打开了一些旧的 iOS 代码 当我尝试构建它时 我收到如下代码的 未使用参数 错误 void searchBarTextDidBeginEditing UISearchBar searchBar NSLog Search Bar isn
  • C# if-null-then-null 表达式

    只是为了好奇 方便 C 提供了我所知道的两个很酷的条件表达式功能 string trimmed input null null input Trim and string trimmed input Trim 对于我经常遇到的情况 我想念另
  • 如何在 UICollectionViewCell 中舍入 UIImageView?

    在我的 UICollectionViewCell 类中我写了这个 void layoutSubviews super layoutSubviews self myImageView layer cornerRadius CGRectGetH
  • 在 Jenkins 管道中使用的 groovy 脚本中调用 shell 命令

    我有一个 Jenkins 管道脚本 其中加载了一个外部 Groovy 脚本 其中包含一些执行构建的函数 这些函数应该是普通的常规函数 因为如果有人在本地计算机上的某个地方运行构建 我也想在 Jenkins 之外使用它们 在这些函数中 我需要
  • html5:将画布复制到图像并返回

    我在画布元素上实现了放大和缩小功能 它的工作原理是缩放画布 平移画布 然后再次重绘整个场景 问题是 重新绘制所有内容需要花费很多时间 因为我的画布上有很多东西 我需要一种方法将画布复制到图像对象 然后将图像复制回画布而不损失质量 将canv
  • Rails 未定义 NilClass:Class 的方法“model_name”

    我有一个表单 我想出现在每个页面的顶部 因此我将其包含在 app views layouts application html erb 文件中 但出现错误undefined methodmodel name for NilClass Cla
  • 在 Web 应用程序中存储大型临时“会话”数据的好方法是什么

    我的公司有一个第三方网络服务 我们正在为其设计前端 此 Web 服务使用的 对象 非常大 并且根据创建的子实体的数量而变化 Web 服务不公开提交 加载子实体的方法 仅公开完整的对象层次结构 UI 本身分为许多子屏幕和主 详细视图 以便能够
  • Facebook:使用共享对话框共享 Play 商店链接

    我使用 Facebook Android SDK 中的共享对话框共享链接 我的代码如下所示 FacebookDialog shareDialog new FacebookDialog ShareDialogBuilder this setN
  • Django 模板:如何连接命名 URL 和字符串?

    我有以下设置 The urls py该项目的应用程序 urlpatterns url r main include main urls namespace main The main app s urls py urlpatterns ur
  • iPhone:如何加密字符串

    我想在 iPhone 上使用 AES 256 加密字符串 但通过谷歌没有找到太多信息 我想做的是将一些数据作为我正在创建的游戏的一部分发布到网站上 但我不希望用户能够通过查看其发布方式来作弊 因为它是纯文本 因此 我想将一个加密字符串发布到
  • CSS 文本转换“昂贵”吗?

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Is CSS text transform加工成本高吗 在我看来 浏览器被迫做一些通常不需要的工作 如果你没有转型 但是这是一个很大的
  • 将参数传递给 django admin 中的内联表单

    我有一个继承自 ModelAdmin 的管理类 class TemplateAdmin admin ModelAdmin inlines TemplateAttributeInline CompanyAttributeInline list
  • 什么是 ng-transinclude?

    我在 StackOverflow 上看到了很多讨论 ng transclude 的问题 但没有一个问题能通俗地解释它是什么 文档中的描述如下 标记使用嵌入的最近父指令的嵌入 DOM 的插入点的指令 这相当令人困惑 有人能够用简单的术语解释
  • 将两个原始值转换为 32 位 IEEE 浮点数

    我正在尝试通过 TCP modbus 解码来自 Shark 100 功率计的一些数据 我已经成功地拉下了我需要的寄存器 并从寄存器中留下了两个原始值 如下所示 17138 59381 从手册中 我知道我需要将这两个数字转换为32位IEEE浮
  • HTTP 响应如何找到正确的浏览器窗口?

    如果您打开了两个浏览器窗口 并且使用每个窗口导航到不同的网站 那么软件如何知道哪个 HTTP 响应属于哪个浏览器实例 Update 看来是通过入站 TCP 端口号来区分的 但是不涉及 TCP UDP 的网络消息又如何呢 例如 如果您打开两个
  • 在 GKE 上进行活动/就绪探测检查时,Kubelet 会定期丢失与 pod 的 TCP 连接

    我们在单个 GKE 谷歌 kubernetes 引擎 集群节点中部署了一个软件系统 该节点使用大约 100 个 pod 在每个 pod 中我们定义了 TCP 就绪探针 现在我们可以看到就绪探针定期失败 并显示Unable to connec