Kubernetes网络的iptables模式和ipvs模式支持ping分析

1.iptables模式无法ping通原因分析

  iptables模式下,无法ping通任何svc,包括clusterip.所有ns下,下面来分析原因:

  查看kubernetes的网络模式

curl 127.0.0.1:10249/proxyMode
[root@k8s-master01 ~]# curl 127.0.0.1:10249/proxyMode
iptables

  可以看到当前我的网络模式是 iptables

  那么当应用程序通过服务连接到另一个应用程序时,将发生以下事件:

    1.应用程序使用集群DNS将服务名称解析为ClusterIP(虚拟IP)和端口 例如将:redis.elk:6379 解析为 10.0.0.144:6379

    2.应用程序将连接请求发送给特定端口(10.0.0.144:6379)ClusterIP

    3.由于ClusterIP位于没有路由的特殊网络上,因此请求将转到默认网关

    4.请求发送到集群节点的默认网关时,由节点内核处理

    5.将所有集群节点配置为,捕获服务正在使用的端口6379上进入ClusterIP地址的请求

    6.trap导致数据包头被重写,以便将请求重定向到特定的Pod

    7.Pod接收流量并服务请求

  问题在于,当请求前往svc服务中定义的端口上的ClusterIP时,才会发生trap。无法将ping流量发送到特定端口,因此永远不会发生trap。

  Why

  因为ping基于ICMP ,ICMP不能在TCP/UDP上运行,因此没有TCP/UDP端口的概念。因此,无法在配置为侦听和trap的服务的端口上使用ping。

  为什么nc 探测是成功的?

  nc 默认是基于tcp, nc -u 是基于udp 所以他探测的协议是tcp/udp 所以是可以探测成功的。

  为什么开发语言同样可以连接成功?

  因为开发语言是通过(研发可以控制)TCP协议形式的Socket连接。

 

2.为什么iptables模式下无法ping通svc? 而ipvs模式可以?

  来查看下iptables模式下kube-proxy的iptables转发规则

  查看filter:

  iptable默认策略为拒绝任何icmp端口,除非你手动打开让其支持icmp协议才可以ping通。

  而IPVS的ICMP报文处理-由外到内,默认是支持的,所以可以ping通,具体见以下链接: IPVS的ICMP报文处理-由内到外

 

3.小结

  iptables:clusterIP只是iptables中的规则,只会处理ip:port四层数据包,reject了icmp。不能 ping通。

  IPVS:ipvs依赖iptables进行包过滤、SNAT、masquared(伪装)。 使用 ipset 来存储需要 DROP 或 masquared 的流量的源或目标地址,以确保 iptables 规则的数量是恒定的,这样我们就不需要关心我们有多少服务了

  二者有着本质的差别:iptables是为防火墙而设计的;IPVS则专门用于高性能负载均衡,并使用更高效的数据结构(Hash表),允许几乎无限的规模扩张。

 

转载:http://www.yoyoask.com/?p=4742

posted @   小家电维修  阅读(678)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
阅读排行:
· 20250116 支付宝出现重大事故 有感
· 一个基于 Roslyn 和 AvalonEdit 的跨平台 C# 编辑器
· 2025 最佳免费商用文本转语音模型: Kokoro TTS
· 海康工业相机的应用部署不是简简单单!?
· 在 .NET Core中如何使用 Redis 创建分布式锁
点击右上角即可分享
微信分享提示
目 录 X

1.iptables模式无法ping通原因分析

2.为什么iptables模式下无法ping通svc?而ipvs模式可以?

3.小结