OpenStack--网络环境实践(一)

来源:互联网 发布:杨修之死 知乎 编辑:程序博客网 时间:2024/05/16 17:14

本实验将多台物理主机中的虚拟主机组合,在主机A(计算节点)的虚拟主机形成局域网,同时通过主机B(控制节点)对外通信。。。

网络拓扑图

enter description here

外网地址规划
主机A作为计算节点,B作为网络控制节点,网关和DNS服务器为为192.168.153.2

主机 IP A ens33 192.168.153.141/24 B ens33 192.168.153.142/24

内网网络地址规划

主机 IP A ens37 192.168.10.1/24 B ens37 192.168.10.2/24

虚拟网络地址规划
10.0.4.200 -- 10.0.4.220由A主机网络名称空间dnsmasq提供

主机 IP VM1 10.0.4.215/24 VM2 10.0.4.210/24 VM3 10.0.4.211/24 DHCP 10.0.4.224/24

实现细节:

以下通过虚拟主机在主机中创建并联网过程说明

主机A中的虚拟主机创建并加入网络环境时,会创建成对的虚拟网卡前一半会生成虚拟主机中,后一半会调用脚本把另一半加入到虚拟交换机上,其命令如下:

/usr/libexec/qemu-kvm -name 'c1' -m 128 -smp 1 -drive file=cirros-no_cloud-0.3.0-x86_64-disk.img,media=disk,if=virtio, -net nic,model=virtio,macaddr=52:56:00:00:00:01    # 前半段虚拟网卡加入虚拟机-net tap,ifname=vif0.0,script=/etc/if-up,downscript=/etc/if-down  # 调用脚本,都半段加入到虚拟交换机上--daemonize 

虚拟主机在加入到网络环境中时,网卡设备会广播的形式发现网络环境中是否有DHCP服务器,发现有DHCP服务器后,虚拟主机会作为客户端请求IP租赁,这时运行在网络名称空间中的dnsmasq会响应客户端,并通过单播的方式,给客户端IP池中的地址。

各个虚拟主机和其他主机的虚拟机通信?

通过GRE协议对IP报文再次封装实现,其详细定义如下:

GRE(Generic Routing Encapsulation):通用路由封装协议。定义了在一种网络层协议上封装另一种协议(或同一种协议)。例如:对某些网络层协议(如IP和IPX)的数据报进行封装,使这些被封装的数据报能够在另一个网络层协议(如IP)中传输。同时这种技术也叫隧道Tunnel技术
Tunnel是一个虚拟的点对点的连接,在实际中可以看成仅支持点对点连接的虚拟接口,这个接口提供了一条通路使封装的数据报能够在这个通路上传输,并且在一个Tunnel的两端分别对数据报进行封装及解封 。

在虚拟的交换机上通过port的格式type定义了其协议类型默认为Ethernet,只需定义为gre即可,命令如下:

ovs-vsctl set interface gre1 type=gre options:remote_ip=192.168.10.2 # 指明typegre

到目前为止虚拟主机有了IP地址后通过虚拟交换机,虚拟交换机通过GRE隧道和其他主机的在一个局域网内通信。

实现过程

安装所需的包

yum install -y iproute vnc qemu-kvm dnsmasq# 也需要安装openvswitchrpm -iv openvswitch-2.5.3-1.x86_64.rpm还需准备cirros镜像

创建虚拟交换机和域名空间

systemctl start openvswitchovs-vsctl add-br br-in #其实虚拟交换机只是高级的桥设备# 创建域名空间ip netns add r0 #添加域名空间ip link add sif0 type veth peer name rif0  #添加一对网卡ip link set sif0 up  # 放到交换机上ip link set rif0 up  # 放到域名空间内

在域名空间中启动后一半网卡

ip netns exec r0 ip link set rif0 up  # 域名空间执行命令ip netns <域名空间名称> exec <命令>ip netns exec r0 ip addr add 10.0.4.254/24 dev rif0ip netns exec r0 ip addr list

