使用ovs 搭建docker 容器间多节点互联,这与其他文章写的只2个节点做gre隧道互联有一些区别,特别是后续扩容节点后的互通,下面是整个构建过程步骤
服务器地址
192.168.5.134 node1
192.168.5.153 node2
192.168.5.154 node3
安装ovs不是我们这篇文章讨论的重点,安装ovs可以参考以下链接
https://n40lab.wordpress.com/2014/09/04/openvswitch-2-3-0-lts-and-centos-7/
我们先在
node1
和node2
上配置ovs brigde,以下命令在2个节点都执行
ovs-vsctl add-br obr0
node1
和node2
gre隧道
ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.5.153
ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.5.154
我们创建一个网桥
kbr0
来替换docker的默认docker0网桥(node1
,node2
)
brctl addbr kbr0
brctl addif obr0
ip link set dev docker0 down
ip link del dev docker0
配置完后,我们在
/etc/sysconfig/network-script
目录下创建一个ifcfg-kbr0文件输入如下内容,这样做是为了让我们重启服务器后网络配置任然有效.
DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.17.1.1
NETMASK=255.255.255.0
GATEWAY=172.17.1.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no
我们在
node2
上同样的创建相同的文件,只是把其中的IPADDR=172.17.1.1
和GATEWAY=172.17.1.0
更改为IPADDR=172.17.2.1
,GATEWAY=172.17.2.0
重启网络服务或重启主机生效
没有配置路由之前我们是无法使用ping通kbr0网桥地址,我们进行路由如下配置
#node1 配置(注意eno16777736 这里指的是你的物理网卡名称)
ip route add 172.17.2.0/24 via 192.168.5.153 dev eno16777736
#node2
ip route add 172.17.1.0/24 via 192.168.5.134 dev eno16777736
同时我们将配置写入到
/etc/sysconfig/network-script/
下的route-eno16777736 文件(该文件需要自行创建注意route-eno16777736
必须与网卡一致)
#node1 route-eno16777736
172.17.2.0/24 via 192.168.5.154 dev en016777736
#node2 route-eno16777736
172.17.1.0/24 via 192.168.5.134 dev en016777736
配置完以后,我们可以看到我们能ping通两边的网络了
docker 启动时候默认使用docker0, 前面我们将docker0进行删除,但如果再重启docker,任然会启动一个docker0网桥,这需要我们修改docker默认启动配置,使用我们自己创建的网桥
#修改OPTIONS 参数添加"-b=kbr0"
OPTIONS='--selinux-enabled -b=kbr0'
我们启动容器后,发现其他节点并不能ping通启动后分配的容器内地址,所以我们需要将内核的转发开启
echo 1 > /proc/sys/net/ipv4/ip_forward
前面都是2个节点配置gre 互通,那么如果再新增节点的话该如何配置才能与前面2个节点互通呢?,很简单我们需要做如下步骤操作
#1.参照前面的第4点,进行docker0 替换
#2.在第三个节点增加前面2个节点路由,这样我们就能ping通前面2个节点了
172.17.2.0/24 via 192.168.5.153 dev eno16777736
172.17.1.0/24 via 192.168.5.134 dev eno16777736
#3.如果需要node1,node2 能ping通 node3的话 ,同样的我们需要在node1,node2 上面增加node3 路由
172.17.3.0/24 via 192.168.5.154 dev en016777736
#4.同样的我们需要配置内核转发,参考第7点
#4.这样我们就构成了3节点容器互通网络, 如果再增加节点重复此顺序操作
#我们在节点2启动了一个容器,同时在节点1也启动了一个容器地址为(172.17.1.3),我们在节点2进行ping节点1容器地址能正常ping通
root@00d64ee5605c:/# ifconfig |grep inet
inet addr:172.17.2.5 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:acff:fe11:205/64 Scope:Link
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
root@00d64ee5605c:/# ping 172.17.1.3
PING 172.17.1.3 (172.17.1.3) 56(84) bytes of data.
64 bytes from 172.17.1.3: icmp_seq=1 ttl=62 time=1.71 ms
64 bytes from 172.17.1.3: icmp_seq=2 ttl=62 time=0.313 m
#测试各节点互通
[root@ovs-node1 sysconfig]# ping 172.17.1.1
PING 172.17.1.1 (172.17.1.1) 56(84) bytes of data.
64 bytes from 172.17.1.1: icmp_seq=1 ttl=64 time=0.772 ms
64 bytes from 172.17.1.1: icmp_seq=2 ttl=64 time=0.222 ms
^C
--- 172.17.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.222/0.497/0.772/0.275 ms
[root@ovs-node1 sysconfig]# ping 172.17.3.1
PING 172.17.3.1 (172.17.3.1) 56(84) bytes of data.
64 bytes from 172.17.3.1: icmp_seq=1 ttl=64 time=0.337 ms
64 bytes from 172.17.3.1: icmp_seq=2 ttl=64 time=0.525 ms