Linux科技

网络虚拟化技术二

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

假如再使用一个物理节点,在其上面启动虚拟机实例,不同物理服务器上的不同虚拟机通信
精彩内容--看"网络虚拟机技术三" 不同物理节点上虚拟机通信

上一篇下一篇

猜你喜欢

热点阅读