1. 直接路由方案
通过在每个Node上添加到其他Node上docker0的静态路由规则,就可以将不同物理服务器上Docker Daemon创建的docker0网桥互联互通。
注:两个Node上docker0地址是不能相同的,通过docker daemon –bip参数来修改网桥IP地址
例如:
Pod1所在docker0网桥的IP子网是10.1.10.0,Node地址为192.168.1.128;而Pod2所在docker0网桥的IP子网是10.1.20.0,Node地址为192.168.1.129。
在Node1上用route add命令增加一条到Node2上docker0的静态路由规则:
route add -net 10.1.20.0 netmask 255.255.255.0 gw 192.168.1.129
在Node2上增加一条到Node1上docker0的静态路由规则:
route add -net 10.1.10.0 netmask 255.255.255.0 gw 192.168.1.128
在Node1上通过ping命令验证到Node2上docker0的网络连通性。这里10.1.20.1为Node2上docker0网桥自身的IP地址。
# ping 10.1.20.1
集群中机器的数量通常可能很多,可以使用Quagga软件来实现路由规则的动态添加。主页为:http://www.nongnu.org/quagga/
在每台服务器安装Quagga软件并启动,还可以使用互联网上的一个Quagga容器来运行,使用index.alauda.cn/georce/router镜像启动Quagga。在每台Node上下载该Docker镜像。
# docker pull index.alauda.cn/georce/router
在运行Quagga路由器之前,需要确保每个Node上docker0网桥的子网地址不能重叠,也不能与物理机所在的网络重叠。
Node1: # ifconfig docker0 10.1.10.1/24
Node2: # ifconfig docker0 10.1.20.1/24
Node3: # ifconfig docker0 10.1.30.1/24
然后在每个Node上启动Quagga容器。需要说明的是,Quagga需要以–privileged 特权模式运行,并且指定–net=host,表示直接使用物理机的网络。
# docker run -itd --name=router --privileged --net=host kubernetes-master:5000/router
Node1: # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.123.250 0.0.0.0 UG 100 0 0 eno16777736
10.1.10.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
10.1.20.0 192.168.123.203 255.255.255.0 UG 20 0 0 eno16777736
10.1.30.0 192.168.123.204 255.255.255.0 UG 20 0 0 eno16777736
192.168.123.0 0.0.0.0 255.255.255.0 U 100 0 0 eno16777736
2. 使用flannel叠加网络
flannel采用叠加网络(Overlay Network)模型来完成网络的打通。
(1) 安装etcd
由于flannel使用etcd作为数据库,所以需要预先安装好etcd
(2) 安装flannel
从https://github.com/coreos/flannel/releases 下载最新稳定版本
# tar zxf flannel-0.5.5-linux-amd64.tar.gz #解压文件
# cp flannel-0.5.5/* /usr/bin/ #拷贝可执行文件至系统变量path
(3) 配置flannel
使用systemd来管理flannel服务
[root@docker2 ~]# cat /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
Before=docker.service
[Service]
<