k8s 集群使用 haproxy+keepalived+nginx 实现k8s集群负载均衡_程序猿加油站的博客-爱代码爱编程
k8s 集群使用 haproxy+keepalived+nginx 实现k8s集群负载均衡
keepalived + haproxy 安装
yum install -y haproxy keepalived
keepalived
master 配置
vim 编辑 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
zhanglu90@126.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_1
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI-kube-master {
state MASTER #需要将状态设置为(MASTER)
interface eno1 #这个地方需要特别注意,一个服务器有很多虚拟网卡,而这个网卡是真实网卡,可以通过ifconfig 命令查看你服务器中的名字,我的服务器中ip地址对应的网卡名称就是eno1 ,这个不能写错
virtual_router_id 51 #这个id可以是其他数字,但是该数字必须在master和node中要保持一致,也可以照我这个写,不需要修改的
priority 100 #权重设置,数值大的选为master 节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.41.39.206 # vip #这个就是虚拟出来的ip了,简称VIP,需要确保集群环境中不能有ip与这个vip冲突,其次需要确定该vip能和集群中所有节点ping的通
}
}
node 配置
vim 编辑 /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
zhanglu90@126.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_1
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI-kube-master {
state BACKUP #此处需要设置为备份状态(BACKUP)
interface eno1 #这个地方需要特别注意,一个服务器有很多虚拟网卡,而这个网卡是真实网卡,可以通过ifconfig 命令查看你服务器中的名字,我的服务器中ip地址对应的网卡名称就是eno1 ,这个不能写错
virtual_router_id 51 #这个id可以是其他数字,但是该数字必须在master和node中要保持一致,也可以照我这个写,不需要修改的
priority 80 #权重设置,数值大的选为master 节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.41.39.206 # vip #这个就是虚拟出来的ip了,简称VIP,需要确保集群环境中不能有ip与这个vip冲突,其次需要确定该vip能和集群中所有节点ping的通
}
}
启动keepalived并设置开机自启
#启动
systemctl start keepalived
#查看状态
systemctl status keepalived
#设置开机自启
systemctl enable keepalived
haproxy
「HAProxy」- 在 TCP Mode 下,从 Haproxy 向 Nginx 传递客户端真实网络地址
修改haproxy的配置文件
因为要使用PROXY协议,需要在server中追加send-proxy-v2-ssl-cn配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /var/run/haproxy-admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
nbproc 1
defaults
log global
timeout connect 5000
timeout client 10m
timeout server 10m
listen admin_stats
bind 0.0.0.0:16688 #这里需要设置一个不和其他程序冲突的端口,查看端口是否占用:netstat -anp| grep 10080
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /status
stats realm welcome login\ Haproxy
stats auth admin:123456
stats hide-version
stats admin if TRUE
# 业务下游 nginx 转发配置 ,nginx 部署在 k8s 中
listen sase-service-nginx
mode tcp
bind *:9443 #这里需要设置一个不和其他程序冲突的端口,查看端口是否占用:netstat -anp| grep 9443
balance roundrobin
# 下游nginx 地址并开启 proxy protocol 代理协议 send-proxy-v2-ssl-cn
server nginx-01 10.41.39.195:31498 send-proxy-v2-ssl-cn weight 1 maxconn 10000 check inter 10s
server nginx-01 10.41.39.196:31498 send-proxy-v2-ssl-cn weight 1 maxconn 10000 check inter 10s
server nginx-01 10.41.39.197:31498 send-proxy-v2-ssl-cn weight 1 maxconn 10000 check inter 10s
listen sase-customer-nginx
mode tcp
bind *:7443 #这里需要设置一个不和其他程序冲突的端口,查看端口是否占用:netstat -anp| grep 7443
balance roundrobin
# 下游nginx 地址并开启 proxy protocol 代理协议 send-proxy-v2-ssl-cn
server nginx-01 10.41.39.195:31134 send-proxy-v2-ssl-cn weight 1 maxconn 10000 check inter 10s
server nginx-01 10.41.39.196:31134 send-proxy-v2-ssl-cn weight 1 maxconn 10000 check inter 10s
server nginx-01 10.41.39.197:31134 send-proxy-v2-ssl-cn weight 1 maxconn 10000 check inter 10s
注意,「PROXY协议」由两个版本,对应的HAProxy中的配置为send-proxy与send-proxy-v2指令,这是用于HTTP协议的。如果是HTTPS协议要使用send-proxy-v2-ssl或者send-proxy-v2-ssl-cn指令。我们用的https 协议,所以配置为send-proxy-v2-ssl-cn。
通过「PROXY协议」传递给Nginx的信息是客户端IP地址、代理服务器IP地址、两个端口号。接下来就是配置Nginx服务接受PROXY协议。
启动HAProxy并设置开机自启
#启动
systemctl start haproxy
#查看状态
systemctl status haproxy
#设置开机自启
systemctl enable haproxy
Nginx proxy protocol 配置
目前,HAProxy已经将客户端的IP地址通过PROXY协议发送给Nginx服务了。接下来就是在Nginx中获取客户端的IP地址,有两种办法:
1.在Nginx中,使用’‘
p
r
o
x
y
p
r
o
t
o
c
o
l
a
d
d
r
′
′
和
′
′
proxy_protocol_addr''和''
proxyprotocoladdr′′和′′proxy_protocol_port’‘变量捕获原始客户端IP地址和端口。’‘
r
e
m
o
t
e
a
d
d
r
′
′
和
′
′
remote_addr''和''
remoteaddr′′和′′remote_port’‘变量捕获HAProxy的IP地址和端口。
2. 在Nginx中,启用RealIP模块。启用RealIP模块后:Nginx会重写’‘
r
e
m
o
t
e
a
d
d
r
′
′
和
′
′
remote_addr''和''
remoteaddr′′和′′remote_port’‘变量的值,用客户端IP地址和端口替换负载均衡的IP地址和端口;而’‘
r
e
a
l
i
p
r
e
m
o
t
e
a
d
d
r
′
′
和
′
′
realip_remote_addr''和''
realipremoteaddr′′和′′realip_remote_port’‘变量保留负载均衡的IP地址和端口;’‘
p
r
o
x
y
p
r
o
t
o
c
o
l
a
d
d
r
′
′
和
′
′
proxy_protocol_addr''和''
proxyprotocoladdr′′和′′proxy_protocol_port’'变量保留原始客户端IP地址和端口。
这对Nginx也有所要求:
- 接受PROXY协议v2,需要NGINX 1.13.11及更高版本,或NGINX Plus R16及更高版本;
* 接受HTTP的PROXY协议,需要NGINX 1.5.12及更高版本,或NGINX Plus R3及更高版本;(在nginx-1.5.12的http中,指令listen首次支持proxy_protocol)
* 接受TCP的PROXY协议,需要NGINX 1.11.4及更高版本,或NGINX Plus R11及更高版本;(在nginx-1.11.4的stream中,指令listen首次支持proxy_protocol)
* 对于TCP客户端PROXY协议支持,需要NGINX 1.9.3及更高版本,或NGINX Plus R7及更高版本;(在nginx-1.9.2中,加入了proxy_protocol指令,用于请求PROXY服务)
* 如果使用RealIP模块,则需要进行安装,默认没有安装该模块。
在Nginx中进行如下配置:
server {
charset utf-8;
listen [::]:443 default_server ssl ipv6only=on proxy_protocol; # proxy_protocol
listen 0.0.0.0:443 default_server ssl proxy_protocol;
location ^~ /v1/ {
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
proxy_set_header Host $http_host;
proxy_pass http://backend/v1/;
}
}
有一点需要说明,指令set_real_ip_from的参数为负载均衡的IP地址或网段。该参数标记出负载均衡的网段,然后Nginx会进行递归排除,递归排除之后剩下的IP地址就是客户端的IP地址。这个地方不要配置错了。
参考:
使用haproxy+keepalived实现k8s集群访问总代理
「HAProxy」- 在 TCP Mode 下,从 Haproxy 向 Nginx 传递客户端真实网络地址