15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 深入理解SDN之一-虚拟机互连

深入理解SDN之一-虚拟机互连

时间:2023-06-28 20:18:01 | 来源:网站运营

时间:2023-06-28 20:18:01 来源:网站运营

深入理解SDN之一-虚拟机互连:

深入理解SDN之一-虚拟机互连

在《深入理解k8s网络原理》中我们已经把容器网络的各个细节都介绍过了,大多数情况下,容器平台都是基于云平台的基础上搭建的,这就意味着在容器平台的网络和物理网络之间还有一层SDN的存在,接下来我们继续探究SDN的相关原理,还是老套路,百闻不如一练,定个小目标,全程用linux命令把一个SDN搭出来。

在接下来的内容,会涉及到云计算技术中的虚拟化软件定义网络,所以感觉标题更应该叫云计算入门,但我觉得不用纠结标题叫什么,领会精神就是了。

下面介绍一下我们的小目标:

目标

我们的目标是在两台裸金属服务上,使用QEMU、linux虚拟网络设备bridge、veth、tap及network namespace等技术,创建一个虚拟网络(类似VPC),里面包含两个子网,子网1的网段为172.25.1.0/24,有两台VM,分别为VM1和VM2,子网2的网段为172.25.2.0/24,有VM3和VM4,相同子网的VM使用虚拟交换机连接,两个子网用虚拟路由器连接,同时演示SDN中的ACL,安全组,浮动IP,NAT等功能

鉴于我们在之前的内容中已经介绍过容器网络的原理了,即将要介绍的SDN与容器网络有哪些区别呢?

下面出现的主机指的是裸金属服务器

容器网络与SDN的区别

所以,SDN其实比容器网络要复杂很多,但实现的套路还是那几样,linux bridge/linux network namespace/veth/tap/iptables等,有些我们前面的内容也简单介绍过;

另外,一台虚拟机本质上就是一个qemu进程,虚拟机的配置,硬盘,外设都可以用qemu的启动参数来配置,qemu的详细参数有很多,感兴趣可以自行google,这里只介绍用到的。下面正式开搞!

环境介绍

实验环境物理拓扑

安装QEMU

yum install -y qemu-kvm qemu

制作操作系统镜像(如果有制作好的虚拟机硬盘文件请略过此步骤)

在server1上进行操作

qemu-img create -f raw /home/vm/centos.raw 10Gwget https://mirrors.163.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso -O /home/os/centos.isoqemu-kvm -enable-kvm -smp 2,cores=2 -m 2048 -hda /home/os/centos.iso -hdb /home/vm/centos.raw /-vnc 0.0.0.0:0
用rdc连接vm
注意上面的-vnc参数,0.0.0.0:0时,用rdc连的时候用端口5900连接,0.0.0.0:1时,用5901连接,依次类推……
安装完后,配置一下,把文件/etc/sysconfig/network-scripts/ifcfg-eth0ONBOOT改为yes,这样vm启动后就会通过dhcp去获取IP地址了,这个配置主要为后面使用dhcp服务作准备;

cat /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE="eth0"BOOTPROTO="dhcp"ONBOOT="yes"TYPE="Ethernet"PERSISTENT_DHCLIENT="yes"
ifcfg-eth0文件与网卡名有关,如果你的镜像的默认网卡名为eno1,则文件名为ifcfg-eno1
上面的操作完成后/home/vm/centos.raw就是我们制作好的操作系统模版了,把该文件复制到server2的相同目录下

启动虚拟机

在server1操作:

cp /home/vm/centos.raw /home/vm/vm1.rawip tuntap add tap1 mode tapip link set tap1 upqemu-kvm -enable-kvm -name vm1 -smp 1,cores=1 -m 2048 -hda /home/vm/vm1.raw /-netdev tap,id=hostnet0,vhost=on,vhostfd=4,ifname=tap1,script=no 4<>/dev/vhost-net /-device virtio-net-pci,netdev=hostnet0,id=net0 /-vnc 0.0.0.0:1这样就创建了一台1核2G的虚拟机,cores是CPU核数,-m是内存,-hda是硬盘文件,-netdev是网卡配置,注意里面的ifname=tap1tap1是我们上一步创建的虚拟网卡设备,-vnc是通过vnc连接该vm的地址;

