使用 Keepalived 和 HAproxy 创建高可用 Kubernetes 集群

高可用 Kubernetes 集群能够确保应用程序在运行时不会出现服务中断,这也是生产的需求之一。为此,有很多方法可供选择以实现高可用。

本教程演示了如何配置 Keepalived 和 HAproxy 使负载均衡、实现高可用。步骤如下:

  1. 准备主机。
  2. 配置 Keepalived 和 HAproxy。
  3. 使用 KubeKey 创建 Kubernetes 集群,并安装 KubeSphere。

集群架构

示例集群有三个主节点,三个工作节点,两个用于负载均衡的节点,以及一个虚拟 IP 地址。本示例中的虚拟 IP 地址也可称为“浮动 IP 地址”。这意味着在节点故障的情况下,该 IP 地址可在节点之间漂移,从而实现高可用。

image

请注意,在本示例中,Keepalived 和 HAproxy 没有安装在任何主节点上。但您也可以这样做,并同时实现高可用。然而,配置两个用于负载均衡的特定节点(您可以按需增加更多此类节点)会更加安全。这两个节点上只安装 Keepalived 和 HAproxy,以避免与任何 Kubernetes 组件和服务的潜在冲突。

准备主机

IP 地址 主机名 角色
172.16.0.2 lb1 Keepalived & HAproxy
172.16.0.3 lb2 Keepalived & HAproxy
172.16.0.4 master1 master, etcd
172.16.0.5 master2 master, etcd
172.16.0.6 master3 master, etcd
172.16.0.7 worker1 worker
172.16.0.8 worker2 worker
172.16.0.9 worker3 worker
172.16.0.10 虚拟 IP 地址

有关更多节点、网络、依赖项等要求的信息,请参见多节点安装

配置负载均衡

Keepalived 提供 VRRP 实现,并允许您配置 Linux 机器使负载均衡,预防单点故障。HAProxy 提供可靠、高性能的负载均衡,能与 Keepalived 完美配合。

由于 lb1lb2 上安装了 Keepalived 和 HAproxy,如果其中一个节点故障,虚拟 IP 地址(即浮动 IP 地址)将自动与另一个节点关联,使集群仍然可以正常运行,从而实现高可用。若有需要,也可以此为目的,添加更多安装 Keepalived 和 HAproxy 的节点。

先运行以下命令安装 Keepalived 和 HAproxy。

yum install keepalived haproxy psmisc -y

HAproxy

在两台用于负载均衡的机器上运行以下命令以配置 Proxy(两台机器的 Proxy 配置相同):

vi /etc/haproxy/haproxy.cfg

以下是示例配置,供您参考(请注意 server 字段。请记住 6443apiserver 端口):

global
    log /dev/log  local0 warning
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
   
   stats socket /var/lib/haproxy/stats
   
defaults
  log global
  option  httplog
  option  dontlognull
        timeout connect 5000
        timeout client 50000
        timeout server 50000
   
frontend kube-apiserver
  bind *:6443
  mode tcp
  option tcplog
  default_backend kube-apiserver
   
backend kube-apiserver
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server kube-apiserver-1 172.16.0.4:6443 check # Replace the IP address with your own.
    server kube-apiserver-2 172.16.0.5:6443 check # Replace the IP address with your own.
    server kube-apiserver-3 172.16.0.6:6443 check # Replace the IP address with your own.

保存文件并运行以下命令以重启 HAproxy。

systemctl restart haproxy

使 HAproxy 在开机后自动运行:

systemctl enable haproxy

确保您在另一台机器 (lb2) 上也配置了 HAproxy。

Keepalived

两台机器上必须都安装 Keepalived,但在配置上略有不同。

运行以下命令以配置 Keepalived。

vi /etc/keepalived/keepalived.conf

以下是示例配置 (lb1),供您参考:

global_defs {
  notification_email {
  }
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}
   
vrrp_script chk_haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}
   
vrrp_instance haproxy-vip {
  state BACKUP
  priority 100
  interface eth0                       # Network card
  virtual_router_id 60
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  unicast_src_ip 172.16.0.2      # The IP address of this machine
  unicast_peer {
    172.16.0.3                         # The IP address of peer machines
  }
   
  virtual_ipaddress {
    172.16.0.10/24                  # The VIP address
  }
   
  track_script {
    chk_haproxy
  }
}

备注

  • 对于 interface 字段,您必须提供自己的网卡信息。您可以在机器上运行 ifconfig 以获取该值。
  • unicast_src_ip 提供的 IP 地址是您当前机器的 IP 地址。对于也安装了 HAproxy 和 Keepalived 进行负载均衡的其他机器,必须在字段 unicast_peer 中输入其 IP 地址。

