前言

        最近学习docker做了一个高可用的demo,驱动我做这个试验的原因是使用keepalived需要安装多个依赖包,而我主要从事政府软件开发在内网服务器中安装非常不方便,因此想到了keepalived和docker结合解决此问题。

摘要

        试验由安装了docker的A、B两台电脑完成,在两台电脑上创建docker桥接网络然后依托于网桥在每台电脑中运行一个docker容器,并在容器中安装keepalived组件,最后采用断网的方式测试虚拟ip的漂移情况。

(1)软件环境:

  • 宿主机系统:centos7
  • docker 版本:19.03.0
  • 镜像版本:centos:7
  • keepalived版本:2.0.7

(2)逻辑环境:

      宿主机名             宿主机IP            容器IP            虚拟IP
      宿主机1      192.168.234.130    192.168.234.132     192.168.234.140
      宿主机2      192.168.234.131     192.168.23

 安装步骤

        以宿主机1安装步骤为例讲解试验的安装过程

(1)创建网络和容器

创建网络

        docker有bridge、host、container、none四种网络模式,其中bridgedokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。但默认bridge网络的IP是172段的,而我们通常需要docker容器可以和局域网中其他机器相互访问,因此我们需要创建指定IP段的自定义bridge。

docker network create -d macvlan --subnet=192.168.234.0/24 --gateway=192.168.234.2 -o parent=ens33 mynet

  • -d 指定 Docker 网络 driver 为macvlan
  • --subnet 指定 macvlan 网络所在的网络段
  • --gateway 指定网关
  • -o parent 指定用来分配 macvlan 网络的物理网卡

创建容器

docker run  -itd --privileged=true --name test --net mynet --ip 192.168.234.132 centos:7  /bin/bash

  •  -i  打开STDIN,用于控制台交互 
  •  -t 分配tty设备,该可以支持终端登录,默认为false
  • -d 让容器在后台运行
  • --privileged 特权模式(默认关闭),用于容器启动后台服务
  • --net 指定容器网络
  • --ip 指定容器IP

进入容器

docker exec -it test sh

(2)安装依赖包

yum install -y curl gcc openssl openssl-devel libnl libnl-devel libnfnetlink-devel

(3)安装依赖命令

# 安装make编译命令      

yum -y install cmake

# 安装ifconfig命令      

yum -y install net-tools

# 安装wget命令      

yum -y install wget

(4)安装keepalived

#下载安装包

wget http://www.keepalived.org/software/keepalived-2.0.7.tar.gz

# 解压缩

tar xvf keepalived-2.0.7.tar.gz

cd keepalived-2.0.7

# 设置编译位置

./configure --prefix=/usr/local/keepalived  --sysconf=/etc

# 编译安装

make && make install

# 将keepalived主程序加入到环境变量

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

# keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用service命令便捷调用

cp /usr/local/keepalived-2.0.7/keepalived/etc/init.d/keepalived  /etc/init.d/keepalived

(5)配置keepalived.conf

        vi /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     ……
   }
   …
   vrrp_strict  # 此配置注释掉后外界才能ping通虚拟IP
   ……
}

vrrp_instance VI_1 {
    state MASTER  #主从标识MASTER/BACKUP
    interface ens33  # 网卡
    virtual_router_id 51 #路由ID主从必须一致
    priority 101   # 权重用于选举
    advert_int 1   # 1代表1秒检查一次
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.234.140  # 虚拟IP
    }
}

(6)配置启动命令

# 安装service命令
yum install initscripts -y
# 添加service 命令
chkconfig --add keepalived

(7)启动keepalived

# 启动服务
 service keepalived start|stop

sh-4.2# service keepalived start
Failed to get D-Bus connection: Operation not permitted 
Starting keepalived:                                   [ ok ]

 

# 查看虚拟ip命令
ip addr show eth0

sh-4.2# ip addr show eth0
21: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:ea:84 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.234.132/24 brd 192.168.234.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.234.140/32 scope global eth0
       valid_lft forever preferred_lft forever

总结

 到此宿主机1的安装已完成,宿主机2的安装与其安装过程完全相同(注意keepalived.conf配置),在keepalived中我将宿主机1运行容器安装的keepalived设置为MASTER而宿主机2运行容器安装的keepalived设置为BACKUP,正常启动情况下虚拟IP 140 绑定在MASTER网卡上,当我将宿主机1关闭容器的情况下,BACKUP会自动获取虚拟IP 140 而当MASTER再次启动时虚拟IP会自动回到MASTER,以上就是我使用docker容器测试keepalived高可用的过程,希望对有需要的同学有用。

(补充:我尝试过使用host方式运行keepalived,但当关闭容器时宿主机虚拟IP不会在本机下载掉造成双虚拟IP在线也就是脑裂现象。)

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