跟唐老师学习云网络 - NodePort第2张网卡不生效

举报
tsjsdbd 发表于 2024/12/19 21:37:45 2024/12/19
【摘要】 问题现象在K8s集群内部署了一个推理实例,然后需要能从另外一个VPC访问。之前集群这么访问都是OK的,但是一个新建的集群发现不通,需要定位原因。 确定只是端口不通首先我们在节点B里面curl 目标节点IP2+NodePort,发现是不通的。报错:Connection refused。大家知道,Connection refused代表,报文到达对方了,但是对方拒收。说明指定的端口并没有在监听。...

问题现象

在K8s集群内部署了一个推理实例,然后需要能从另外一个VPC访问。之前集群这么访问都是OK的,但是一个新建的集群发现不通,需要定位原因。

 

确定只是端口不通

首先我们在节点B里面curl 目标节点IP2+NodePort,发现是不通的。报错:Connection refused。

大家知道,Connection refused代表,报文到达对方了,但是对方拒收。说明指定的端口并没有在监听。通过ping命令也确实可以ping通IP2,也就网络本身没什么问题。

 

排除安全组

因为旧的集群是OK的,这个新集群有问题。先想到的是:看是不是新集群里面有什么安全组导致的报文被拒绝。查看VPC内的安全组,发现入方向和出方向都是放通的,没有ACL规则会拦截该源IP+端口。所以基本排除网络安全组导致的curl不通。

 

分析Iptables

确定不是安全组拦截,说明TCP报文能到节点上,于是登录到节点上面进行分析。首先网卡1的NodePort端口可以通,网卡2的NodePort端口却没反应,说明这个2号端口没有被“招待”到。

 iptables -t nat -nvL (可以先过滤端口筛选: | grep 32262 )

可以看到,这条规则(B)匹配是:源IP是「任意」,目的IP是「任意」,因此规则本身没问题。那再看这条规则的“上家”入口:

 

可以看到,这里规则(A)是:源IP是「任意」,目的IP是「eth0」的,才能进入上一步的“规则B”的匹配。这就说明:如果目的IP地址是第2张网卡(eth1)的报文,压根不会进来。那肯定不会匹配到NodePort的规则进行“目的地址转换”了。如下图:

于是,我们回去看正常集群节点的规则。果然,好的节点的规则是这样的:

源IP是「任意」,目的IP是「任意」,都可以进一步执行“NodePort规则(B)匹配”。这就解释了为什么老集群可以通,新集群不能通的问题了。

 

临时规避

既然知道,入口的规则限死了只匹配eth0的IP,导致eth1的报文不执行匹配。那咱们直接给它插入一条规则(克隆这条规则,把目的IP改成第2张网卡的IP):

首先,以“编辑模式”执行查询

iptables -t nat -S | grep KUBE-NODEPORTS

找出之前的规则,拷贝之。然后修改目的IP,补齐Iptables命令。

新插入一条“新规则”:

iptables -t nat -A KUBE-SERVICES -d 10.255.12.150/32 -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -j KUBE-NODEPORTS

执行后,使用第2张网卡进行端口转发功能OK了。

 

根因总结

其实你如果一开始就知道Kube-Proxy有个参数叫“nodeport-addresses”就是用来控制监听Host节点上哪个网卡的,很快就知道问题出在哪。

但是咱们这次定位过程是,提前不知道有这么个参数,是通过问题定位过程,再发现有这么参数的。虽然这样效率会低一点,但是这种定位过程依然也是有意义的,毕竟搞业务的部门,不能强依赖有人对Kube-Proxy底层组件细节很熟悉。

Ps:事后发现是这新集群的安装脚本,不知道被谁修改了。把监听所有网卡的配置给注释掉了(可能是某个小伙伴在进行什么测试)。

不过,也许这就是跟唐老师学习一些云网络的意义:不需要先知道病因,而是从病症开始,慢慢反推病因。

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。