反向代理报错bind: operation not permit
2024-11-26 本文已影响0人
wwq2020
背景
自己编写的一个替代nginx的简单反向代理服务,以hostnetwork的daemonset运行在k8s集群中,在转发给后端时候指定了clientip,而port为0,类似如下
localAddr, err := net.ResolveTCPAddr("tcp", "clientip:0")
if err != nil {
panic(err)
}
dialer := &net.Dialer{
LocalAddr: localAddr,
}
transport := &http.Transport{
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
return dialer.DialContext(ctx, network, addr)
},
},
现象
此反向代理的客户端反馈偶现502,但是查看日志没看到后端返回502状态码的日志,看到了会引起502的错误日志
bind: operation not permitted
排查
查看apiserver的node-port-range配置(没有配置的话默认是30000-32767)
kubectl get pod -n kube-system kube-apiserver-xxx -o yaml|grep service-node-port-range
查看ip_local_port_range配置
cat /proc/sys/net/ipv4/ip_local_port_range
检查node-port-range是不是全在ip_local_reserved_port_range中(在则不和ip_local_port_range冲突)
cat /proc/sys/net/ipv4/ip_local_reserved_ports
最中发现两者有交叉且且node-port-range有部分不在ip_local_reserved_ports中
解决
echo 'net.ipv4.ip_local_port_range="32768 65535"' >> /etc/sysctl.conf
sysctl -p