zoukankan      html  css  js  c++  java
  • Neutron SDN 手动实现手册

    安装架构介绍

    本文旨在通过自己搭建类似neutron (openvswitch + gre) 实现SDN 的环境,学习了解其工作原理,模拟核心原理,比如:同一租户自定义网络 instance 互通,手动为instance 分配 floating ip 等相关内容。
    <ignore_js_op>

    虚拟网络

    需要新建3个虚拟网络Net0、Net1和Net2,其在virtual box 中对应配置如下。
    1. Net0:
    2.     Network name: VirtualBox  host-only Ethernet Adapter#2
    3.     Purpose: administrator / management network
    4.     IP block: 10.20.0.0/24
    5.     DHCP: disable
    6.     Linux device: eth0
    7. Net1:
    8.     Network name: VirtualBox  host-only Ethernet Adapter#3
    9.     Purpose: public network
    10.     DHCP: disable
    11.     IP block: 172.16.0.0/24
    12.     Linux device: eth1
    13. Net2:
    14.     Network name: VirtualBox  host-only Ethernet Adapter#4
    15.     Purpose: Storage/private network
    16.     DHCP: disable
    17.     IP block: 192.168.4.0/24
    18.     Linux device: eth2
    复制代码

    虚拟机

    需要新建2个虚拟机VM1和VM2,其对应配置如下。
    1. VM1:
    2.     Name : network1
    3.     vCPU:1
    4.     Memory :1G
    5.     Disk:30G
    6.     Network:net1,net2,net3
    7. VM2:
    8.     Name: compute1
    9.     vCPU:1
    10.     Memory :1G
    11.     Disk:30G
    12.     Networks:net1,net2,net3
    复制代码

    Linux interface设置

    1. network1
    2.      eth0:10.20.0.201   (management network)
    3.      eht1:172.16.0.201   (public/external network)
    4.      eht2:192.168.4.201  (private network,gre tunning)
    5. compute1
    6.      eth0:10.20.0.202   (management network)
    7.      eht1:(disabled)
    8.      eht2:192.168.4.202  (private network,gre tunning)
    复制代码

    模拟安装网络节点(Network1)

    模拟Network 节点相关实现,比如L3、dhcp-agent实现,为了模拟多节点网络情况,这里Network同时也模拟一个计算节点,模拟M2 openvswitch 实现,上面运行instance1。

    网络接口配置

    1. vi /etc/sysconfig/network-scripts/ifcfg-eth0
    2. DEVICE=eth0
    3. TYPE=Ethernet
    4. ONBOOT=yes
    5. NM_CONTROLLED=yes
    6. BOOTPROTO=static
    7. IPADDR=10.20.0.201
    8. NETMASK=255.255.255.0
    9. vi /etc/sysconfig/network-scripts/ifcfg-eth1
    10. DEVICE=eth1
    11. TYPE=Ethernet
    12. ONBOOT=yes
    13. NM_CONTROLLED=yes
    14. BOOTPROTO=static
    15. IPADDR=172.16.0.201
    16. NETMASK=255.255.255.0
    17. vi /etc/sysconfig/network-scripts/ifcfg-eth2
    18. DEVICE=eth2
    19. TYPE=Ethernet
    20. ONBOOT=yes
    21. NM_CONTROLLED=yes
    22. BOOTPROTO=static
    23. IPADDR=192.168.4.201
    24. NETMASK=255.255.255.0
    复制代码



    重启网络服务

    1. service network restart
    复制代码



    安装需要用到的包

    1. yum install libvirt openvswitch python-virtinst xauth tigervnc -y
    复制代码

    移除默认的libvirt 网络,方便清晰分析网络情况

    1. virsh net-destroy default
    2. virsh net-autostart --disable default
    3. virsh net-undefine default
    复制代码



    设置允许ipforwarding

    1. vi /etc/sysctl.conf 
    2. net.ipv4.ip_forward=1
    3. net.ipv4.conf.all.rp_filter=0
    4. net.ipv4.conf.default.rp_filter=0
    复制代码

    立即生效

    1. sysctl -p
    复制代码



    启动openvswitch

    1. service openvswitch start
    2. chkconfig openvswitch on
    复制代码



    创建一个linux bridge

    1. brctl addbr qbr01
    2. ip link set qbr01 up
    复制代码

    创建一个instance,并连接到qbr01 Bridge,网络接口部分配置如下

    1. <interface type='bridge'>
    2.       <source bridge='qbr01'/>
    3.       <target dev='tap01'/>
    4.       <model type='virtio'/>
    5.       <driver name='qemu'/>
    6.       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    7. </interface>
    复制代码



    可以参考附件./gre/instance1.xml创建

    1. cp ~/gre/ /var/tmp/
    2. cd /var/tmp/gre
    3. mv cirros-0.3.0-x86_64-disk.img instance1.img
    4. virsh define instance1.xml
    5. virsh start instance1
    6. virsh vncdisplay instance1
    7. vncviewer :0
    复制代码



    启动console 以后,登录添加ip 地址 192.168.1.11

    1. ip addr add 192.168.1.11/24 dev eth0
    2. route add default gw 192.168.1.1
    复制代码

    创建一个内部bridge br-int, 模拟 OpenStack integrated bridge

    1. ovs-vsctl add-br br-int
    2. ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=192.168.4.202
    复制代码

    创建一个veth peer,连接Linux Bridge 'qbr01' 和 OpenvSwich Bridge 'br-ini'

    1. ip link add qvo01 type veth peer name qvb01
    2. brctl addif qbr01 qvb01
    3. ovs-vsctl add-port br-int qvo01
    4. ovs-vsctl set port qvo01 tag=100
    5. ip link set qvb01 up
    6. ip link set qvo01 up
    复制代码

    查看现在network1上的 br-int

    1. ovs-vsctl show
    复制代码



    模拟安装计算节点(compute1)


    网络接口配置

    1. vi /etc/sysconfig/network-scripts/ifcfg-eth0
    2. DEVICE=eth0
    3. TYPE=Ethernet
    4. ONBOOT=yes
    5. NM_CONTROLLED=yes
    6. BOOTPROTO=static
    7. IPADDR=10.20.0.202
    8. NETMASK=255.255.255.0
    9. vi /etc/sysconfig/network-scripts/ifcfg-eth1
    10. DEVICE=eth1
    11. TYPE=Ethernet
    12. ONBOOT=yes
    13. NM_CONTROLLED=yes
    14. BOOTPROTO=static
    15. IPADDR=172.16.0.202
    16. NETMASK=255.255.255.0
    17. vi /etc/sysconfig/network-scripts/ifcfg-eth2
    18. DEVICE=eth2
    19. TYPE=Ethernet
    20. ONBOOT=yes
    21. NM_CONTROLLED=yes
    22. BOOTPROTO=static
    23. IPADDR=192.168.4.202
    24. NETMASK=255.255.255.0
    复制代码

    重启网络服务

    1. service network restart
    复制代码

    安装需要用到的包

    1. yum install libvirt openvswitch python-virtinst xauth tigervnc
    复制代码

    移除libvirt 默认的网络

    1. virsh net-destroy default
    2. virsh net-autostart --disable default
    3. virsh net-undefine default
    复制代码

    设置允许ipforwarding

    1. vi /etc/sysctl.conf 
    2. net.ipv4.ip_forward=1
    3. net.ipv4.conf.all.rp_filter=0
    4. net.ipv4.conf.default.rp_filter=0
    复制代码

    立即生效

    1. sysctl -p
    复制代码



    启动openvswitch

    1. service openvswitch start
    2. chkconfig openvswitch on
    复制代码

    创建一个linux bridge

    1. brctl addbr qbr02
    2. ip link set qbr02 up
    复制代码



    创建一个vm,并连接到qbr02

    上gre目录到compute1 节点,可以参考附件./gre/instance2.xml创建

    1. cp ~/gre/ /var/tmp/
    2. cd /var/tmp/gre
    3. mv cirros-0.3.0-x86_64-disk.img instance2.img
    4. virsh define instance2.xml
    5. virsh start instance2
    6. virsh vncdesplay instance2
    7. vncviewer :0
    复制代码



    启动console 以后,登录添加ip得知 192.168.1.12

    1. ip addr add 192.168.1.12/24 dev eth0
    2. route add default gw 192.168.1.1
    复制代码

    创建一个内部bridge br-int, 模拟 OpenStack integrated bridge

    1. ovs-vsctl add-br br-int
    2. ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=192.168.4.201
    复制代码

    创建一个veth peer,连接Linux Bridge 'qbr02' 和 OpenvSwich Bridge 'br-ini'

    1. ip link add qvo02 type veth peer name qvb02
    2. brctl addif qbr02 qvb02
    3. ovs-vsctl add-port br-int qvo02
    4. ovs-vsctl set port qvo02 tag=100
    5. ip link set qvb02 up
    6. ip link set qvo02 up
    复制代码

    查看现在network1 上的 br-int

    1. ovs-vsctl show
    复制代码



    检查是否能连通instance1,在instance2的控制台

    1. ping 192.168.1.11
    复制代码

    通过 Network Namespace 实现租户私有网络互访

    添加一个namespace,dhcp01用于隔离租户网络。

    1. ip netns add dhcp01
    复制代码

    为私有网络192.168.1.0/24 ,在命名空间dhcp01 中 创建dhcp 服务

    1. ovs-vsctl add-port br-int tapdhcp01 -- set interface tapdhcp01 type=internal
    2. ovs-vsctl set port tapdhcp01 tag=100
    3. ip link set tapdhcp01 netns dhcp01
    4. ip netns exec dhcp01 ip addr add 192.168.1.2/24 dev tapdhcp01
    5. ip netns exec dhcp01 ip link set tapdhcp01 up
    复制代码



    检查网络是否连通,在namespace 访问instance1 和 instance2

    1. ip netns exec dhcp01 ping 192.168.1.12
    2. ip netns exec dhcp01 ping 192.168.1.11
    复制代码



    通过 Network Namespace 和Iptables 实现L3 router

    ovs-vsctl add-br br-ex

    重新配置eth1 和 br-ex

    1. vi /etc/sysconfig/network-scripts/ifcfg-eth1
    2. DEVICE=eth1
    3. ONBOOT=yes
    4. BOOTPROTO=none
    5. PROMISC=yes
    6. MTU=1546
    7. vi /etc/sysconfig/network-scripts/ifcfg-br-ex
    8. DEVICE=br-ex
    9. TYPE=Bridge
    10. ONBOOT=yes
    11. BOOTPROTO=none
    12. IPADDR0=172.16.0.201
    13. PREFIX0=24
    复制代码

    重启启动网络服务

    1. ovs-vsctl add-port br-ex eth1 && service network restart
    复制代码

    检查网络,配置后是否连通

    1. ping 172.16.0.201
    复制代码



    添加一个namespace,router01 用于路由和floating ip 分配

    1. ip netns add router01
    复制代码

    在br-int添加一个接口,作为私有网络192.168.1.0/24的网关

    1. ovs-vsctl add-port br-int qr01 -- set interface qr01 type=internal
    2. ovs-vsctl set port qr01 tag=100
    3. ip link set qr01 netns router01
    4. ip netns exec router01 ip addr add 192.168.1.1/24 dev qr01
    5. ip netns exec router01 ip link set qr01 up
    6. ip netns exec router01 ip link set lo up
    复制代码



    在br-ex中添加一个接口,用于私网192.168.1.0/24设置下一跳地址

    1. ovs-vsctl add-port br-ex qg01 -- set interface qg01  type=internal
    2. ip link set qg01  netns router01
    3. ip netns exec router01 ip addr add 172.16.0.100/24 dev qg01 
    4. ip netns exec router01 ip link set qg01 up
    5. ip netns exec router01 ip link set lo up
    复制代码



    模拟分配floating ip 访问instance1

    为instance1 192.168.1.11 分配floating ip,172.16.0.101

    1. ip netns exec router01 ip addr add 172.16.0.101/32 dev qg01 
    2. ip netns exec router01  iptables -t nat -A OUTPUT -d 172.16.0.101/32  -j DNAT --to-destination 192.168.1.11
    3. ip netns exec router01  iptables -t nat -A PREROUTING -d 172.16.0.101/32 -j DNAT --to-destination 192.168.1.11
    4. ip netns exec router01  iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -j SNAT --to-source 172.16.0.101
    5. ip netns exec router01  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.0.100
    复制代码



    测试floating ip

    1. ping 172.16.0.101
    复制代码

    如果需要清除nat chain

    1. iptables -t nat -F
  • 相关阅读:
    数据库主键策略
    经历alidns在国外的严重延时
    无题 MVC
    Jquery操作select,左右移动,双击移动 取到所有option的值
    Computop支付网关(一) credit Card
    [转载] 测试的道理
    微信砍价活动总结
    transform,变换
    transition,过渡效果
    文字居底方法
  • 原文地址:https://www.cnblogs.com/yudar/p/4401829.html
Copyright © 2011-2022 走看看