保存文件并运行以下命令以重启 Keepalived。

systemctl restart keepalived

使 Keepalived 在开机后自动运行:

systemctl enable keepalived

确保您在另一台机器 (lb2) 上也配置了 Keepalived。

验证高可用

在开始创建 Kubernetes 集群之前,请确保已经测试了高可用。

在机器 lb1 上,运行以下命令:

[root@lb1 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
       valid_lft 73334sec preferred_lft 73334sec
    inet 172.16.0.10/24 scope global secondary eth0 # The VIP address
       valid_lft forever preferred_lft forever
    inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

如上图所示,虚拟 IP 地址已经成功添加。模拟此节点上的故障:

systemctl stop haproxy

再次检查浮动 IP 地址,您可以看到该地址在 lb1 上消失了。

[root@lb1 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.2/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
       valid_lft 72802sec preferred_lft 72802sec
    inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

理论上讲,若配置成功,该虚拟 IP 会漂移到另一台机器 (lb2) 上。在 lb2 上运行以下命令,这是预期的输出:

[root@lb2 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:9e:3f:51:ba brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.3/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
       valid_lft 72690sec preferred_lft 72690sec
    inet 172.16.0.10/24 scope global secondary eth0   # The VIP address
       valid_lft forever preferred_lft forever
    inet6 fe80::f67c:bd4f:d6d5:1d9b/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

如上所示,高可用已经配置成功。

使用 KubeKey 创建 Kubernetes 集群

KubeKey 是一款用来创建 Kubernetes 集群的工具,高效而便捷。请按照以下步骤下载 KubeKey。

GitHub Release Page 下载 KubeKey 或者直接使用以下命令。

curl -sfL https://get-kk.kubesphere.io | VERSION=v2.0.0 sh -

备注

通过以上命令,可以下载 KubeKey 的最新版本 (v2.0.0)。您可以更改命令中的版本号来下载特定的版本。

使 kk 成为可执行文件:

chmod +x kk

使用默认配置创建一个示例配置文件。此处以 Kubernetes v1.21.5 作为示例。

./kk create config --with-kubesphere v3.2.1 --with-kubernetes v1.21.5

备注

  • 安装 KubeSphere 3.2.1 的建议 Kubernetes 版本:v1.19.x、v1.20.x、v1.21.x 或 v1.22.x(实验性支持)。如果不指定 Kubernetes 版本,KubeKey 将默认安装 Kubernetes v1.21.5。有关受支持的 Kubernetes 版本的更多信息,请参见支持矩阵
  • 如果您没有在本步骤的命令中添加标志 --with-kubesphere,那么除非您使用配置文件中的 addons 字段进行安装,或者稍后使用 ./kk create cluster 时再添加该标志,否则 KubeSphere 将不会被部署。
  • 如果您添加标志 --with-kubesphere 时未指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。

部署 KubeSphere 和 Kubernetes

运行上述命令后,将创建配置文件 config-sample.yaml。编辑文件以添加机器信息、配置负载均衡器等。

备注

如果自定义文件名,那么文件名可能会有所不同。

config-sample.yaml 示例

...
spec:
  hosts:
  - {name: master1, address: 172.16.0.4, internalAddress: 172.16.0.4, user: root, password: Testing123}
  - {name: master2, address: 172.16.0.5, internalAddress: 172.16.0.5, user: root, password: Testing123}
  - {name: master3, address: 172.16.0.6, internalAddress: 172.16.0.6, user: root, password: Testing123}
  - {name: worker1, address: 172.16.0.7, internalAddress: 172.16.0.7, user: root, password: Testing123}
  - {name: worker2, address: 172.16.0.8, internalAddress: 172.16.0.8, user: root, password: Testing123}
  - {name: worker3, address: 172.16.0.9, internalAddress: 172.16.0.9, user: root, password: Testing123}
  roleGroups:
    etcd:
    - master1
    - master2
    - master3
    master:
    - master1
    - master2
    - master3
    worker:
    - worker1
    - worker2
    - worker3
  controlPlaneEndpoint:
    domain: lb.kubesphere.local
    address: 172.16.0.10   # The VIP address
    port: 6443
...

备注

  • 请使用您自己的 VIP 地址来替换 controlPlaneEndpoint.address 的值。
  • 有关更多本配置文件中不同参数的信息,请参见多节点安装

开始安装

完成配置之后,可以执行以下命令开始安装:

./kk create cluster -f config-sample.yaml

验证安装

运行以下命令以检查安装日志。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

看到以下信息时,表明高可用集群已成功创建。

#####################################################
###              Welcome to KubeSphere!           ###
#####################################################
   
Console: http://172.16.0.4:30880
Account: admin
Password: P@88w0rd
   
NOTES:
  1. After you log into the console, please check the
     monitoring status of service components in
     the "Cluster Management". If any service is not
     ready, please wait patiently until all components
     are up and running.
  2. Please change the default password after login.
   
#####################################################
https://kubesphere.io             2020-xx-xx xx:xx:xx
#####################################################

Keepalive+Haproxy部署

实验环境:

IP	备注
172.16.3.225/21	Keepalive-Master+Haproxy+Nginx
172.16.3.226/21	Keepalive-Backup+Haproxy+Nginx
172.16.3.200/24	VIP

注:这里因为自己的环境有限为了更好地测试,所以就用两台机器。

实验效果

最终的实验效果是通过一个虚拟IP反向代理两台Nginx,当我们Keepalive-Master宕机VIP会转到Keepalive-Backup并且还可以正常对外访问

实验步骤

1、部署Keepalive

1)关闭两台Firewalls、Selinux

[root@bogon ~]# setenforce 0 && sed -i  's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@bogon ~]# systemctl  stop firewalld  &&  systemctl  disable firewalld

2)两台主机安装环境所需的软件

[root@bogon ~]# yum install epel-release keepalived haproxy  bzip2-devel  popt-devel kernel-devel openssl-devel -y
[root@bogon ~]# yum install nginx -y

3)配置一下Master配置文件

