建立基于Open vSwitch的GRE隧道
1. 环境的准备
图6-1 连接拓扑图
如图6-1所示为两台虚拟机连接拓扑图,两台虚拟机ens33网卡,通过虚拟交换机连接在一起,地址网段为30.0.0.0/24。在Docker主机ens33,IP地址为30.0.0.10/24,创建br-int网桥,IP地址为30.1.0.1/24。创建br0网卡,Docker容器使用br0网卡,绑定到br-int网桥上。KVM主机中创建br-ex网桥,配置IP地址为30.0.0.20/24,创建br-int网卡,KVM虚拟机使用br-int网卡,绑定到br-ex网桥上。KVM主机br-int网卡和Docker主机br-int建立GRE隧道,为GRE隧道指定静态路由。
(1)Docker主机
配置1核CPU,2 GB内存,系统为CentOS 7.5,使用NAT模式,ens33地址为30.0.0.10。
(2)KVM主机
配置1核CPU,1 GB内存,系统为CentOS 7.5,使用NAT模式,ens33地址为30.0.0.20。KVM需要打开虚拟化,如下图所示
(3)所需要准备的软件和镜像包
需要的软件和镜像包有VMware Workstation Pro、CentOS-7-x86_64-DVD-1804.iso镜像包、YUM安装包。
2. Docker主机
(1)升级内核版本
1 查看当前系统版本。
# uname -r 3.10.0-862.el7.x86_64 |
2 更新内核。
# yum install kernel |
3 修改grup引导,重新启动。
# vi /etc/grub.conf #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (3.10.5-3.el6.x86_64) root (hd0,0) kernel /vmlinuz-3.10.5-3.el6.x86_64 ro root=UUID=285d26b4-1a82-4f6d-be2b-21924be294ac rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE= us rd_NO_DM rhgb quiet initrd /initramfs-3.10.5-3.el6.x86_64.img title CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=285d26b4-1a82-4f6d-be2b-21924be294ac rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABL E=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img |
内核版本由上至下进行选择,将default改为0,即选择第一个内核版本。
重新启动系统。
# reboot |
4 查看升级后系统版本。
# uname -r 3.10.0-862.el7.x86_64 |
(2)配置网络
1 修改主机名称。
# hostnamectl set-hostname docker 或# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=docker |
2 配置Docker主机ens33的网络。
# vi /etc/sysconfig/network-scripts/ifcfg-ens33 |
修改是否连接网络(ONBOOT)。
ONBOOT=yes |
修改关闭网络实时生效(NM_CONTROLLED)。
NM_CONTROLLER=no |
添加静态网络模式(BOOTPROTO)。
BOOTPROTO=static (也可用DHCP) |
添加IP地址掩码和网关。
IPADDR=30.0.0.10 (根据实际要求配置IP地址) NETMASK=255.255.255.0 GATEWAY=30.0.0.1 |
3 重启网络。
# systemctl restart network |
(3)基础配置
1 上传Packages.tar.gz和docker.tar.tz文件。
# tar -zxvf Packages.tar.gz -C /opt/ #tar -zxvf docker.tar.gz -C /opt/ |
2 配置本地YUM。
# vi /etc/yum.repos.d/local.repo [docker] name=docker baseurl=file:///opt/docker gpgcheck=0 enabled=1 |
3 清除防火墙规制。
#yum -y install iptables
# iptables -F # iptables -X # iptables -Z # iptables-save # systemctl stop iptables |
4 开启核内转发。
# echo 1 > /proc/sys/net/ipv4/ip_forward # echo 'net.ipv4.ip_forward=1' >/etc/sysctl.conf # echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf # echo 'net.ipv4.conf.all.rp_filter=0' >> /etc/sysctl.conf |
生效核内转发。
# /sbin/sysctl –p |
5 修改SELinux规则。
# vi /etc/selinux/config SELINUX=permissive # setenforce 0 |
(4)安装服务
1 安装Open vSwitch、Docker和Bridge服务。
# yum install openvswitch bridge-utils tunctl docker-io –y |
2 更新路由。
# yum update iproute |
3 启动Open vSwitch。
# systemctl start openvswitch |
查看ovs-vsctl的配置。
# ovs-vsctl show 9ea07837-4f42-413b-bdc8-56829647874a ovs_version: "2.1.3" |
(5)创建网桥
1 创建br-int网桥。
#ovs-vsctl add-br br-int |
创建br0网桥。
#brctl addbr br0 |
2 重启网络。
# systemctl restart network |
3 给br0网桥添加地址。
#ifconfig br0 30.1.0.1/24 |
4 绑定br0网桥到br-int上面。
#brctl addif br0 br-int |
(6)创建GRE隧道
1 创建gre0接口。
#ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=30.0.0.20(对端ens33IP地址) |
2 启动br0、br-int网桥。
#ip link set br0 up #ip link set br-int up #ifconfig br-int up # ifconfig br0 up |
3 配置静态路由。
#ip route add 30.2.0.0/24 via 30.0.0.20(对端ens33IP地址) dev ens33 |
4 配置Docker容器使用的网桥。
#vi /etc/sysconfig/docker other_args=’--bridge=br0’ (文件最后) |
(7)启动Docker服务
1 启动Docker。
#systemctl start docker |
2 上传CentOS 6.5的镜像包。(上传xd-centos6.5-ssh-tar)
# docker load < xd-centos6.5-ssh-tar //将镜像包重新导入 #docker images (查看ID号) # docker tag d0d663863c34 (ID为上一步上传镜像的IMAGE ID) centos:6.5 |
3 运行容器。
# docker run -itd --name=centos6.5 centos:6.5 /bin/bash #docker ps -a |
4 查看容器IP。
# docker exec -it centos6.5 /bin/bash 进入dock查看IP地址 则获取的IP地址段为30.1.0.0/24 (与br0在同一个网段) |
3. KVM主机
(1)基本配置
检查系统是否支持虚拟化
看看CPU是否支持虚拟化。
# grep -E -o 'vmx|svm' /proc/cpuinfo |
注意:返回vmx代表支持因特尔(Intel)系列CPU的虚拟化,返回svm代表支持AMD系列CPU的虚拟化。 |
1 配置主机名。
# hostnamectl set-hostname kvm # vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=kvm |
2 配置KVM主机ens33的网络。
# vi /etc/sysconfig/network-scripts/ifcfg-ens33 |
修改是否连接网络(ONBOOT)。
ONBOOT=yes |
修改关闭网络实时生效(NM_CONTROLLED)。
NM_CONTROLLED=no |
添加静态网络模式(BOOTPROTO)。
BOOTPROTO=static (也可以用DHCP) |
添加IP地址掩码和网关。
IPADDR=30.0.0.20 NETMASK=255.255.255.0 GATEWAY=30.0.0.1 |
3 重启网络。
# systemctl restart network |
4 配置br-ex网桥。
# cd /etc/sysconfig/network-scripts/ #cp -p ifcfg-ens33 ifcfg-br-ex #vi ifcfg-br-ex DEVICE=br-ex TYPE=Enternet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static IPADDR=30.0.0.20 (用当前宿主机的IP地址) NETMASK=255.255.255.0 GATEWAY=30.0.0.1 #vi ifcfg-ens33 DEVICE=ens33 TYPE=Enternet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none |
5 配置YUM。
上传Packages.tar.gz文件。
# tar -zxvf Packages.tar.gz -C /opt/ |
配置本地YUM文件。
# vi /etc/yum.repos.d/local.repo [centos] name=centos baseurl=file:///opt/docker gpgcheck=0 enabled=1 [Packages] name=Packages baseurl=file:///opt/Packages gpgcheck=0 enabled=1 |
6 清空防火墙配置。
# iptables –Z # iptables –X # iptables –F # iptables-save # systemctl stop iptables |
7 开启核内转发。
#echo 1 > /proc/sys/net/ipv4/ip_forward # echo 'net.ipv4.ip_forward=1' > /etc/sysctl.conf # echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf # echo 'net.ipv4.conf.all.rp_filter=0' >> /etc/sysctl.conf |
生效核内转发。
[root@kvm ~]# sysctl -p |
修改SELinux规则。
# vi /etc/selinux/config SELINUX=permissive # setenforce 0 |
(2)安装服务软件包
1 安装所需安装包。
# yum update iproute #yum install openvswitch qemu-kvm libvirt dnsmasq -y |
2 启动Open vSwitch。
# systemctl start openvswitch |
3 配置网桥。
# ovs-vsctl add-br br-int # ifconfig br-int 30.2.0.1/24 #ifconfig br-int up # ovs-vsctl add-br br-ex #ovs-vsctl add-port br-ex ens33 && systemctl restart network |
(3)配置GRE隧道
1 配置GRE隧道。
#ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=30.0.0.10(对端ens33IP地址) |
2 配置路由。
#ip route add 30.1.0.0/24 via 30.0.0.10(对方的IP地址) dev br-ex |
3 配置DNS。
# /usr/sbin/dnsmasq --strict-order --bind-interfaces --interface=br-int --except-interface=lo --pid-file=/var/run/qdhcp.pid --leasefile-ro --dhcp-range=30.2.0.3,30.2.0.254,255.255.255.0,12h --conf-file= #ps -ef |grep dnsmasq |
4 创建安装网卡脚本。(up,down脚本文件都保存/root)
# vi ovs-ifup #!/bin/sh switch='br-int' /sbin/ifconfig $1 up ovs-vsctl add-port ${switch} $1 |
5 创建卸载网卡脚本。
# vi ovs-ifdown #!/bin/sh switch='br-int' /sbin/ifconfig $1 down ovs-vsctl del-port ${switch} $1 |
6 修改创建的脚本的权限。
# chmod 777 ovs-if* |
7 开启虚拟机。
# ovs-vsctl del-port tap0 #/usr/libexec/qemu-kvm -m 1024 -drive file=/root/cirros-0.3.3-x86_64-disk.img,if=virtio -net nic,model=virtio -net tap,script=ovs-ifup -nographic -vnc :1 进入主机查看IP地址,其获取的地址为:30.2.0.0/24(br-int网段地址) |
4. 主机测试
1 查看开启的Docker容器进程。
# docker ps –a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a76c2fc817d1 d0d663863c34 "/bin/bash" 6 hours ago Up 6 hours mad_poincare |
进入Docker容器内部
#docker exec -it 9adae010e4a3 /bin/bash # ip a 6: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:1e:01:00:02 brd ff:ff:ff:ff:ff:ff inet 30.1.0.2/24 scope global ens33 inet6 fe80::42:1eff:fe01:2/64 scope link valid_lft forever preferred_lft forever |
2 测试网络连通性。
测试Docker主机和KVM主机与br0和br-int网桥之间的连通性。
# ping 30.1.0.1 -c 4 PING 30.1.0.1 (30.1.0.1) 56(84) bytes of data. 64 bytes from 30.1.0.1: icmp_seq=1 ttl=64 time=0.041 ms 64 bytes from 30.1.0.1: icmp_seq=2 ttl=64 time=0.062 ms 64 bytes from 30.1.0.1: icmp_seq=3 ttl=64 time=0.041 ms 64 bytes from 30.1.0.1: icmp_seq=4 ttl=64 time=0.040 ms --- 30.1.0.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 0.040/0.046/0.062/0.009 ms [root@a76c2fc817d1 /]# ping 30.0.0.10 -c 4 PING 30.0.0.10 (30.0.0.10) 56(84) bytes of data. 64 bytes from 30.0.0.10: icmp_seq=1 ttl=64 time=0.040 ms 64 bytes from 30.0.0.10: icmp_seq=2 ttl=64 time=0.048 ms 64 bytes from 30.0.0.10: icmp_seq=3 ttl=64 time=0.045 ms 64 bytes from 30.0.0.10: icmp_seq=4 ttl=64 time=0.047 ms --- 30.0.0.10 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 0.040/0.045/0.048/0.003 ms [root@a76c2fc817d1 /]# ping 30.0.0.20 -c 4 PING 30.0.0.20 (30.0.0.20) 56(84) bytes of data. 64 bytes from 30.0.0.20: icmp_seq=1 ttl=63 time=0.614 ms 64 bytes from 30.0.0.20: icmp_seq=2 ttl=63 time=0.295 ms 64 bytes from 30.0.0.20: icmp_seq=3 ttl=63 time=2.38 ms 64 bytes from 30.0.0.20: icmp_seq=4 ttl=63 time=0.533 ms --- 30.0.0.20 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 0.295/0.957/2.387/0.834 ms [root@a76c2fc817d1 /]# ping 30.2.0.1 -c 4 PING 30.2.0.1 (30.2.0.1) 56(84) bytes of data. 64 bytes from 30.2.0.1: icmp_seq=1 ttl=63 time=0.864 ms 64 bytes from 30.2.0.1: icmp_seq=2 ttl=63 time=0.545 ms 64 bytes from 30.2.0.1: icmp_seq=3 ttl=63 time=0.321 ms 64 bytes from 30.2.0.1: icmp_seq=4 ttl=63 time=0.637 ms --- 30.2.0.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3002ms rtt min/avg/max/mdev = 0.321/0.591/0.864/0.196 ms [root@a76c2fc817d1 /]# ping 30.2.0.140 -c 4 PING 30.2.0.140 (30.2.0.140) 56(84) bytes of data. 64 bytes from 30.2.0.140: icmp_seq=1 ttl=62 time=3.20 ms 64 bytes from 30.2.0.140: icmp_seq=2 ttl=62 time=0.800 ms 64 bytes from 30.2.0.140: icmp_seq=3 ttl=62 time=1.24 ms 64 bytes from 30.2.0.140: icmp_seq=4 ttl=62 time=0.766 ms --- 30.2.0.140 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 0.766/1.504/3.203/0.999 ms |