解决pod健康检查问题

解决,pod,健康检查,问题 · 浏览次数 : 207

小编点评

**解决方法:** 1. **查看 Kubernetes worker 日志:**检查日志中是否有关于健康检查失败的错误信息。 2. **使用 tcpdump 抓取流量:**在 kubelet 给 pod 发送 TCP SYN 后,检查其回复的 TCP ACK 报文。如果 kubelet 没有发送 ACK 报文,说明问题可能存在。 3. **使用 ss 命令监控 TCP 连接:**每秒调用一次,检查所有与 pod 相连的 TCP 连接状态。如果发现卡顿的连接卡在 SYN-SENT 阶段,说明 kubelet 无法接收回复。 4. **使用 conntrack 检查 TCP 网络连接跟踪:**分析 TCP 网络连接状态,查找卡顿的连接。 5. **修改内核参数:**设置 `net.ipv4.ip_local_reserved_ports` 参数,将其值设置为 `30000-32768`。 6. **重启 Kubernetes worker:**重启 worker 进程,确保它重新配置了 IP 地址。

正文

解决pod健康检查问题

引自:Solving the mystery of pods health checks failures in Kubernetes。原文中的某些描述并不清晰,本文作了调整。

很早以前,环境中的pod有时候会遇到健康检查失败的问题,但并没有什么明显表征,且几乎是立马就会恢复。由于这种情况很少发生,且不会对业务造成影响,因此起初并没有人关注该问题。

但后来发生的频率越来越高,导致开发人员频繁接收到deployment的健康告警。

第1步:查看日志

  • Kubernetes worker的系统日志 -- 无异常
  • kubelet 日志 -- 无异常
  • Containerd 日志 -- 无异常
  • CNI 日志 -- 无异常
  • 检查最近失败的pod日志 -- 无异常

通过检查相关日志,并没有发现什么异常

第2步:tcpdump

在抓取的流量中发现,当kubelet给pod发送TCP SYN之后,pod会回复SYN-ACK,但kubelet并没有发送TCP ACK。在一段时间的重试之后,Kubelet会建立起一条TCP会话,因此该问题是随机发生的。

为以防万一,我们检查了TCP中的seq和ack序列号,并没有发现问题。

此时怀疑worker可能存在问题:是不是Kubelet没有处理接收到的报文?

第3步:ss

每秒调用一次"ss -natp"来查看kubelet进程连接,此时发现失败的连接卡在了SYN-SENT阶段,说明kubelet并没有接收到pod发来的SYN-ACK报文。

第4步:conntrack

使用conntrack查看TCP网络连接跟踪,发现有的连接卡在SYN-SENT状态(kubelet侧),有的连接卡在SYN-RECV(pod侧),但连接的源端口号看起来都类似。

在我们的环境中,设定了一个较大的源端口可选范围:

net.ipv4.ip_local_port_range=12000 65001

出现问题的源端口为30XXX或31XXX,非常类似。

第5步:ipvs

通过ipvsadm命令查看ipvs配置发现,所有卡住的连接都使用了Kubernetes的nodeport 保留端口

根因分析

至此,问题已经明了。当Kubelet初始化一条TCP连接时,会随机选择一个源端口号,例如31055。当TCP SYN到达pod之后,pod会向31055端口号回复一个TCP SYN-ACK报文。当该报文到达IPVS之后,由于已经存在一个端口号为31055的nodeport(Kubernetes loadbalance service),此时会将TCP SYN-ACK报文转发到对应的后端(其他pod),这样就导致Kubelet无法接收到回复的报文,无法建立连接。

解决办法

解决方式也很简单,设置如下内核参数即可,这样Kubelet在建立连接时就不会选择30000–32768的端口作为TCP源端口:

net.ipv4.ip_local_reserved_ports="30000–32768"

Kubernetes的nodeport保留端口为30000-32767,因此设置的net.ipv4.ip_local_reserved_ports为30000–32768

TIPs

  • net.ipv4.ip_local_port_range的默认值为32768 60999,正好和Kubernetes的nodeport保留端口错开,本文中描述的问题的源头也是因为修改了该内核参数,因此非必要不要修改内核参数!

与解决pod健康检查问题相似的内容:

解决pod健康检查问题

解决pod健康检查问题 引自:Solving the mystery of pods health checks failures in Kubernetes。原文中的某些描述并不清晰,本文作了调整。 很早以前,环境中的pod有时候会遇到健康检查失败的问题,但并没有什么明显表征,且几乎是立马就会恢复

K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout'分析与解决

开篇 《K3s 系列文章》 《Rancher 系列文章》 问题概述 20220606 5G IoT 网关设备同时安装 K3S Server, 但是 POD 却无法访问互联网地址,查看 CoreDNS 日志提示如下: ... [ERROR] plugin/errors: 2 update.traefi

Windows 挂载minio 到本地磁盘

# Windows 挂载minio 到本地磁盘 ## 背景 ``` 新公司建议使用minio 进行一些业务操作 已经在各位领导同事的帮助下找到了linux本地s3fs挂载和k8s使用csi方式挂载到pod内的方式. 今天一个帮助过我的同事想用windows平台进行联调. 我感觉很有必要解决这个联调的

k8s实战 2 ---- pod 基础

如果你对k8s还不了解,可以看下前文 k8s 实战 1 初识 (https://www.cnblogs.com/jilodream/p/18245222) 什么是pod,pod在英文中是豌豆荚、分离仓、集装箱的意思。在k8s中,pod就是融合一堆容器实例的一个大容器(称之为集合更贴切)。K8s所能部

[转帖]kubelet 原理解析五: exec的背后

https://segmentfault.com/a/1190000022163850 概述 线上排查pod 问题一般有两种方式,kubectl log或者kubectl exec调试。如果你的 log 写不够优雅,或者需要排除网络问题必须进容器,就只能 exec 了。 # 在pod 123456-

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年,中国手游市场规模不断扩大,开发者通过在画面、玩法等方面的持续创新和打磨,推出更加精品化的产品。然而愈发精美的画质和复杂的玩法,也给硬件带来超高的负载,导致玩家在游戏过程中,频繁出现掉帧卡顿、发烫、续航差等体验降低的现象。 HarmonyOS SDK 图形加速服务(Graphics Accel

解决 Xshell 无法使用 zsh 的 prompt style

为了更好的阅读体验,请点击这里 先学习一下 zsh 的配置吧~ 参考资料 从 0 开始:教你如何配置 zsh powerlevel10k 如何给 Xshell 配置呢 当我安装完 oh-my-zsh、powerlevel10k、fast-syntax-highlighting、以及若干(powerl

解决Python使用GPU

本文简单介绍了使用Python解决使用GPU的方法,并给出了TensorFlow和PyTorch示例;本文还介绍了TensorFlow GPU的安装版本介绍,以及介绍了安装CUDA的详细教程。

解决HtmlUnit执行JS报错提示ScriptException

问题描述 HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序。 但是,众所周知,HtmlUnit对JS脚本的支持并不是很友好,GitHub中大部分的issue都和JS执行错误有关,作者也一直在升级JS En

第134篇:解决浏览器的CORS跨域问题(CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome-untrusted, https, edge.)

好家伙, 我继续尝试着将我的飞机大战使用ES6模块化分离开来,出了点问题 1.出现问题: edge,chrome等一系列浏览器,会为了安全,禁止你跨域访问 目录如下: 主程序 index.html main_1.js main.js 完整代码如下: 1 /* //plane封装成类 2 //实例化后