vim /etc/keepalived/keepalived.conf
[root@bogon ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL_MASTER           # 两台ID不能一致
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER                        # 指定A节点为主节点 备用节点上设置为BACKUP即可
    interface ens160                    # 绑定虚拟IP的网络接口
    virtual_router_id 51                # VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100                        # 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1                        # 组播信息发送间隔,两个节点设置必须一样
    authentication {                    # 设置验证信息,两个节点必须一致
        auth_type PASS					 
        auth_pass 1111					 
    }
    virtual_ipaddress {                 # 指定虚拟IP, 两个节点设置必须一样
            172.16.3.200/24				
} 
}
EOF
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL1
   vrrp_skip_check_adv_addr
   #vrrp_strict
   #ping不通 注释掉上面这行
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth192
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.104/24
    }
}
EOF
192.168.1.105 
192.168.1.106

192.168.1.104

ens192

4)配置一下Backup的配置文件

[root@bogon ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL_NODE           # 两台ID不能一致
   vrrp_skip_check_adv_addr
   #vrrp_strict
   #注释掉,不注释ping不通
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP                        # 指定A节点为主节点 备用节点上设置为BACKUP即可
    interface ens160                    # 绑定虚拟IP的网络接口
    virtual_router_id 51                # VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 90                         # 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1                        # 组播信息发送间隔,两个节点设置必须一样
    authentication {                    # 设置验证信息,两个节点必须一致
        auth_type PASS					 
        auth_pass 1111					 
    }
    virtual_ipaddress {                 # 指定虚拟IP, 两个节点设置必须一样
            172.16.3.200/24				
} 
}
EOF
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL2
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state buckup
    interface eth192
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.118/24
    }
}
EOF

4)验证一下VIP是否已经映射出

[root@bogon ~]# ip a | grep '172.16.3.200'
inet 172.16.3.200/24 scope global ens160

ip a | grep '192.168.1.104'

2、修改一下Nginx网页方便验证

[root@bogon ~]# echo "172.16.3.225" > /usr/share/nginx/html/index.html 
[root@bogon ~]# echo "172.16.3.226" > /usr/share/nginx/html/index.html

echo "192.168.1.105" > /usr/share/nginx/html/index.html 
echo "192.168.1.106" > /usr/share/nginx/html/index.html

3、配置Haproxy

1)创建日志目录

mkdir /var/log/haproxy
chmod a+w /var/log/haproxy

2)开启rsyslog记录haproxy日志

vim /etc/rsyslog.conf 

# Provides UDP syslog reception

$ModLoad imudp    # 
$UDPServerRun 514

# haproxy log

local0.*    /var/log/haproxy/haproxy.log  # 添加

3)修改/etc/sysconfig/rsyslog文件

vim /etc/sysconfig/rsyslog

# Options for rsyslogd

# Syslogd options are deprecated since rsyslog v3.

