k8s nodeport 端口故障排查记录
有反馈K8S集群nodeport 端口经常不通,不断重试后可能恢复,现场可复现。nginx-ingress 服务也用的是nodeport模式,上机测试,确认问题存在。
故障现象:
1、在集群外telnet ingress 端口,偶然性出现超时。
2、集群ingress pod 不停在重启。(在10.10.1.13,10.10.1.31节点上正常)。
排查记录:
因刚完成集群版本从v1.15 到 v1.18 版本升级,首先想到是否升级过程异常?
1、查看kubelet 日志发现存在一些报错
2、查看ingres pod 状态,一直在重启。。
root@xx-10-10-1-17 ~]# kubectl get pods -o wide -n ingress-nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-ingress-controller-54956f969c-6295x 1/1 Running 1 5m19s 10.20.2.163 xx-10-10-1-14 <none> <none>
nginx-ingress-controller-54956f969c-6nmkq 1/1 Running 1 118m 10.20.0.133 xx-10-10-1-11 <none> <none>
nginx-ingress-controller-54956f969c-ddsrk 1/1 Running 0 118m 10.20.1.120 xx-10-10-1-31 <none> <none>
nginx-ingress-controller-54956f969c-h7pvc 1/1 Running 0 118m 10.20.0.255 xx-10-10-1-13 <none> <none>
nginx-ingress-controller-54956f969c-pvqtf 1/1 Running 2 9m28s 10.20.1.23 xx-10-10-1-15 <none> <none>
nginx-ingress-controller-54956f969c-wfsx4 0/1 Running 2 12m 10.20.2.250 xx-10-10-1-21 <none> <none>
重启的原因为健康探测失败,pod 被重启。健康探测行为是kubelet发起的。应该是Kuelet在升级时有问题,先处理掉kubelet报错。重建ingress 服务。 pod 状态恢复正常。
ingress pod恢复,但是30080 端口仍出现偶然性不通的情况。
尝试重启 kube-proxy 组件,calico-node 组件。问题依旧。
整理一下思路,从新开始测试,在集群上进行抓包。发现服务端不回包??这时想到了内核参数的问题。
逐一确认了一下,net.ipv4.tcp_tw_recycle = 1 发现快速回收配置为打开。整个集群操作关闭。问题解决。
总结一下:
当多个客户端通过 NAT 方式联网并与服务端交互时,服务端看到的是同一个 IP,也就是说对服务端而言这些客户端实际上等同于一个,可惜由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。如果发生了此类问题,具体的表现通常是是客户端明明发送的 SYN,但服务端就是不响应 ACK。