目录

Keepalived + LVS DR模式 部署实战

注意
本文最后更新于 2021-11-04,文中内容可能已过时。

DR模式

规划:

机器 IP
VIP 192.168.20.20
director 192.168.20.21
realserver1 192.168.20.22
realserver2 192.168.20.23
网卡interface eth0

DR模式,Director和realserver都在一个内网里面,他们都绑定上同一个VIP,所以得让realserver不响应arp,不然肯定会造成内网IP冲突

RealServer设置

配置不响应ARP请求

方法1: 调整内核参数

# 不响应ARP请求, 修改内核参数
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

方法2: 采用arptables

arptables -A IN -d <virtual_ip> -j DROP arptables-A OUT -s <virtual_ip> -j mangle –mangle-ip-s <real_ip>

例如:

# Disable arp requests on virtual_ip
ExecStart=/usr/sbin/arptables -I INPUT -j DROP -d 192.168.20.20
ExecStart=/usr/sbin/arptables -I OUTPUT -j mangle -s 192.168.20.20 --mangle-ip-s 192.168.20.22

# Add vip after arptables is initialized
ExecStart=/usr/sbin/ip addr add 192.168.20.20/24 brd + dev eth0

# stop realserver
ExecStop=/usr/sbin/ip addr del 192.168.20.20/24 brd + dev eth0
ExecStop=/usr/sbin/arptables -D INPUT -j DROP -d 192.168.20.20
ExecStop=/usr/sbin/arptables -D OUTPUT -j mangle -s 192.168.20.20 --mangle-ip-s 192.168.20.22

上面的意思是:进来的ARP,如果目的IP是VIP的,丢弃; 发出去的ARP包,如果源IP是VIP的,改成realserver的IP。与内核ARP参数arp_ignore=1,arp_announce=2的作用是一样的。
特别注意:arptables 只是过虑了ARP广播包,如果手动绑定IP和MAC,或者存在正确的MAC缓存,也是可以和主机通信的

Director设置

使用ipvsadm

添加VIP:

ip address add 192.168.20.20/24 dev eth0

添加virtualserver rr是轮询

ipvsadm -A -t 192.168.20.20:80 -s rr
ipvsadm -a -t 192.168.20.20:80 -r 192.168.20.22:80 -g
ipvsadm -a -t 192.168.20.20:80 -r 192.168.20.23:80 -g
ipvsadm

keepalived配置

有了keepalived可以不用执行ipvsadm了, 并且可以实现自动剔除节点,还可以两台Director做高可用。

keepalived 配置:

vrrp_sync_group GOP {
    group {
        VI_PRI_CONNECT
        VI_PRI_AUTH
    }
}

vrrp_instance VI_PRI_CONNECT {
    state BACKUP
    interface eth0
    virtual_router_id 128
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.20.20/24 dev eth0
    }
}


virtual_server 192.168.20.20 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP


    real_server 192.168.20.22 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
    }
    real_server 192.168.20.23 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
    }
}