在域名空间启用dnsmadq

ip netns exec r0 dnsmasq -F 10.0.4.200,10.0.4.220,86400 -i rif0ip netns exec r0 ss -tnlp # 查看是否监听在端口

在主机上添加虚拟机启动脚本

vim /etc/if-up

#!/bin/bash# bridge=br-inif [ -n "$1" ];then    ip link set $1 up    sleep 1    osv-svctl add-port $bridge $1      [ $? -eq 0 ] && exit 0 || exit 1else     echo "Error:no port specified"    exit 2fi

vim /etc/if-down

#!/bin/bash# bridge=br-inif [ -n "$1" ];then    ip link $1 down    sleep 1    ovs-vsctl del-prot $bridge $1    [ $? -eq 0 ] && exit 0 ||exit 1else     echo "Error:no port specified"    exit 2fi

运行主机

# 运行虚拟机1/usr/libexec/qemu-kvm -name 'vm1' -m 128 -smp 1 -drive file=cirros-no_cloud-0.3.0-x86_64-disk.img,media=disk,if=virtio, -net nic,model=virtio,macaddr=52:56:00:00:00:01 -net tap,ifname=vif0.0,script=/etc/if-up,downscript=/etc/if-down --daemonize # 修改参数后运行虚拟机2 需修改mac地址 接口名称/usr/libexec/qemu-kvm -name 'vm2' -m 128 -smp 1 -drive file=cirros-no_cloud-0.3.0-x86_64-disk.img,media=disk,if=virtio, -net nic,model=virtio,macaddr=52:56:00:00:00:31 -net tap,ifname=vif1.0,script=/etc/if-up,downscript=/etc/if-down --daemonize

vnc连接主机

Xshell在安装Xmanager后,开启转发x11,可连连接虚拟机功能

enter description here

运行vnc连接虚拟主机

vncviewer :5900 &# 其间遇到的问题WARNING! The remote SSH server rejected X11 forwarding request.# 解决办法yum install xorg-x11-xauth再次运行即可

如图,虚拟主机获取到IP地址

enter description here

添加新接口与主机B通信

ovs-vsctl set interface gre1 type=gre options:remote_ip=192.168.10.2

主机B配置

yum install -y iproute vnc qemu-kvm# 也需要安装openvswitchrpm -iv openvswitch-2.5.3-1.x86_64.rpmsystemctl start openvswitchovs-vsctl set interface gre1 type=gre options:remote_ip=192.168.10.1#从A复制脚本镜像到B主机scp /etc/if-* cirros-no_cloud-0.3.0-x86_64-disk.img root@192.168.153.142:/root/mv if-* /etc/# 启动虚拟机/usr/libexec/qemu-kvm -name 'vm3' -m 128 -smp 1 -drive file=cirros-no_cloud-0.3.0-x86_64-disk.img,media=disk,if=virtio, -net nic,model=virtio,macaddr=52:56:00:00:00:61 -net tap,ifname=vif1.0,script=/etc/if-up,downscript=/etc/if-down --daemonize

B主机虚拟机获取到A主机DHCP的地址

enter description here

VM2主机与VM3主机跨主机通信

enter description here

在主机A ens37网卡抓包

[root@localhost ~]# tcpdump -i ens37 -nntcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes18:43:18.906672 IP 192.168.10.1 > 192.168.10.2: GREv0, length 102: IP 10.0.4.210 > 10.0.4.211: ICMP echo request, id 41984, seq 86, length 6418:43:18.907074 IP 192.168.10.2 > 192.168.10.1: GREv0, length 102: IP 10.0.4.211 > 10.0.4.210: ICMP echo reply, id 41984, seq 86, length 64

可以看出IP报文被二次封装后发送….
至此VM1``VM2``VM3可正常通信。

enter description here

以上完成虚拟主机在宿主机主机之间的通信,虚拟主机与外网通信放到下一篇文章中
openstack–网络环境实践(二)

原创粉丝点击