一、问题描述
最近发新的Kubernetes 1.24+和1.25+集群,node节点上看不到 Service 使用 nodeport 监听端口,但是Service nodeport端口却是可用的。 而且,在Kubernetes 1.18.0 版本发现node节点上Service nodeport是正常监听。
二、问题原因
Github 官方解释
在新版本中已经删除了kube-proxy打开端口套接字部分,但是会在iptables中进行转发,所以不影响访问
阿里云ACK官方解释
在Kubernetes 1.22.15及以后的版本中,kube-proxy去除了监听NodePort的逻辑,当NodePort端口范围(即APIServer的ServiceNodePortRange参数)与内核net.ipv4.ip_local_port_range端口范围有冲突的情况下,可能会导致偶发的TCP无法连接的情况,从而导致健康检查失败、业务异常等问题。因此,升级集群版本至1.22.10或以后的版本时,请确保集群NodePort端口范围与任意节点net.ipv4.ip_local_port_range端口范围不存在冲突。更多信息,请参见Kubernetes社区PR。
三、如何正确配置NodePort范围
在Kubernetes中,APIServer提供了ServiceNodePortRange参数(命令行参数 --service-node-port-range),该参数是用于限制NodePort或LoadBalancer类型的Service在节点上所监听的NodePort端口范围,该参数默认值为30000~32767。在ACK Pro集群中,您可以通过自定义Pro集群的管控面参数修改该端口范围。具体操作,请参见自定义ACK Pro集群的管控面参数。
- 您在修改NodePort端口范围时必须十分谨慎。务必保证NodePort端口范围与集群节点上Linux内核提供的net.ipv4.ip_local_port_range参数中的端口范围不冲突。该内核参数ip_local_port_range控制了Linux系统上任意应用程序可以使用的本地端口号范围。ip_local_port_range的默认值为32768~60999。
- 您所创建的ACK集群在默认配置情况下,ServiceNodePortRange参数和ip_local_port_range参数不会产生冲突。如果您此前为了提升端口数量限制调整了这两个参数中任意一个,导致两者范围出现重合,则可能会产生节点上的偶发网络异常,严重时会导致业务健康检查失败、集群节点离线等。建议您恢复默认值或同时调整两个端口范围到完全不重合。
- 调整端口范围后,集群中可能存在部分NodePort或LoadBalancer类型的Service仍在使用ip_local_port_range参数端口范围内的端口作为NodePort。此时您需要对这部分Service进行重新配置以避免冲突,可通过kubectl edit <service-name>的方式直接将spec.ports.nodePort字段的值更改为未被占用的NodePort。
- 本文固定链接: http://www.jiagou.cc/552/
- 转载请注明: 摘星怪 于 架构迷 发表