在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐。面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络。因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令。不仅能加快网络的部署时间,更使网络拓扑结构的改变更加灵活。使构建大规模的网络拓扑成为可能。

一、问题:

 

在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐。面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络。因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令。不仅能加快网络的部署时间,更使网络拓扑结构的改变更加灵活。使构建大规模的网络拓扑成为可能。

 

二、相关组件与工具:

 

LXC:用于承载虚拟网络节点,在LXC中安装OVS,Quagga等工具,使容器成为虚拟网络组件。

OVS:交换机组件。ovs创建网桥,每一个网桥相当于一个交换机。

Quagga:路由器组件。

Brctl:网桥工具。连接不同的容器。

 

三、拓扑示例:

 

 

 

 

 

四、常用指令:

 

lxc基本操作:

文档:https://linuxcontainers.org/

 

查看容器状态

lxc-ls -f

 

启动容器

lxc-start -n containerName

 

控制容器

lxc-console -n containerName

 

退出控制

ctrl-aq

 

停止容器运行

sudo lxc-stop -n containerName

 


删除容器


sudo lxc-destroy -n containerName

 

克隆容器

lxc-copy -n container -N clone_container

 

OVS基本操作:

文档:http://www.openvswitch.org/

 

查看网桥信息

ovs-vsctl show

 

创建一个网桥

ovs-vsctl add-br br0

 

添加/删除网桥上的端口

ovs-vsctl add-port br0 eth1

ovs-vsctl del-port br0 eth1

 

查看某网桥当前流表

ovs-ofctl dump-flows br0

 

Quagga基本操作:

文档:https://www.quagga.net/docs.html

 

Brctl基本操作:

 

添加网桥

brctl addbr br1

 

删除网桥

brctl delbr br1

 

查询网桥信息

brctl show

brctl show br1

 

启动网桥

ifconfig br1 up

 

 

 

 

五、部署流程

 

创建相应的容器模板:example_host,example_switcher,example_router

 

p { margin-bottom: 0.25cm; line-height: 115% }

1.编写XML配置文件

下面给出例子

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<topo>
    <container type = "router">
        <name>Router1</name>
        <id>1</id>
        <protocol>rip</protocol>

        <port>
            <id>1</id>
            <ip>10.0.1.254</ip>
            <netmask>255.255.255.0</netmask>
            <link>
                <type>switch</type>
                <id>1:3</id>
            </link>
        </port>

        <port>
            <id>2</id>
            <ip>10.0.0.1</ip>
            <netmask>255.255.255.0</netmask>
            <link>
                <type>router</type>
                <id>2:3</id>
            </link>
        </port>
    </container>

    <container type = "router">
        <name>Router2</name>
        <id>2</id>
        <protocol>rip</protocol>

        <port>
            <id>1</id>
            <ip>10.0.2.254</ip>
            <netmask>255.255.255.0</netmask>
            <link>
                <type>switch</type>
                <id>2:3</id>
            </link>
        </port>

        <port>
            <id>2</id>
            <ip>10.0.4.254</ip>
            <netmask>255.255.255.0</netmask>
            <link>
                <type>host</type>
                <id>5:1</id>
            </link>
        </port>

        <port>
            <id>3</id>
            <ip>10.0.0.2</ip>
            <netmask>255.255.255.0</netmask>
            <link>
                <type>router</type>
                <id>1:2</id>
            </link>
        </port>
    </container>

    <container type="switch">
        <name>Switch1</name>
        <id>1</id>

        <bridge>
            <name>br1</name>
            <id>1</id>

            <port>
                <id>1</id>
                <link>
                    <type>host</type>
                    <id>1:1</id>
                </link>
            </port>

            <port>
                <id>2</id>
                <link>
                    <type>host</type>
                    <id>2:1</id>
                </link>
            </port>

            <port>
                <id>3</id>
                <link>
                    <type>router</type>
                    <id>1:1</id>
                </link>
            </port>
        </bridge>
    </container>


    <container type="switch">
        <name>Switch2</name>
        <id>2</id>

        <bridge>
            <name>br1</name>
            <id>1</id>

            <port>
                <id>1</id>
                <link>
                    <type>host</type>
                    <id>3:1</id>
                </link>
            </port>

            <port>
                <id>2</id>
                <link>
                    <type>host</type>
                    <id>4:1</id>
                </link>
            </port>

            <port>
                <id>3</id>
                <link>
                    <type>router</type>
                    <id>2:1</id>
                </link>
            </port>
        </bridge>

    </container>

    <container type="host">
        <name>Host1</name>
        <id>1</id>
        <port>
            <id>1</id>
            <ip>10.0.1.1</ip>
            <netmask>255.255.255.0</netmask>
            <gateway>10.0.1.254</gateway>
            <link>
                <type>switch</type>
                <id>1:1</id>
            </link>
        </port>
    </container>

    <container type="host">
        <name>Host2</name>
        <id>2</id>
        <port>
            <id>1</id>
            <ip>10.0.1.2</ip>
            <netmask>255.255.255.0</netmask>
            <gateway>10.0.1.254</gateway>
            <link>
                <type>switch</type>
                <id>1:2</id>
            </link>
        </port>
    </container>

    <container type="host">
        <name>Host3</name>
        <id>3</id>
        <port>
            <id>1</id>
            <ip>10.0.2.1</ip>
            <netmask>255.255.255.0</netmask>
            <gateway>10.0.2.254</gateway>
            <link>
                <type>switch</type>
                <id>2:1</id>
            </link>
        </port>
    </container>

    <container type="host">
        <name>Host4</name>
        <id>4</id>
        <port>
            <id>1</id>
            <ip>10.0.2.2</ip>
            <netmask>255.255.255.0</netmask>
            <gateway>10.0.2.254</gateway>
            <link>
                <type>switch</type>
                <id>2:2</id>
            </link>
        </port>
    </container>

    <container type="host">
        <name>Host5</name>
        <id>5</id>
        <port>
            <id>1</id>
            <ip>10.0.4.1</ip>
            <netmask>255.255.255.0</netmask>
            <gateway>10.0.4.254</gateway>
            <link>
                <type>router</type>
                <id>2:2</id>
            </link>
        </port>
    </container>