# If you want to use them, switch to compatibility mode 2 by "-c 2"

# See rsyslogd(8) for more details

SYSLOGD_OPTIONS="-r -m 0 -c 2"
[root@bogon ~]# systemctl restart rsyslog

4)在Master配置Haproxy配置

[root@bogon ~]# cat > /etc/haproxy/haproxy.cfg << EOF
###########全局配置#########
global
    log 127.0.0.1 local0 info  # 日志类型,为不影响性能使用err
    daemon
    #nbproc 1     #进程数量 
    maxconn 4096  #最大连接数 
    #user haproxy  #运行用户  
    #group haproxy #运行组 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid

########默认配置############
    defaults
        log global
        mode http          #默认模式{ tcp|http|health }
        option httplog       #日志类别,采用httplog
        option dontlognull   #不记录健康检查日志信息  
        retries 2            #3次连接失败就认为服务器不可用
        option forwardfor    except 127.0.0.0/8  #后端服务获得真实ip,在HTTP请求中添加"HTTP_X_FORWARDED_FOR"字段
        option httpclose     #请求完毕后主动关闭http通道
        option abortonclose  #服务器负载很高,自动结束比较久的链接  
        maxconn 10000        #最大连接数  
        timeout connect 5m   #连接超时   m(分钟)
        timeout client 1m    #客户端超时  
        timeout server 1m    #服务器超时  
        timeout check 10s    #心跳检测超时  s(秒)
        balance leastconn    #负载均衡方式,最少连接 

########后端配置############
     listen test
         bind *:8080
         mode http
         #balance roundrobin
         timeout server 15s
         timeout connect 15s
         server web01 172.16.3.225:80 check port 80 inter 5000 fall 5
         server web02 172.16.3.226:80 check port 80 inter 5000 fall 5
EOF
[root@bogon ~]# systemctl start haproxy
cat > /etc/haproxy/haproxy.cfg << EOF
###########全局配置#########
global
    log 127.0.0.1 local0 info  # 日志类型,为不影响性能使用err
    daemon
    #nbproc 1     #进程数量 
    maxconn 4096  #最大连接数 
    #user haproxy  #运行用户  
    #group haproxy #运行组 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid

########默认配置############
    defaults
        log global
        mode http          #默认模式{ tcp|http|health }
        option httplog       #日志类别,采用httplog
        option dontlognull   #不记录健康检查日志信息  
        retries 2            #3次连接失败就认为服务器不可用
        option forwardfor    except 127.0.0.0/8  #后端服务获得真实ip,在HTTP请求中添加"HTTP_X_FORWARDED_FOR"字段
        option httpclose     #请求完毕后主动关闭http通道
        option abortonclose  #服务器负载很高,自动结束比较久的链接  
        maxconn 10000        #最大连接数  
        timeout connect 5m   #连接超时   m(分钟)
        timeout client 1m    #客户端超时  
        timeout server 1m    #服务器超时  
        timeout check 10s    #心跳检测超时  s(秒)
        balance leastconn    #负载均衡方式,最少连接 

########后端配置############
     listen test
         bind *:8068
         mode http
         #balance roundrobin
         timeout server 15s
         timeout connect 15s
         server web01 192.168.1.105:80 check port 80 inter 5000 fall 5
         server web02 192.168.1.106:80 check port 80 inter 5000 fall 5
EOF

重启haproxy

systemctl start haproxy

5)Backup上配置Haproxy

vim /etc/haproxy/haproxy.cfg
[root@bogon ~]# cat > /etc/haproxy/haproxy.cfg << EOF
###########全局配置#########
global
    log 127.0.0.1 local0 info  # 日志类型,为不影响性能使用err
    daemon
    #nbproc 1     #进程数量 
    maxconn 4096  #最大连接数 
    #user haproxy  #运行用户  
    #group haproxy #运行组 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid

########默认配置############
    defaults
        log global
        mode http          #默认模式{ tcp|http|health }
        option httplog       #日志类别,采用httplog
        option dontlognull   #不记录健康检查日志信息  
        retries 2            #3次连接失败就认为服务器不可用
        option forwardfor    except 127.0.0.0/8  #后端服务获得真实ip,在HTTP请求中添加"HTTP_X_FORWARDED_FOR"字段
        option httpclose     #请求完毕后主动关闭http通道
        option abortonclose  #服务器负载很高,自动结束比较久的链接  
        maxconn 10000        #最大连接数  
        timeout connect 5m   #连接超时   m(分钟)
        timeout client 1m    #客户端超时  
        timeout server 1m    #服务器超时  
        timeout check 10s    #心跳检测超时  s(秒)
        balance leastconn    #负载均衡方式,最少连接 

