之前一直用使用的负载方案是搭建一台负载均衡器,可以是haproxy或nginx或lvs,来将多个master节点的6443端口做个负载均衡,但是考虑到负载均衡也需要高可用,所以会引入类似keepalived的方案来解决问题。偶然看到了kubeasz这个开源项目,宣称解决了master高可用问题,部署了一遍发现并没有额外搭建负载均衡器,研究了一下,发现了另一种思路。

使用额外的负载均衡来做高可用

这种就是比较容易想到的一种方案,比如3个master节点,前面有一台负载均衡(nginx、haproxy、lvs)等,但是负载均衡本身就是一个单点故障,所以一般来说还需要另一台负载均衡,通过keepalived来实现VIP的切换
使用Keepalived来实现Nginx高可用

针对master节点做负载均衡

在master上使用vip

架构图如图所示, 使用keepalived维护vip,每台master节点上都运行着一个负载均衡

在master上使用vip

抢占式 和 非抢占式的区别: 比如master1默认的权重(priority)高,vip当前在master1上, master1挂掉后vip会飘到master2上,那么如果master1恢复正常了,抢占式会重新将vip抢过来,再次绑定到master1上,非抢占式则保持在master2上,除非master2也出问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 在master1执行
global_defs {
script_user root # 脚本执行者
enable_script_security # 标记脚本安全
}

vrrp_script check {
script "killall -0 kube-apiserver" # 脚本路径
interval 2 # 脚本执行间隔,单位s
weight -20 # -254-254之间,检测失败权重减少
}

