网络虚拟化技术二
2019-03-28 本文已影响0人
Miracle001
1
2
管理网络
外部网络
各虚拟机实例之间,虚拟机实例与外部网络之间通信
各物理服务器的虚拟机实例之间,虚拟机实例与外部网络之间通信
如下图
3
网络虚拟化
复杂的虚拟化网络:
netns
OpenVSwitch 虚拟交换机软件
OVS: 基于c语言研发 特性:
802.1q,trunk,access
NIC bonding 多个网卡绑定而成
NetFlow,sFlow
QoS配置及策略
GRE, VxLAN
OpenFlow及其扩展
基于Linux内核完成高性能转发
2个计算节点--用来跑虚拟机实例的节点--实现2个节点间上的实例跨网络通信
compute1/2 c1/c2 运行虚拟机实例vm1/2/3/4 如何通信
之前是用Linux内核里面的brctl连接通信
接下来使用ovs来使用所谓的桥
直接把桥变成物理桥,通过桥接方式连接即可
实现openvswitch中vlan的实现
vm1 vm2即便在同一个交换机、同一个网段也不能通信
通过修改vlan的id: vm1 vm2 放在同一个vlan中就可以通信,放在不同的vlan中就不能通信
要让内部的虚拟交换机vs1 vs2 支持vlan,那么物理交换机rs(eth1)需要支持打标签的vlan技术--tag-vlan--跨物理节点
此处使用 vlan chunk 将报文通过虚拟交换机之间交换
4
5
虚拟复杂网络1(同一个物理节点上)
架构架构图--如上图架构
centos 7.5 1804
epel源
2g4核
允许虚拟化Intel VT-x/EPT
此处网络设置:
先nat+仅主机,为了安装需要的程序包 如下图6
nat--192.168.25.11
仅主机--192.168.50.11
再vmnet2+仅主机,为了测试虚拟网络 如下图7
vmnet2--eth0--设置为dhcp获取的地址
仅主机--eth1--设置为dhcp获取的地址,如下图10
6
7
8
9
10
网络: nat+仅主机
[root@node1 ~]# yum clean all
[root@node1 ~]# yum repolist
[root@node1 ~]# yum info bridge-utils qemu-kvm tcpdump dnsmasq tigervnc
用到的只有qemu-kvm
[root@node1 ~]# yum info openvswitch*
显示有3个包: openvswitch,openvswitch-controller,openvswitch-test
用到的只有openvswitch
[root@node1 ~]# yum -y install bridge-utils qemu-kvm tcpdump dnsmasq tigervnc
[root@node1 ~]# yum -y install openvswitch
[root@node1 ~]# rpm -ql openvswitch
OVS的组成部分:
ovs-vswitchd: OVS daemon,实现数据报文交换功能,和Linux内核兼容模块一同实现了基于流的交换技术;
ovsdb-server: 轻量级的数据库服务,主要保存了整个OVS的配置信息,例如接口、交换和VLAN等等;ovs-vswitchd的交换功能基于此库实现;
ovs-dpctl
ovs-vsctl: 用于获取或更改ovs-vswitchd的配置信息,其修改操作会保存至ovsdb-server中;
ovs-appctl
ovsdbmonitor
ovs-controller
ovs-ofctl
ovs-pki
关机,换网络
网络: vmnet2+仅主机
vmnet2--把ip设置为dhcp获得
仅主机--需要把ip设置为dhcp获得,如上图10--可以xshell连接
vmnet2--eth0--设置为dhcp获取的地址
仅主机--eth1--设置为dhcp获取的地址,如上图10
注意: 此处是缺少物理服务器,如果是物理服务器,直接把这个网卡(vmnet2)连接到所需的交换机上即可
xshell上面连接服务器
[c:\~]$ ssh root@192.168.50.133
[root@node1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.75.130 netmask 255.255.255.0 broadcast 192.168.75.255
... ...
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.50.133 netmask 255.255.255.0 broadcast 192.168.50.255
... ...
[root@node1 ~]# systemctl start openvswitch
[root@node1 ~]# systemctl status openvswitch
[root@node1 ~]# ovs-vsctl --help
ovs-vsctl命令使用
show: ovsdb配置内容查看
add-br NAME: 添加桥设备;该桥支持vlan,vxlan,GRE等各种高级功能的
list-br: 显示所有已定义BRIDGE
del-br BRIDGE: 删除桥
add-port BRIDGE PORT: 将PORT添加至指定的BRIDGE
list-ports BRIDGE: 显示指定 BRIDGE 上已经添加的所有 PORT
del-port [BRIDGE] PORT: 从指定 BRIDGE 移除指定的 PORT,BRIDGE可以省略
增加、删除、查看桥信息
[root@node1 ~]# ovs-vsctl show
3df7fc0c-9bdb-41ce-ad46-a669be228e7d
ovs_version: "2.0.0"
[root@node1 ~]# ovs-vsctl add-br br-in
[root@node1 ~]# ovs-vsctl show
3df7fc0c-9bdb-41ce-ad46-a669be228e7d
Bridge br-in
Port br-in
Interface br-in
type: internal
ovs_version: "2.0.0"
桥Bridge--port(slot物理设备)--interface--type
[root@node1 ~]# ovs-vsctl list-br
br-in
[root@node1 ~]# ovs-vsctl list-ports br-in 啥都没有
[root@node1 ~]# ovs-vsctl del-br br-in
[root@node1 ~]# ovs-vsctl list-br 显示没有br-in,表明删除成功
把eth0加入到桥br-in上
[root@node1 ~]# ovs-vsctl add-br br-in
[root@node1 ~]# ovs-vsctl list-br
br-in
此时的eth0/eth1都已经是激活状态,不用再次激活
[root@node1 ~]# ovs-vsctl add-port br-in eth0 将eth0添加到br-in桥上
[root@node1 ~]# ovs-vsctl list-ports br-in 显示br-in上已经添加的PORT
eth0
[root@node1 ~]# brctl show 啥都没有,注意二者不兼容
bridge name bridge id STP enabled interfaces
[root@node1 ~]# ovs-vsctl show
3df7fc0c-9bdb-41ce-ad46-a669be228e7d
Bridge br-in
Port "eth0"
Interface "eth0"
Port br-in
Interface br-in
type: internal
ovs_version: "2.0.0"
显示port: br-in/eth0 显示的是ovsdb数据库中的信息
一个port只能指明属于一个bridge,所以del-port 时,可以省略 BRIDGE
一个port可以有多个 interface
添加port时,自动会添加interface
[root@node1 ~]# ovs-vsctl list-ifaces br-in 显示已经添加的接口
eth0
ovs-vsctl show 显示的是ovsdb数据库中的信息
数据库: 表--行和列组成,TBL
[root@node1 ~]# ovs-vsctl list interface 列出TBL中的记录(行)
_uuid : 398cb414-0194-45fc-aadf-8c480ffd355e
admin_state : up
bfd : {}
bfd_status : {}
cfm_fault : []
cfm_fault_status : []
cfm_health : []
cfm_mpid : []
cfm_remote_mpids : []
cfm_remote_opstate : []
duplex : []
external_ids : {}
ifindex : 6
ingress_policing_burst: 0
ingress_policing_rate: 0
lacp_current : []
link_resets : 2
link_speed : []
link_state : up
mac : []
mac_in_use : "00:0c:29:42:8d:16"
mtu : 1500
name : br-in
ofport : 65534
ofport_request : []
options : {}
other_config : {}
statistics : {collisions=0, rx_bytes=5566, rx_crc_err=0, rx_dropped=0, rx_errors=0, rx_frame_err=0, rx_over_err=0, rx_packets=121, tx_bytes=648, tx_dropped=0, tx_errors=0, tx_packets=8}
status : {driver_name=openvswitch}
type : internal
... ...
[root@node1 ~]# ovs-vsctl list port 注意: name tag trunks vlan_mode
_uuid : 9ef9ac34-6a54-4f61-8fbe-d490eb273ee5
bond_downdelay : 0
bond_fake_iface : false
bond_mode : []
bond_updelay : 0
external_ids : {}
fake_bridge : false
interfaces : [2393bfe3-9a67-4913-af9c-d67072839b54]
lacp : []
mac : []
name : "eth0"
other_config : {}
qos : []
statistics : {}
status : {}
tag : []
trunks : []
vlan_mode : []
... ...
[root@node1 ~]# ovs-vsctl list port br-in 只显示指定的PORT
_uuid : f331755f-f362-4b63-8efb-55163b085354
bond_downdelay : 0
bond_fake_iface : false
bond_mode : []
bond_updelay : 0
external_ids : {}
fake_bridge : false
interfaces : [398cb414-0194-45fc-aadf-8c480ffd355e]
lacp : []
mac : []
name : br-in
other_config : {}
qos : []
statistics : {}
status : {}
tag : []
trunks : []
vlan_mode : []
[root@node1 ~]# ovs-vsctl find port name='br-in' name换成uuid也行,注意是 find,不是list
[root@node1 ~]# ovs-vsctl --help
Database commands:
list TBL [REC] list RECord (or all records) in TBL
find TBL CONDITION... list records satisfying CONDITION in TBL
get TBL REC COL[:KEY] print values of COLumns in RECord in TBL
set TBL REC COL[:KEY]=VALUE set COLumn values in RECord in TBL
add TBL REC COL [KEY=]VALUE add (KEY=)VALUE to COLumn in RECord in TBL
remove TBL REC COL [KEY=]VALUE remove (KEY=)VALUE from COLumn
clear TBL REC COL clear values from COLumn in RECord in TBL
create TBL COL[:KEY]=VALUE create and initialize new record
destroy TBL REC delete RECord from TBL
wait-until TBL REC [COL[:KEY]=VALUE] wait until condition is true
Potentially unsafe database commands require --force option.
把eth0接口从此桥上移除,现在还不需要作为物理桥使用
[root@node1 ~]# ovs-vsctl list-ports br-in
eth0
[root@node1 ~]# ovs-vsctl del-port br-in eth0
[root@node1 ~]# ovs-vsctl show
3df7fc0c-9bdb-41ce-ad46-a669be228e7d
Bridge br-in
Port br-in
Interface br-in
type: internal
ovs_version: "2.0.0"
[root@node1 ~]# ovs-vsctl list-ports br-in 没有了
[root@node1 ~]# yum info qemu-kvm 显示已经安装
[root@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/ 命令加入到PATH路径里面
[root@node1 ~]# mkdir -pv /vm/images
[root@node1 ~]# cd /vm/images
[root@node1 images]# rz 上传镜像cirros-0.3.6-i386-disk.img
[root@node1 images]# cp cirros-0.3.6-i386-disk.img vm1.img
[root@node1 images]# cp cirros-0.3.6-i386-disk.img vm2.img
[root@node1 images]# cp cirros-0.3.6-i386-disk.img vm3.img
编辑kvm虚拟机启动脚本
[root@node1 images]# vim /etc/if-up
#!/bin/bash
#
bridge='br-in'
if [ -n "$1" ];then
ip link set $1 up
sleep 1
# brctl addif $bridge $1
ovs-vsctl add-port $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
# echo "Error: no interface specified."
echo "Error: no port specified."
exit 2
fi
[root@node1 images]# chmod +x /etc/if-up
[root@node1 images]# bash -n /etc/if-up
编辑kvm虚拟机down脚本
[root@node1 images]# vim /etc/if-down
#!/bin/bash
#
bridge='br-in'
if [ -n "$1" ];then
ip link set $1 down
sleep 1
# brctl addif $bridge $1
ovs-vsctl del-port $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
# echo "Error: no interface specified."
echo "Error: no port specified."
exit 2
fi
[root@node1 images]# chmod +x /etc/if-down
[root@node1 images]# bash -n /etc/if-down
开启转发功能
[root@node1 images]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 images]# sysctl -p
net.ipv4.ip_forward = 1
加载kvm模块
[root@node1 images]# modprobe kvm
[root@node1 images]# lsmod |grep kvm
kvm_intel 174841 0
kvm 578518 1 kvm_intel
irqbypass 13503 1 kvm
启动kvm虚拟机vm1
[root@node1 images]# qemu-kvm -name "vm1" -m 128 -smp 2 -drive file=/vm/images/vm1.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,ifname=fgq1,script=/etc/if-up,downscript=/etc/if-down --nographic
VNC server running on `::1:5900`
注意:
-nographic 或者 --nographic 均可以
ifname=name 自定义名字,默认值为tap0/1/2/...
model=virtio 半虚拟化
杀掉进程: ps aux|grep qemu-kvm;kill PID
此处的vnc不能连接,所以不用后台启动
再开启一个窗口启动kvm虚拟机vm2
[root@node1 ~]# qemu-kvm -name "vm2" -m 128 -smp 2 -drive file=/vm/images/vm2.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,ifname=fgq2,script=/etc/if-up,downscript=/etc/if-down --nographic
再开启一个窗口:
[root@node1 ~]# ifconfig 显示有fgq1和fgq2
... ...
fgq1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::70d1:7aff:feb0:ed03 prefixlen 64 scopeid 0x20<link>
ether 72:d1:7a:b0:ed:03 txqueuelen 1000 (Ethernet)
... ...
fgq2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc8a:98ff:fe9b:7ac3 prefixlen 64 scopeid 0x20<link>
ether fe:8a:98:9b:7a:c3 txqueuelen 1000 (Ethernet)
... ...
[root@node1 ~]# ovs-vsctl show fgq1/2通过启动脚本被添加到br-in上
0ec80696-dce2-4dde-a54b-ed4a76a353b4
Bridge br-in
Port br-in
Interface br-in
type: internal
Port "fgq1"
Interface "fgq1"
Port "fgq2"
Interface "fgq2"
ovs_version: "2.0.0"
vm1启动后没有关闭窗口
$ ifconfig 没有地址
$ sudo su -
# ifconfig eth0 10.0.3.1/24 up
# ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:00:00:01
inet addr:10.0.3.1 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::5054:ff:fe00:1/64 Scope:Link
... ...
vm2启动后没有关闭窗口
$ ifconfig 没有地址
$ sudo su -
# ifconfig eth0 10.0.3.2/24 up
# ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:00:00:02
inet addr:10.0.3.2 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::5054:ff:fe00:2/64 Scope:Link
... ...
# ping 10.0.3.1 可以ping通vm1
PING 10.0.3.1 (10.0.3.1): 56 data bytes
64 bytes from 10.0.3.1: seq=0 ttl=64 time=3.019 ms
64 bytes from 10.0.3.1: seq=1 ttl=64 time=2.023 ms
---------------------------------------------------------------------------
---------------------------------------------------------------------------
设置处于不同的vlan中
设置接口的vlan机制,通过ovs指明端口处于哪个vlan上,set 指定表中的port的 tag 和 vlan_mode
tag可取的ID号: 0-4094
[root@node1 ~]# man ovs-vsctl
[root@node1 ~]# ovs-vsctl list port tag都没有ID号,即默认为0
[root@node1 ~]# ovs-vsctl set port fgq1 tag=10
[root@node1 ~]# ovs-vsctl list port 显示fgq1的vlan-tag为10,fgq2没有-即默认为0
此时,虚拟机2再去ping 虚拟机1是ping不通的
vm2启动后没有关闭窗口
# ping 10.0.3.1 ping不通的
PING 10.0.3.1 (10.0.3.1): 56 data bytes
设置fgq2的tag为10,就会ping通了
[root@node1 ~]# ovs-vsctl set port fgq2 tag=10
[root@node1 ~]# ovs-vsctl list port 显示fgq1和fgq2的vlan-tag为10
vm2启动后没有关闭窗口
# ping 10.0.3.1 ping通
PING 10.0.3.1 (10.0.3.1): 56 data bytes
64 bytes from 10.0.3.1: seq=69 ttl=64 time=1007.104 ms
64 bytes from 10.0.3.1: seq=70 ttl=64 time=13.711 ms
64 bytes from 10.0.3.1: seq=71 ttl=64 time=1.801 ms
... ...
---------------------------------------------------------------------------
---------------------------------------------------------------------------
连接不同的交换机的接口,连接不同的tunk接口,跨交换机vlan支持
[root@node1 ~]# cp /etc/if-up /etc/if-up2
[root@node1 ~]# cp /etc/if-down /etc/if-down2
[root@node1 ~]# vim /etc/if-up2
bridge='br-test' 其他不改
[root@node1 ~]# vim /etc/if-down2
bridge='br-test' 其他不改
[root@node1 ~]# ovs-vsctl add-br br-test
[root@node1 ~]# ovs-vsctl list-br
br-in
br-test
再启动一个实例vm3,把该实例接口放到br-test上面去
[root@node1 ~]# qemu-kvm -name "vm3" -m 128 -smp 2 -drive file=/vm/images/vm3.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:03 -net tap,ifname=fgq3,script=/etc/if-up2,downscript=/etc/if-down2 --nographic
打开一个窗口
[root@node1 ~]# ifconfig 有fgq3网卡
... ...
fgq3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::8c02:7cff:fe2e:fd53 prefixlen 64 scopeid 0x20<link>
ether 8e:02:7c:2e:fd:53 txqueuelen 1000 (Ethernet)
... ...
[root@node1 ~]# ovs-vsctl show fgq3被添加到br-test上
0ec80696-dce2-4dde-a54b-ed4a76a353b4
Bridge br-test
Port "fgq3"
Interface "fgq3"
Port br-test
Interface br-test
type: internal
Bridge br-in
Port br-in
Interface br-in
type: internal
Port "fgq1"
tag: 10
Interface "fgq1"
Port "fgq2"
tag: 10
Interface "fgq2"
ovs_version: "2.0.0"
期望vm3虚拟机可以与刚才的两个虚拟机通信,可以把其设置为同一个网段中
vm3虚拟机
$ ifconfig 无地址
$ sudo su -
# ifconfig eth0 10.0.3.3/24 up
# ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:00:00:03
inet addr:10.0.3.3 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::5054:ff:fe00:3/64 Scope:Link
... ...
# ping 10.0.3.1
PING 10.0.3.1 (10.0.3.1): 56 data bytes
不能ping通,因为不在同一个vlan上,甚至不在同一个交换机上
想让其ping通,直接设置br-test(fgq3)的vlan的id号与vm1、vm2的相同即可
或者让两个交换机连接起来即可--即让虚拟网卡一半在br-in上,另一半在br-test上
[root@node1 ~]# ip link add s0 type veth peer name s1
[root@node1 ~]# ip link show 有s0/s1
[root@node1 ~]# ip link set s0 up 激活
[root@node1 ~]# ip link set s1 up
[root@node1 ~]# ifconfig 可以看到s0/s1
把s0添加到br-in上 ,s1添加到 br-test上
[root@node1 ~]# ovs-vsctl add-port br-in s0
[root@node1 ~]# ovs-vsctl add-port br-test s1
[root@node1 ~]# ovs-vsctl show
0ec80696-dce2-4dde-a54b-ed4a76a353b4
Bridge br-test
Port "fgq3"
Interface "fgq3"
Port "s1"
Interface "s1"
Port br-test
Interface br-test
type: internal
Bridge br-in
Port br-in
Interface br-in
type: internal
Port "s0"
Interface "s0"
Port "fgq1"
tag: 10
Interface "fgq1"
Port "fgq2"
tag: 10
Interface "fgq2"
ovs_version: "2.0.0"
此时vm3还是ping不通vm1,把fgq3的vlan-tag设置为10
[root@node1 ~]# ovs-vsctl list port br-test fgq3
br-test/fgq3的tag此时没有--默认为0
[root@node1 ~]# ovs-vsctl set port fgq3 tag=10
[root@node1 ~]# ovs-vsctl list port br-test fgq3
br-test的tag此时默认为0
fgq3的tag此时为10
此时vm3可以ping通vm1
vm3虚拟机
# ping 10.0.3.1
PING 10.0.3.1 (10.0.3.1): 56 data bytes
64 bytes from 10.0.3.1: seq=747 ttl=64 time=10.317 ms
64 bytes from 10.0.3.1: seq=748 ttl=64 time=1.773 ms
vm2虚拟机
# ping 10.0.3.1 可以ping通
PING 10.0.3.1 (10.0.3.1): 56 data bytes
64 bytes from 10.0.3.1: seq=0 ttl=64 time=1.837 ms
... ...
# ping 10.0.3.3 可以ping通
PING 10.0.3.3 (10.0.3.3): 56 data bytes
64 bytes from 10.0.3.3: seq=0 ttl=64 time=3.615 ms
... ...
移除fgq3的vlan-tag的ID号后,vm2是ping不通vm3
[root@node1 ~]# ovs-vsctl remove port fgq3 tag 10
vm2虚拟机
# ping 10.0.3.3 ping不通vm3
PING 10.0.3.3 (10.0.3.3): 56 data bytes
事实上少一个配置过程
s0 s1 默认承载模式 这两个接口既能发vlan为fgq2的报文,也能发vlan为fgq3的报文
默认为trunk模式 如果不是,需要改为其vlan模式为trunk模式(vlan_mode 为trunk),tag为10
trunks里面有tag为10的vlan的id号 [10,20,...]
trunks : []
同一个物理服务器的两个交换机的vlan
假如再使用一个物理节点,在其上面启动虚拟机实例,不同物理服务器上的不同虚拟机通信
精彩内容--看"网络虚拟机技术三" 不同物理节点上虚拟机通信