########后端配置############
     listen test
         bind *:8080
         mode http
         #balance roundrobin
         timeout server 15s
         timeout connect 15s
         server web01 172.16.3.225:80 check port 80 inter 5000 fall 5
         server web02 172.16.3.226:80 check port 80 inter 5000 fall 5
EOF
cat > /etc/haproxy/haproxy.cfg << EOF
###########全局配置#########
global
    log 127.0.0.1 local0 info  # 日志类型,为不影响性能使用err
    daemon
    #nbproc 1     #进程数量 
    maxconn 4096  #最大连接数 
    #user haproxy  #运行用户  
    #group haproxy #运行组 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid

########默认配置############
    defaults
        log global
        mode http          #默认模式{ tcp|http|health }
        option httplog       #日志类别,采用httplog
        option dontlognull   #不记录健康检查日志信息  
        retries 2            #3次连接失败就认为服务器不可用
        option forwardfor    except 127.0.0.0/8  #后端服务获得真实ip,在HTTP请求中添加"HTTP_X_FORWARDED_FOR"字段
        option httpclose     #请求完毕后主动关闭http通道
        option abortonclose  #服务器负载很高,自动结束比较久的链接  
        maxconn 10000        #最大连接数  
        timeout connect 5m   #连接超时   m(分钟)
        timeout client 1m    #客户端超时  
        timeout server 1m    #服务器超时  
        timeout check 10s    #心跳检测超时  s(秒)
        balance leastconn    #负载均衡方式,最少连接 

########后端配置############
     listen test
         bind *:8068
         mode http
         #balance roundrobin
         timeout server 15s
         timeout connect 15s
         server web01 192.168.1.105:80 check port 80 inter 5000 fall 5
         server web02 192.168.1.106:80 check port 80 inter 5000 fall 5
EOF

重启haproxy

systemctl start haproxy

6)测试一下haproxy代理是否配置成功,虚拟ip访问

[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.225
[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.226
curl http://192.168.1.118:8068

注:出现这种负载说明没有问题

现在开始测试keepalive

注:将Master宕机看一下vip是否会转移到Backup

[root@bogon ~]# systemctl stop keepalived
[root@bogon ~]# ip a | grep 200			# 如果Backup上可以查看到说明没有问题,再次访问一下VIP看一下是否可以正常访问
inet 172.16.3.200/24 scope global ens160

# 如果还可以访问说明实验成功

[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.225
[root@bogon ~]# curl http://172.16.3.200:8080
172.16.3.226


curl http://192.168.1.104:8068

在down掉主节点后 vip自动漂移到了192.168.0.106备节点上

在down掉主节点后 访问 192.168.0.188:8068 还是可以访问到192.168.0.105和192.168.0.106

在down掉主节点后 访问 192.168.0.188:8068 还是可以访问到192.168.0.105和192.168.0.106

在down掉主节点后vip自动漂移到192.168.0.106备节点

1,手动添加vip

1,ifconfig查看当前活动网卡。如:eth0

2,执行

ifconfig eth0:0 166.111.69.100 netmask 255.255.255.0 up

ifconfig ens192:0 166.111.69.100 netmask 255.255.255.0 up

进行vip添加

3,执行ifconfig查看是否生效

4,测试 ping 166.111.69.100

5,写在/etc/rc.local里进行开机自动设置

2,第三方工具keepalived增加vip

1,下载与安装

安装:

tar xf keepalived-1.2.12.tar.gz      
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived
make &&  make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

2,配置:

vim 

/etc/keepalived/keepalived.conf 如下:
! Configuration File for keepalived

global_defs {
   notification_email {
   saltstack@163.com
  }
  notification_email_from dba@dbserver.com
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id MySQL-HA
}


vrrp_instance VI_1 {
  state BACKUP
  interface eth1
  virtual_router_id 51
  priority 150
  advert_int 1
  nopreempt

  authentication {
  auth_type PASS
  auth_pass 1111
  }

  virtual_ipaddress {
    192.168.1.88
  }
}

红色区域为需要修改的地方:

notification_email :变更后通知的email

notification_email_from :发送email

router_id MySQL-HA :路由器组id,局域网中需要共享该vip的服务器,该配置要一致。

state BACKUP:在keepalived中2种模式,

分别是master->backup模式和backup->backup模式

配置keepalived ping不通 解决办法

vim /etc/keepalived/keepalived.conf

把这个注释就可以了

vrrp_strict