zoukankan      html  css  js  c++  java
  • SDN控制器之OVN实验六:配置集成容器的OVN网络

    概览

    接着我的上一篇文章,本文讨论的主题是集成的容器的OVN。 在本实验结束时,我们将创建一个容器主机“VM”(虚拟机),其中包含一对容器。 这些容器将直接绑定到OVN逻辑交换机中,并且可以直接从逻辑网络内的所有虚拟机访问。

    OVN 容器网络模型

    根据官方的OVN架构文档,OVN的容器网络选择使用VLAN Trunk作为连接到容器主机VM的方式,并要求来自每个容器的流量被隔离在一个唯一的VLAN内。这也意味着在OVN和容器主机之间必须对VLAN信息进行同步,以确保它们在同一时间给特定容器使用哪个VLAN tag。通过这种方式,它对容器主机施加了一定程度的控制,以确保主机上的容器被相互隔离。

    我把OVN实现步骤细分为三步:

    • 创建一个连接主机VM的逻辑端口。

    • 为容器定义逻辑端口,将它们映射到“父”虚拟机逻辑端口,并定义要使用的VLAN tag。

    • OVN配置OVS流,将被VLAN标记的流量从“父”虚拟机的逻辑端口映射到目标容器的逻辑端口。

    下图描述了这种设计:

    当前环境信息

    在开始之前,请花点时间看一下当前环境信息。

    物理网络拓扑:

     
    OVN 逻辑网络拓扑:

    定义逻辑网络

    在本次实验中,我将创建一个新的伪“虚拟机”,vm5,它将托管我们的伪“容器”。新虚拟机将接入到现有的DMZ交换机,和vm1和vm2相邻。 我们将对新虚拟机及其容器使用DHCP。在为vm5创建逻辑端口之前,我们需要查看在上一篇文章中为DMZ网络创建的DHCP选项。 我们将直接查询OVN北向数据库以获取此DHCP选项相关信息。

    我这个实验环境的输出结果是:

     

    root@ubuntu1:~# ovn-nbctl list DHCP_Options

    _uuid               : 7e32cec4-957e-46fa-a4cc-34218e1e17c8

    cidr                : "172.16.255.192/26"

    external_ids        : {}

    options             : {lease_time="3600", router="172.16.255.193", server_id="172.16.255.193", server_mac="02:ac:10:ff:01:93"}

    _uuid               : c0c29381-c945-4507-922a-cb87f76c4581

    cidr                : "172.16.255.128/26"

    external_ids        : {}

    options             : {lease_time="3600", router="172.16.255.129", server_id="172.16.255.129", server_mac="02:ac:10:ff:01:29"}

    我们获取到了192.16.255.128/26”网络的UUID(在我的环境是c0c29381-c945-4507-922a-cb87f76c4581)。 捕获此UUID以在稍后的命令中使用。

    让我们为vm5创建逻辑端口。 你现在应该对这些命令不陌生了。 请务必将{uuid}替换为上述DHCP选项条目中的UUID。

    在ubuntu1上执行:

     

    ovn-nbctl lsp-add dmz dmz-vm5

    ovn-nbctl lsp-set-addresses dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"

    ovn-nbctl lsp-set-port-security dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"

    ovn-nbctl lsp-set-dhcpv4-options dmz-vm5 {uuid}

    现在我们将为在vm5上运行的容器创建逻辑端口。 此过程几乎与创建正常的逻辑端口相同,需要注意有几个新的命令。

    在ubuntu1上进行如下操作:

     

    # 创建逻辑端口c51

    ovn-nbctl lsp-add dmz dmz-c51

    ovn-nbctl lsp-set-addresses dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"

    ovn-nbctl lsp-set-port-security dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"

    ovn-nbctl lsp-set-dhcpv4-options dmz-c51 {uuid}

    #设置c51的父逻辑端口和vlan tag

    ovn-nbctl set Logical_Switch_Port dmz-c51 parent_name=dmz-vm5

    ovn-nbctl set Logical_Switch_Port dmz-c51 tag=51

    #创建逻辑端口c52

    ovn-nbctl lsp-add dmz dmz-c52

    ovn-nbctl lsp-set-addresses dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"

    ovn-nbctl lsp-set-port-security dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"

    ovn-nbctl lsp-set-dhcpv4-options dmz-c52 {uuid}

    #设置c52的父逻辑端口和vlan tag

    ovn-nbctl set Logical_Switch_Port dmz-c52 parent_name=dmz-vm5

    ovn-nbctl set Logical_Switch_Port dmz-c52 tag=52

    因此,唯一的区别是为容器逻辑端口设置了一个parent_name和vlan tag。 您可以通过查看数据库条目来验证这些。

    我这个实验环境的输出结果是:

     

    root@ubuntu1:~# ovn-nbctl find Logical_Switch_Port name="dmz-c51"

    _uuid               : ea604369-14a9-4e25-998f-ec99c2e7e47e

    addresses           : ["02:ac:10:ff:01:31 172.16.255.133"]

    dhcpv4_options      : c0c29381-c945-4507-922a-cb87f76c4581

    dhcpv6_options      : []

    dynamic_addresses   : []

    enabled             : []

    external_ids        : {}

    name                : "dmz-c51"

    options             : {}

    parent_name         : "dmz-vm5"

    port_security       : ["02:ac:10:ff:01:31 172.16.255.133"]

    tag                 : 51

    tag_request         : []

    type                : ""

    up                  : false

    配置 vm5

    关于这个实验的第一件事情是,我们没有使用真正的虚拟机,而是直接在Ubuntu主机上把ovs内部端口模拟成虚拟机。 对于vm1,vm2,vm3和vm4,我们直接在br-int上创建这些内部端口,但对于vm5,我们的实验要求有点不同,因此我们将使用专用的ovs网桥。 这个br-vm5的网桥不会由OVN管理,并且将模拟真实的容器主机VM内部的ovs网桥。 此网桥将为VM及其容器提供本地网络连接,并将执行VLAN tagging。

    配置完成之后就是下图:

    我的实验配置很简单,我把容器都放在同一个逻辑交换机上。然而没有要求必须这样做,其实我可以将容器逻辑端口放置在任一台逻辑交换机上。

    第一步是创建vm5。 
    在ubuntu2主机上进行如下操作:

     

    #为vm5创建网桥

    ovs-vsctl add-br br-vm5

    #在br-vm5上创建到br-int的patch端口

    ovs-vsctl add-port br-vm5 brvm5-brint -- set Interface brvm5-brint type=patch options:peer=brint-brvm5

    #在br-int上创建到br-vm5 patch端口。 因为与vm5的连接的,所以将外部id设置为dmz-vm5。

    ovs-vsctl add-port br-int brint-brvm5 -- set Interface brint-brvm5 type=patch options:peer=brvm5-brint

    ovs-vsctl set Interface brint-brvm5 external_ids:iface-id=dmz-vm5

    #在命名空间中创建vm5。 vm5流量将被进行untag操作

    ovs-vsctl add-port br-vm5 vm5 -- set interface vm5 type=internal

    ip link set vm5 address 02:ac:10:ff:01:32

    ip netns add vm5

    ip link set vm5 netns vm5

    ip netns exec vm5 dhclient vm5

    通过ping vm5的默认网关来验证网络连通性:

     

    root@ubuntu2:~# ip netns exec vm5 ping 172.16.255.129

    PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data.

    64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=0.797 ms

    64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.509 ms

    64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.404 ms

    配置“容器”

    现在vm5已经启动了,我们可以配置它的伪“容器”。 除了vlan相关配置之外,它们看起来几乎完全和我们的伪“虚拟机”们一模一样。

     

    #在命名空间中创建c51。 c51流量将打上vlan 51的tag

    ip netns add c51

    ovs-vsctl add-port br-vm5 c51 tag=51 -- set interface c51 type=internal

    ip link set c51 address 02:ac:10:ff:01:33

    ip link set c51 netns c51

    ip netns exec vm5 dhclient c51

    #在命名空间中创建c52。 c52流量将打上vlan 52的tag

    ip netns add c52

    ovs-vsctl add-port br-vm5 c52 tag=52 -- set interface c52 type=internal

    ip link set c52 address 02:ac:10:ff:01:34

    ip link set c52 netns c52

    ip netns exec c52 dhclient c52

    测试网络连通性:

     

    root@ubuntu2:~# ip netns exec c51 ping 172.16.255.129

    PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data.

    64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=1.33 ms

    64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.420 ms

    64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.371 ms

    root@ubuntu2:~# ip netns exec c52 ping 172.16.255.129

    PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data.

    64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=1.53 ms

    64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.533 ms

    64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.355 ms

    结语

    如果按照ovn官方架构文档,直接在虚拟机管理程序上运行容器,或者直接用patch端口连接到集成网桥,那么在网络规模特别大的情况下,OVN系统可能会崩溃。

    “嵌套”网络解决方案是很好的,因为它大大减少了集成桥上的VIF的数量,从而最小化容器本身的性能损失。

    最后再说明一下,本实验的重点不是建立一个完全真实的容器环境,而是展示OVN的内置的容器网络功能集。

  • 相关阅读:
    Balanced Binary Tree
    Convert Sorted List to Binary Search Tree
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Validate Binary Search Tree
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Maximum Depth of Binary Tree
    如何把U盘的两个盘或者多个盘合成一个
    bugku 想蹭网先解开密码
  • 原文地址:https://www.cnblogs.com/liuhongru/p/11121750.html
Copyright © 2011-2022 走看看