vrrp_instance VI_1 { # 实例名
state BACKUP # 这个是初始的状态, MASTER 或者 BACKUP, 非抢占模式必须为 BACKUP
interface ens32 # 网卡
virtual_router_id 251 # ID主备需一致
priority 100 # 默认权重,3个节点保持不一致,并且MASTER最大,priority之间的差值要小于weight
nopreempt # 设置非抢占模式,state必须设置为BACKUP才能生效

authentication {
auth_type PASS # 主备验证信息,需一致
auth_pass 123456
}
track_script {
check # 调用脚本,若脚本最后的执行结果是非0的,则判断端口down掉,此时vip会漂移到keepalived-BACKUP上
}
unicast_src_ip 10.0.0.51 # 配置源地址的IP地址,自己的ip
unicast_peer {
10.0.0.52
10.0.0.53 # 配置其他keepalived节点
}
virtual_ipaddress {
10.0.0.50 dev ens32 # vip 和 网卡
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 在master2上执行
global_defs {
script_user root # 脚本执行者
enable_script_security # 标记脚本安全
}

vrrp_script check {
script "killall -0 kube-apiserver" # 脚本路径
interval 2 # 脚本执行间隔,单位s
weight -20 # -254-254之间,检测失败权重减少
}

vrrp_instance VI_1 { # 实例名
state BACKUP # 这个是初始的状态, MASTER 或者 BACKUP, 非抢占模式必须为 BACKUP
interface ens32
virtual_router_id 251 # ID主备需一致
priority 99 # 默认权重,3个节点保持不一致,并且MASTER最大,priority之间的差值要小于weight
nopreempt # 设置非抢占模式,state必须设置为BACKUP才能生效

authentication {
auth_type PASS # 主备验证信息,需一致
auth_pass 123456
}
track_script {
check # 调用脚本,若脚本最后的执行结果是非0的,则判断端口down掉,此时vip会漂移到keepalived-BACKUP上
}
unicast_src_ip 10.0.0.52 # 配置源地址的IP地址,自己的ip
unicast_peer {
10.0.0.51
10.0.0.53 # 配置其他keepalived节点
}
virtual_ipaddress {
10.0.0.50 dev ens32 # vip
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 在master3执行
global_defs {
script_user root # 脚本执行者
enable_script_security # 标记脚本安全
}

vrrp_script check {
script "killall -0 kube-apiserver" # 脚本路径
interval 2 # 脚本执行间隔,单位s
weight -20 # -254-254之间,检测失败权重减少
}

vrrp_instance VI_1 { # 实例名
state BACKUP # 这个是初始的状态,MASTER 或者 BACKUP, 非抢占模式必须为 BACKUP
interface ens32
virtual_router_id 251 # ID主备需一致
priority 98 # 默认权重,3个节点保持不一致,并且MASTER最大,priority之间的差值要小于weight
nopreempt # 设置非抢占模式,state必须设置为BACKUP才能生效

authentication {
auth_type PASS # 主备验证信息,需一致
auth_pass 123456
}
track_script {
check # 调用脚本,若脚本最后的执行结果是非0的,则判断端口down掉,此时vip会漂移到keepalived-BACKUP上
}
unicast_src_ip 10.0.0.53 # 配置源地址的IP地址,自己的ip
unicast_peer {
10.0.0.51
10.0.0.52 # 配置其他keepalived节点
}
virtual_ipaddress {
10.0.0.50 dev ens32 # vip
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# master1 节点配置
global_defs {
script_user root # 脚本执行者
enable_script_security # 标记脚本安全
}

vrrp_script check {
script "killall -0 kube-apiserver" # 脚本路径
interval 2 # 脚本执行间隔,单位s
weight -20 # -254-254之间,检测失败权重减少
}

vrrp_instance VI_1 { # 实例名
state MASTER # 3个实例,1个配置MASTER,另外2个配置BACKUP
interface ens32
virtual_router_id 251 # ID主备需一致
priority 100 # 默认权重,3个节点保持不一致,并且MASTER最大,priority之间的差值要小于weight

authentication {
auth_type PASS # 主备验证信息,需一致
auth_pass 123456
}
track_script {
check # 调用脚本,若脚本最后的执行结果是非0的,则判断端口down掉,此时vip会漂移到keepalived-BACKUP上
}
unicast_src_ip 10.0.0.51 # 配置源地址的IP地址,自己的ip
unicast_peer {
10.0.0.52
10.0.0.53 # 配置其他keepalived节点
}
virtual_ipaddress {
10.0.0.50 dev ens32 # vip
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# master2 节点配置
global_defs {
script_user root # 脚本执行者
enable_script_security # 标记脚本安全
}

vrrp_script check {
script "killall -0 kube-apiserver" # 脚本路径
interval 2 # 脚本执行间隔,单位s
weight -20 # -254-254之间,检测失败权重减少
}

vrrp_instance VI_1 { # 实例名
state BACKUP # 3个实例,1个配置MASTER,另外2个配置BACKUP
interface ens32
virtual_router_id 251 # ID主备需一致
priority 99 # 默认权重,3个节点保持不一致,并且MASTER最大,priority之间的差值要小于weight

authentication {
auth_type PASS # 主备验证信息,需一致
auth_pass 123456
}
track_script {
check # 调用脚本,若脚本最后的执行结果是非0的,则判断端口down掉,此时vip会漂移到keepalived-BACKUP上
}
unicast_src_ip 10.0.0.52 # 配置源地址的IP地址,自己的ip
unicast_peer {
10.0.0.51
10.0.0.53 # 配置其他keepalived节点
}
virtual_ipaddress {
10.0.0.50 dev ens32 # vip
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# master3 节点配置
global_defs {
script_user root # 脚本执行者
enable_script_security # 标记脚本安全
}

vrrp_script check {
script "killall -0 kube-apiserver" # 脚本路径
interval 2 # 脚本执行间隔,单位s
weight -20 # -254-254之间,检测失败权重减少
}

vrrp_instance VI_1 { # 实例名
state BACKUP # 3个实例,1个配置MASTER,另外2个配置BACKUP
interface ens32
virtual_router_id 251 # ID主备需一致
priority 98 # 默认权重,3个节点保持不一致,并且MASTER最大,priority之间的差值要小于weight

authentication {
auth_type PASS # 主备验证信息,需一致
auth_pass 123456
}
track_script {
check # 调用脚本,若脚本最后的执行结果是非0的,则判断端口down掉,此时vip会漂移到keepalived-BACKUP上
}
unicast_src_ip 10.0.0.53 # 配置源地址的IP地址,自己的ip
unicast_peer {
10.0.0.51
10.0.0.52 # 配置其他keepalived节点
}
virtual_ipaddress {
10.0.0.50 dev ens32 # vip
}
}

在每台worker节点上部署负载均衡

是看到了有些开源项目不用额外的负载均衡器也可以完成master高可用
方案就是在worker节点上安装负载均衡,架构图如下

在worker节点搭建负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
global
log /dev/log local1 warning
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
nbproc 1

defaults
log global
timeout connect 5s
timeout client 10m
timeout server 10m

listen kube_master
bind 127.0.0.1:6443
mode tcp
option tcplog
option dontlognull
option dontlog-normal
balance roundrobin
server 192.168.13.117 192.168.13.117:6443 check inter 10s fall 2 rise 2 weight 1
server 192.168.13.118 192.168.13.118:6443 check inter 10s fall 2 rise 2 weight 1
server 192.168.13.119 192.168.13.119:6443 check inter 10s fall 2 rise 2 weight 1

监听的是127.0.0.1:6443,这样配置k8s apiserver地址就是127.0.0.1,所有的worker都连接本地的6443端口,然后负载到3台master,这样不用担心负载均衡挂掉,挂掉也只会影响自己,缺点就是配置文件需要管理,不优雅。