k8s集群唯独一个节点nodeport不通问题调查

这篇具有很好参考价值的文章主要介绍了k8s集群唯独一个节点nodeport不通问题调查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

k8s集群唯独一个节点nodeport不通问题调查

背景:

​ 集群3个节点,通过svc暴露了一个nodeport类型的31710端口。对于nodeport类型的端口,理论上可以通过任何一个节点的nodeip+nodeport访问的,但是该环境在实际访问时,31710端口呈现频繁无法访问的问题,且telnet不通。

排查问题:
  1. 查看对应服务的pod、svc、endpoint的状态,未见异常

  2. 查看kube-apiserver组件的状态及日志信息,未发现明显问题

  3. 怀疑问题节点的kube-proxy组件异常,观察发现该节点kube-proxy的pod为running,对比正常节点,日志未发现错误信息。

  4. 通过iptables -S -t nat|grep 31710调查正常节点和异常节点的对于nodeport类型的iptables规则,也未发现异常。

  5. 通过在telnet过程中,用tcpdump工具分别在正常节点和异常节点进行抓包。tcpdump -i eth0 -nn tcp port 31710。结果:正常节点三次握手正常完成,而异常节点三次握手未完成,但是收到了来自客户端的sync包。同时,在异常节点,netstat -s|grep -i listen命令,也发现sync的包drop数目增加。

发现问题:
  • 异常节点不响应客户端的sync握手包
结论:
  • 解决办法:修改内核参数net.ipv4.tcp_tw_recycle参数为0

    #修改配置文件
    $ vim /etc/sysctl.conf
    net.ipv4.tcp_tw_recycle = 0
    #生效
    $ sysctl -p
    

    在修改net.ipv4.tcp_tw_recycle为默认值0后,tcp连接正常了。

问题分析:

对于服务端不响应客户端的sync握手包问题,网上踩坑血泪史很多,直接说结论。net.ipv4.tcp_tw_recycle参数修改为1时,会出现此类问题。搜索网络内核参数优化或者优化服务器连接time_wait过多的文章,十之八九说修改net.ipv4.tcp_tw_recycle参数为1的,事后了解到,客户也是参照此类文章优化过环境。

对于tcp_tw_recycle参数,RFC1323 中有如下一段描述:

An additional mechanism could be added to the TCP, a per-host cache of the last timestamp received from any connection. This value could then be used in the PAWS mechanism to reject old duplicate segments from earlier incarnations of the connection, if the timestamp clock can be guaranteed to have ticked at least once since the old connection was open. This would require that the TIME-WAIT delay plus the RTT together must be at least one tick of the sender’s timestamp clock. Such an extension is not part of the proposal of this RFC.

大概意思是说TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。

Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了,当客户端或服务端以NAT方式构建的时候就可能出现问题,下面以客户端NAT为例来说明:

当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,可惜由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。如果发生了此类问题,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK。

参数 默认状态 作用 条件 影响 风险 建议
net.ipv4.tcp_timestamps 开启 记录TCP报文的发送时间 双方都要开启 影响客户端服务端 开启
net.ipv4.tcp_tw_recycle 关闭 4.1内核已删除 把TIME-WAIT状态超时时间设置为成rto,以实现快速回收 要启用net.ipv4.tcp_timestamps 影响客户端服务端 tcp_tw_recycle和tcp_timestamps同时开启的条件下,60s内同一源ip主机的socket connect请求中的timestamp必须是递增的,否则数据会被linux的syn处理模块丢弃 内网环境切没有NAT的时候看情况打开,没什么必要就不要打开了
net.ipv4.tcp_tw_reuse 关闭 TIME-WAIT状态1秒之后可以重用端口 要启用net.ipv4.tcp_timestamps 影响客户端