</topo>

配置文档

 

 

2.解析XML配置文件

dom4j解析XML生成相应对象

 

3.修改相应配置LXC相应配置文件,生成命令脚本

容器目录:/var/lib/lxc/s1/rootfs


host节点


修改网络配置


配置文件位置:/var/lib/lxc/hostname/config


追加内容:

lxc.net.1.type
= veth

lxc.net.1.link
= br-s1-h1

lxc.net.1.flags
= up

lxc.net.1.hwaddr
= 00:16:3e:4b:08:19

lxc.net.1.ipv4.address
= 192.168.1.1/24


lxc.net.1.ipv4.gateway
= 192.168.1.254


switch节点


第一步:修改网络配置


配置文件位置:/var/lib/lxc/switchname/config


追加内容:

lxc.net.1.type
= veth

lxc.net.1.link
= br-s1-h1

lxc.net.1.flags
= up

lxc.net.1.hwaddr
= 00:16:3e:47:65:38

lxc.net.2.type
= veth

lxc.net.2.link
= br-s1-h2

lxc.net.2.flags
= up

lxc.net.2.hwaddr
= 00:16:3e:47:65:39

lxc.net.3.type
= veth

lxc.net.3.link
= br-r1-s1

lxc.net.3.flags
= up


lxc.net.3.hwaddr
= 00:16:3e:47:65:40


第二步:设置启动脚本


ovs_exampleswitch模板)中设置启动脚本:

/etc/rc.local


/etc/init.d/switch.sh


启动时调用switch.sh脚本


启动脚本范例:

vim
/etc/init.d/switch.sh

#!/bin/bash

sudo
ovs-vsctl add-br br1

sudo
ovs-vsctl add-port br1 eth1


sudo
ovs-vsctl add-port br1 eth2


sudo
ovs-vsctl add-port br1 eth3


添加switch.sh执行权


sudo
chmod +x /var/lib/lxc/Switch2/rootfs/etc/init.d/switch.sh


router节点


第一步:修改网络配置


配置文件位置:/var/lib/lxc/routername/config


追加内容:

lxc.net.1.type
= veth

lxc.net.1.link
= br-r1-s1

lxc.net.1.flags
= up

lxc.net.1.ipv4.address
= 10.0.1.254/24

lxc.net.1.hwaddr
= 00:16:3e:c1:1b:fb


lxc.net.2.type
= veth


lxc.net.2.link
= br-r1-r2


lxc.net.2.flags
= up


lxc.net.2.ipv4.address
= 10.0.0.1/24


lxc.net.2.hwaddr
= 00:16:3e:c1:1b:fc


第二步:设置启动脚本


/etc/rc.local


exit
0
之上添加命令
sudo
/etc/init.d/quagga restart


