通常我们在使用nginx做代理时,不使用http协议的场景下,我们需要使用四层的负载均衡,例如在mysql和k8s场景在都是使用4层负载均衡来做代理,通常在大并发的场景下也会在七层负载前面增加四层的负载均衡
然而在nginx四层负载均衡的配置上和七层是稍有一些差别,例如在代理配置中不能在添加http协议,日志中的字段也和七层有一些区别,七层上的有些字段不能直接套用在四层上
我们接下来看下四层的配置实例,首先还是从安装开始,要使用stream模块需要安装nginx-mod-stream模块
yum install nginx nginx-mod-stream keepalived -y
在http同一层级,创建stream配置
http { ...... } stream { log_format main '$remote_addr [$time_local] $status $session_time $upstream_addr $upstream_bytes_sent $upstream_bytes_received $upstream_connect_time'; access_log /var/log/nginx/k8s-access.log main; upstream k8s-proxy { server 192.168.1.72:6443 weight=5 max_fails=2 fail_timeout=300s; server 192.168.1.73:6443 weight=5 max_fails=2 fail_timeout=300s; server 192.168.1.74:6443 weight=5 max_fails=2 fail_timeout=300s; } server { listen 16443; proxy_pass k8s-proxy; } }
我们来看下配置内容,首先是log_format是日志的输出格式,这里需要给四层的负载均衡代理单独设置格式,不能照搬http里面的log_format,日志格式可以查看官网这里介绍:http://nginx.org/en/docs/stream/ngx_stream_log_module.html,我上面列的字段比较全,可以根据自己的需求进行删减。
remote_addr 客户端地址 time_local 访问时间和时区 status 请求状态,正常是200, 还有其他500, 502等状态码 session_time 请求会话耗时 upstream_addr 后端提供服务真实节点地址 upstream_bytes_sent 发送到后端的字节 upstream_bytes_received 接受到手段的字节 upstream_connect_time 连接到后端的时长
接着是在upstream模块内,三个后端的相关配置
weight 是权重,在轮询策略的基础上指定轮询的几率 max_fails 是在fail_timeout参数设置的时间内最大失败次数。如果在这个时间内,所有该服务器的请求都失败了,那么认为该服务器停机 fail_timeout 与max_fails结合使用,设置的时长内不再转发请求到该后端
在server模块内就是起的服务,使用的16443端口
proxy_pass 是代理的后端,k8s-proxy就是定义的后端负载服务器集群
我们通常遇到多个后端节点的其中一个节点挂掉以后,前面代理仍然会将请求转发到这个异常节点,可以将max_fails,fail_timeout参数配置上。
例如以下截图,192.168.1.72节点其实已经挂掉,从图里可以看到请求被代理转到192.168.1.72节点以后,由于节点异常又被转到102.168.1.73上,这个中间多一次转发在k8s上感觉卡顿是很明显的