在4.12之后的内核已移除tcp_tw_recycle内核参数(https://github.com/torvalds/linux/commit/4396e46187ca5070219b81773c4e65088dac50cc)。

参考:https://www.tqwba.com/x_d/jishu/289849.html文章来源地址https://www.toymoban.com/news/detail-636895.html

到了这里,关于k8s集群唯独一个节点nodeport不通问题调查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • K8s: 将一个节点移出集群和相关注意事项

    前置步骤 在Kubernetes集群中,要移出一个节点,你需要执行以下步骤: 1 )将节点标记为不可调度 首先,你需要将目标节点标记为不可调度,以确保Kubernetes不会在该节点上调度新的Pod 这可以通过执行以下命令实现:$ kubectl cordon node-name 其中 是你想要移出的节点的名称 这个命

    2024年04月18日
    浏览(15)
  • 完美解决k8s master节点无法ping node节点中的IP或Service NodePort的IP

    1、问题一 使用搭建好了K8S集群,先是node节点加入k8s集群时,用的内网IP,导致master节点无法操作node节点中的pod(这里的不能操作,指定是无法查看node节点中pod的日志、启动描述、无法进入pod内部,即 kubectl logs 、kubectl  describe、kubectl exec -it 等等的命令都不能) 解决办法:

    2024年02月05日
    浏览(16)
  • ·[K8S:使用calico网络插件]:解决集群节点NotReady问题

    执行: wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml 1.2.1:查看本机ip 网卡相关信息: 1.2.2:修改calico.yaml网卡interface相关信息 1.3.1:异常日志抛出: 1.3.2:场景一:执行K8S admin config配置文件替换相关操作: 1.3.2:场景二:执行K8S admin config配置文

    2024年02月14日
    浏览(22)
  • kubeadm 安装k8s集群后,master节点notready问题解决方案

    使用kubeadm 安装k8s集群后,加载calico cni 网络组件后,master节点notready问题 表现为: 使用命令查看日志:journalctl -f -u kubelet 报错如下: Failed to start ContainerManager failed to initialize top level QOS containers: failed to update top level Burstable QOS cgroup : failed to set supported cgroup subsystems for cgroup

    2024年01月22日
    浏览(18)
  • k8s集群删除master节点

    1.在另外的master节点执行以下命令 kubectl get node      #查看需要删除的节点名称 kubectl delete node k8s-master01  #删除名为k8s-master01的节点 2.在k8s-master01清空集群配置信息 kubeadm reset  --cri-socket=unix:///var/run/cri-dockerd.sock  #因为我使用的是1.26.0版本的k8s所以需要指定cri rm -rf /var/lib/

    2024年02月13日
    浏览(15)
  • k8s其他master节点加入集群命令

      kubeadm join 192.168.0.236:16443 --token 7t2weq.bjbawausm0jaxury         --discovery-token-ca-cert-hash sha256:92175a356db070deb2ddd3823e288e3005a4baeec9b68580dcc11ce4d3767195         --control-plane --certificate-key a01487c705d04e23832dafee30b06e9ef2ed9d946e9c5c1e869d915da043b640

    2024年01月18日
    浏览(16)
  • k8s集群部署 | 三节点(复用)高可用集群过程参考

    1.1.1 实验架构图 1.1.2 系统版本说明 OS 版本:CentOS Linux release 7.9.2009 (Core) 初始内核版本:3.10.0-1160.71.1.el7.x86_64 配置信息:2C2G 150G硬盘 文件系统:xfs 网络:外网权限 k8s 版本:1.25.9 1.1.3 环境基本信息 K8s集群角色 IP地址 主机名 组件信息 控制节点1(工作节点1) 192.168.204.10 k8

    2024年02月04日
    浏览(18)
  • 外部节点访问 k8s 集群内的 starrocks

    用kubeadm在虚拟机搭建了k8s,按starrocks官网步骤,用k8s部署了starrocks 部署成功: 在 k8s集群内节点访问到 sr:(通过 clusterIP )  k8s 节点内访问成功: ​​​​​​​  尝试在集群外访问sr:  修改完成后查看端口 集群外部的客户端访问不了,错误是 BE 节点 not found 本地无法

    2024年02月13日
    浏览(12)
  • K8S集群node节点状态为notready

    Kubernetes集群中的node节点状态显示为notready,这通常意味着该节点上的一个或多个组件出现了故障。在这种情况下,您需要进一步检查该节点的状态以确定问题的原因。您可以使用kubectl命令检查node的详细信息,例如: 此命令将显示该节点的状态,以及可能导致notready状态的任

    2024年02月15日
    浏览(10)
  • k8s集群—node节点的删除与添加

    在搭建集群过程中,有时候会遇到一个节点处于ready状态,另一个节点处于notready状态,需要把node节点从集群中删除后再次加入。 如果需要在k8s集群中删除节点,首先需要在master节点上删除该节点的相关数据,再删除该节点,接着在该节点上进行reset操作,接着删除相关文件

    2024年02月17日
    浏览(17)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包