第三步:修改路由器配置文件(rip为例

配置文件位置:/etc/quagga/ripd.conf


源文件:


!
-*- rip -*-


!


!
RIPd sample configuration file


!


!
$Id: ripd.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $


!


hostname
ripd


password
zebra


!


!
debug rip events


!
debug rip packet


!


router
rip


!
network 11.0.0.0/8


!
network eth0


!
route 10.0.0.0/8


!
distribute-list private-only in eth0


!


!access-list
private-only permit 10.0.0.0/8


!access-list
private-only deny any


!


!log
file /var/log/quagga/ripd.log


!


log
stdout


修改范例(指定直连网络):

!


hostname
ripd


password
zebra


log
stdout


!


router
rip

network
10.0.0.0/24


network
10.0.2.0/24


network
10.0.4.0/24


!


line
vty


!

p { margin-bottom: 0.25cm; line-height: 115% }

 

 

控制运行脚本

 

create.sh

 1 #!/bin/bash
 2 sudo lxc-copy -n host_example -N h1
 3 sudo lxc-copy -n host_example -N h2
 4 sudo lxc-copy -n host_example -N h3
 5 sudo lxc-copy -n host_example -N h4
 6 sudo lxc-copy -n host_example -N h5
 7 sudo lxc-copy -n ovs_example -N s1
 8 sudo lxc-copy -n ovs_example -N s2
 9 sudo lxc-copy -n router_example -N r1
10 sudo lxc-copy -n router_example -N r2

createsh

start.sh

#!/bin/bash

sudo brctl addbr br-s1-h1
sudo brctl addbr br-s1-h2
sudo brctl addbr br-s2-h3
sudo brctl addbr br-s2-h4
sudo brctl addbr br-r1-s1
sudo brctl addbr br-r2-s2
sudo brctl addbr br-r2-h5
sudo brctl addbr br-r1-r2

sudo ifconfig br-s1-h1 up
sudo ifconfig br-s1-h2 up
sudo ifconfig br-s2-h3 up
sudo ifconfig br-s2-h4 up
sudo ifconfig br-r1-s1 up
sudo ifconfig br-r2-s2 up
sudo ifconfig br-r2-h5 up
sudo ifconfig br-r1-r2 up

sudo lxc-start -n h1
sudo lxc-start -n h2
sudo lxc-start -n h3
sudo lxc-start -n h4
sudo lxc-start -n h5
sudo lxc-start -n s1
sudo lxc-start -n s2
sudo lxc-start -n r1
sudo lxc-start -n r2

start.sh

stop.sh

 1 #!/bin/bash
 2 
 3 sudo lxc-stop -n h1
 4 sudo lxc-stop -n h2
 5 sudo lxc-stop -n h3
 6 sudo lxc-stop -n h4
 7 sudo lxc-stop -n h5
 8 sudo lxc-stop -n s1
 9 sudo lxc-stop -n s2
10 sudo lxc-stop -n r1
11 sudo lxc-stop -n r2
12 
13 sudo ifconfig br-s1-h1 down
14 sudo ifconfig br-s1-h2 down
15 sudo ifconfig br-s2-h3 down
16 sudo ifconfig br-s2-h4 down
17 sudo ifconfig br-r1-s1 down
18 sudo ifconfig br-r2-s2 down
19 sudo ifconfig br-r2-h5 down
20 sudo ifconfig br-r1-r2 down
21 
22 sudo brctl delbr br-s1-h1
23 sudo brctl delbr br-s1-h2
24 sudo brctl delbr br-s2-h3
25 sudo brctl delbr br-s2-h4
26 sudo brctl delbr br-r1-s1
27 sudo brctl delbr br-r2-s2
28 sudo brctl delbr br-r2-h5
29 sudo brctl delbr br-r1-r2

stop.sh

destroy.sh

 1 #!/bin/bash
 2 
 3 sudo lxc-destroy -n h1
 4 sudo lxc-destroy -n h2
 5 sudo lxc-destroy -n h3
 6 sudo lxc-destroy -n h4
 7 sudo lxc-destroy -n h5
 8 sudo lxc-destroy -n s1
 9 sudo lxc-destroy -n s2
10 sudo lxc-destroy -n r1
11 sudo lxc-destroy -n r2

destroy.sh

 

p { margin-bottom: 0.25cm; direction: ltr; line-height: 115%; text-align: justify }
a:link { color: rgba(5, 99, 193, 1) }

 

 

六、客户端控制

 

设置5种控制方法:

  1. create:解析xml,生成控制脚本,生成容器、网桥等组件。
  2. start:启动网桥,启动容器。
  3. stop:停止容器,关闭网桥。
  4. destroy:删除网桥与容器。
  5. show:显示网络配置信息。

 

版权声明:本文为zzyjwd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zzyjwd/p/Automatic_deployment_of_NFV.html