搭建基于openvswitch vxlan协议的多主机KVM虚拟机连接环境

背景

通过在物理机上启动多个KVM的方式可以用来模拟需要使用大量物理机的环境,并进行服务功能的一些验证。同一物理机上的KVM之间是可以进行通信的,但是不同物理机之间的KVM通信就需要使用openvswitch来进行连接。

VXLAN(Virtual eXtensible Local Area Network)是一种将二层报文用三层协议进行封装的技术,可以对二层网络在三层范围进行扩展。VXLAN屏蔽了UDP的存在,上层基本上不感知这层封装。同时VXLAN避免了GRE的点对点必须有连接的缺点。

搭建过程

环境要求

  • 两台可以正常通信的物理机
    • 11.239.153.34 10.101.161.35
    • 内核版本:3.10.0
  • openvswitch 安装包
    • 版本 openvswitch-2.5.1
  • 部署虚拟机的脚本(可参考网络)

操作步骤

安装openvswitch
  • 下载解压OVS安装包
wget http://openvswitch.org/releases/openvswitch-2.5.1.tar.gz
tar -zxvf  openvswitch-2.5.1.tar.gz
  • 构建基于Linux内核的交换机
cd openvswitch-2.5.1
./configure --with-linux=/lib/modules/`uname -r`/build 2>/dev/null
  • 编译安装OVS
cp /usr/bin/libtool . [note: 安装包libtool和系统不一致,将系统的拷贝至当前目录即可]
make -j24
make install
  • 加载openvswitch.ko模块用以支持VLAN功能
modinfo datapath/linux/openvswitch.ko | grep depends
将上述依赖使用如下命令逐个添加
modprobe libcrc32c[多个依赖]
insmod datapath/linux/openvswitch.ko
  • 安装并加载内核模块
make modules_install
/sbin/modprobe openvswitch
  • 使用ovsdb工具初始化配置数据库
mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema  2>/dev/null

至此,如果没有报错的话OVS的部署已经成功完成。

  • 在启动OVS之前,我们需要先启动ovsdb-server配置数据库。注意后面的命令大部分是由两个短“-”组成的。
ovsdb-server -v remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
  • 首次用ovsdb-tool创建数据库时需用ovs-vsctl命令初始化下数据库。
ovs-vsctl --no-wait init
  • 启动OVS主进程
ovs-vswitchd --pidfile --detach
  • 查看OVS进程是否启动
ps -ef |grep ovs

搭建基于openvswitch vxlan协议的多主机KVM虚拟机连接环境_第1张图片

部署KVM

由于是公司内部的部署脚本,不方便公开。大家可以参考网络上的部署方法,或者直接使用XML方式创建虚拟机会更加快捷。最好支持ssh登陆方式。

  • 查看操作虚拟机
ssh root@192.168.122.21 即可登陆
在物理机上可使用virsh 命令操作虚拟机,常用的有
virsh list --all 列出虚拟机和状态
virsh destroy vmname 强制关闭虚拟机
virsh start vmname 启动虚拟机
virsh edit vmname 编辑虚拟机的xml文件
配置VXLAN网络
  • 添加OVS网桥
ovs-vsctl add-br ovsbr0
  • 设置VXLAN
ovs-vsctl add-port ovsbr0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=10.101.161.35
[note: remote_ip 为另一个物理机的ip地址]

ovs-vsctl show
  • 切换网桥
    之前我们建立虚拟机的时候使用的是virbr0网桥,这里要将上面的虚拟机端口切换到我们刚刚建立的ovsvr0网桥上,之后就大功告成。
brctl show 查看virbr0上面的vnet端口号
brctl delif virbr0 vnet_num
ovs-vsctl add-port ovsbr0 vnet_num
使用ovs-vsctl show显示如下:

搭建基于openvswitch vxlan协议的多主机KVM虚拟机连接环境_第2张图片

之后就可以用ssh登陆不同主机上的虚拟机,尝试ping命令啦!
此处可以在虚拟机中使用tcpdump查看是否是二层协议,即不通过网关:

tcpdump -i eth0 icmp

搭建基于openvswitch vxlan协议的多主机KVM虚拟机连接环境_第3张图片

网络结构:

    物理机:  11.239.153.34
        kvm12220: 192.168.122.20
        kvm12221: 192.168.122.21

    物理机: 10.101.161.35
        kvm12213: 192.168.122.13

最后,这里是搭建了两台物理机之间的vxlan,如果是多台,那么就要添加多个port,在其中指定要到达的remote_ip,即这是一个完全图。

[注意]使用scp或者telnet检测网络的速度,如果速度很慢,那么需要设置KVM内部网络的mtu小一些(1400)左右,原因是vxlan在包通过ovsbr0网桥后进行了封包操作,有可能导致包的大小超过1500(默认值),会进行分片或者丢弃,导致网络情况变差。

后记[问题记录]

搭建的过程不容易,遇到各种版本、兼容性和网络方面的问题,这里列出一些问题列表,希望可以提供一些帮助。

  • 在之前一些系统上进行openvswitch的安装,bridge.ko和openvswitch.ko不兼容,并提示内核不兼容,这里原因有可能你的内核版本过低导致的。
  • openvswitch要选择适合当前系统的版本,否则autoconf等各种组件都需要升级,依赖库庞大。
  • 注意各个网桥和虚拟机的ip和网关的设置
  • 切换网桥时,修改虚拟机的xml文件和libvirt下的default.xml均不work,无法ping通网络。可能是openvswitch没有开启兼容模块。推荐切换端口的方式。
  • 网络不同时可使用iptables -F关闭防火墙;arp -r查看ip到mac的转换是否成功。
  • 最后,virsh等的操作需要依赖库,可自行google 。

参考资料

  • http://www.sdnlab.com/5365.html
  • http://notes.yuwh.net/%E5%9C%A8centos7%E4%B8%8A%E9%85%8D%E7%BD%AEopen-vswitch%E5%92%8Cvxlan/
  • http://www.spinics.net/linux/fedora/libvirt-users/msg04599.html
  • http://sdnhub.cn/index.php/libvirt-openvswitch/
  • http://www.sdnlab.com/3166.html

你可能感兴趣的:(Linux基础及编程,Programming,int,the,Linux,environment)