如果要给vm1再挂一个盘,只需要再创建一个硬盘文件:

qemu-img create -f raw /home/vm/vm1-ext-hda1.raw 10G然后启动:

qemu-kvm -enable-kvm -name vm1 -smp 1,cores=1 -m 2048 -hda /home/vm/vm1.raw -hdb /home/vm/vm1-ext-hda1.raw /-netdev tap,id=hostnet0,vhost=on,vhostfd=4,ifname=tap1,script=no 4<>/dev/vhost-net /-device virtio-net-pci,netdev=hostnet0,id=net0 /-vnc 0.0.0.0:1
所以其实虚拟机的一个盘对应的就是主机的一个文件,软件定义存储主要就是解决如何在所有物理节点都可以用/home/vm/vm1.raw访问到相同的文件,例如CEPH,不过这并不是本篇的重点
vm1

连接两台vm

其实连接同子网的多台vm非常简单,把多台vm的网卡插入到一个linux bridge设备,并设置vm在IP在相同的网段即可,不需要其它的配置,下面我们继续在server1主机上创建一台名为vm2的虚拟机,并与vm1实现互连,创建vm2的步骤与上述的vm1类似,不再一一解释了:

cp /home/vm/centos.raw /home/vm/vm2.rawip tuntap add tap2 mode tapip link set tap2 upqemu-kvm -enable-kvm -name vm2 -smp 1,cores=1 -m 2048 -hda /home/vm/vm2.raw /-netdev tap,id=hostnet0,vhost=on,vhostfd=4,ifname=tap2,script=no 4<>/dev/vhost-net /-device virtio-net-pci,netdev=hostnet0,id=net0 /-vnc 0.0.0.0:2
注意vnc的端口都要在vm1的基础上加1,否则会冲突
vm2
ip link add br0 type bridgeip link set br0 upip link set tap1 master br0ip link set tap2 master br0
vm1 ping vm2

VM通过路由器上外网

所谓的虚拟路由器,其实就是一个独立的linux network namespace

ip netns add routerip link add eth-sub1 type veth peer name router-br0ip link set eth-sub1 netns routerip netns exec router ip addr add 172.25.1.1/24 dev eth-sub1ip netns exec router ip link set eth-sub1 upip link set router-br0 master br0ip link set router-br0 upip link add eth-out type veth peer name router-vethip link set eth-out netns routerip netns exec router ip link set lo upip netns exec router ip addr add 169.254.10.10/32 dev eth-outip netns exec router ip link set eth-out upip netns exec router ip route add default via 169.254.10.253 dev eth-out onlinkip netns exec router iptables -A POSTROUTING -t nat -o eth-out -j MASQUERADE ip link set router-veth upecho 1 > /proc/sys/net/ipv4/conf/router-veth/proxy_arp此时整个拓扑如下:

物理机与vm拓扑
ip route add 169.254.10.10 dev router-vethiptables -A POSTROUTING -t nat -s 169.254.10.10 -j MASQUERADE
vm1 ping baidu

总结

我们使用qemu创建了两台VM,并且用linux bridge连接了两台vm,通过linux network namespace作为虚拟路由器为vm上外网提供了IP伪装;

其实从网络的角度来说,只是连接同节点的两台VM和连接外网,SDN的处理和CNI是有很多相似之处的,后面介绍子网、ACL、安全组时才慢慢体现出区别。

上面我们启动完VM后,总是需要使用remmina remote desktop client连接VM设置IP,有没有办法让VM启动后自动获取我们指定的IP呢?下一章我们来介绍给虚拟机设置固定IP。

关键词:虚拟,理解,深入

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