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

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

网络拓扑图

enter description here

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

主机IP
A ens33192.168.153.141/24
B ens33192.168.153.142/24

内网网络地址规划

主机IP
A ens37192.168.10.1/24
B ens37192.168.10.2/24

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

主机IP
VM110.0.4.215/24
VM210.0.4.210/24
VM310.0.4.211/24
DHCP10.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
# 也需要安装openvswitch
rpm -iv openvswitch-2.5.3-1.x86_64.rpm

还需准备cirros镜像
创建虚拟交换机和域名空间
systemctl start openvswitch
ovs-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 rif0
ip netns exec r0 ip addr list
在域名空间启用dnsmadq
ip netns exec r0 dnsmasq -F 10.0.4.200,10.0.4.220,86400 -i rif0
ip netns exec r0 ss -tnlp # 查看是否监听在端口
在主机上添加虚拟机启动脚本

vim /etc/if-up

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

vim /etc/if-down

#!/bin/bash
# 
bridge=br-in
if [ -n "$1" ];then
    ip link $1 down
    sleep 1
    ovs-vsctl del-prot $bridge $1
    [ $? -eq 0 ] && exit 0 ||exit 1
else 
    echo "Error:no port specified"
    exit 2
fi
运行主机
# 运行虚拟机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
# 也需要安装openvswitch
rpm -iv openvswitch-2.5.3-1.x86_64.rpm

systemctl start openvswitch
ovs-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 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
18: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 64
18: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–网络环境实践(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值