容器环境下访问服务出现 Address not available 报错

发布时间 2023-07-19 13:20:38作者: MhaiM

1、现象:访问服务时出现如下报错

2、原因:通过 netstat -an 查看到连接 svc 的地址,其中 estab 状态的连接数,已经到达了可用的随机端口数量阈值,无法在新建连接了

     执行命令查看: netstat -tan|grep ESTABLISHED|wc -l

      sysctl -a|grep net.ipv4.ip_local_port_range

3、解决方案:最后通过修改了内核参数随机端口 net.ipv4.ip_local_port_range 端口范围才得以解决的

1.22+ 集群以上就不建议修改 net.ipv4.ip_local_port_range,因为这会和 ServiceNodePortRange 产生冲突

Kubernetes 的 ServiceNodePortRange 默认是 30000~32767,Kubernetes 1.22 及以后的版本,去除了 kube-proxy 监听 NodePort 的逻辑,如果有监听的话,应用程序在选用随机端口的时候,会避开这些监听中的端口。如果 net.ipv4.ip_local_port_range 的范围和 ServiceNodePortRange 存在重叠,由于去掉了监听 NodePort 的逻辑,应用程序在选用随机端口的时候就可能选中重叠部分,比如 30000~32767,在当 NodePort 与内核 net.ipv4.ip_local_port_range 范围有冲突的情况下,可能会导致偶发的 TCP 无法连接的情况,可能导致健康检查失败、业务访问异常等问题

修改命令如下

vi /etc/sysctl.conf

net.ipv4.ip_local_port_range = 1024 65535

执行生效

sysctl -p