• OVN实战---《OVN and Containers》翻译


    Overview

    在本篇文章中,我们要讨论的是OVN和容器的集成。到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络内的所有虚拟机直接访问。

    The OVN Container Networking Model

    根据ovn-architecture的man page,OVN的容器网络策略是和容器宿主机进行VLAN trunk connection,并且要求来自每一个容器的流量都用一个单独的VLAN进行隔离。当然,这就要求OVN和容器宿主机之间进行合作,从而保证它们对于给定容器使用的VLAN tag是同步的。同时这也要求容器宿主机从内部保证容器之间是相互隔离的。

    下面我们进一步对细节进行讨论,基本的想法是我们利用OVN创建一个logical port用于连接容器宿主机。之后再为我们的容器定义logical port,并将它们映射到"parent" VM logical port,并且定义相应的VLAN tag。之后,OVN会配置OVS flows,将来自parent VM的logical port的标有VLAN的流量映射到合适的container logical port。具体如下图所示:

    The Existing Setup

    在进一步操作之前,我们先来回顾一下已有的拓扑结构

    The lab network

    The OVN logical network:

    Defining the Logical Network

    在本次实验中,我们要创建一个新的fake "VM",vm5,用来存放我们的fake "containers"。这个新的虚拟机会插入到已经存在的dmz交换机上,和vm1,vm2一起。对于新的虚拟机和它的容器,我们都将使用DHCP来配置IP。

     在为vm5创建logical port之前,我们需要先确定在之前的lab中,我们为dmz创建的DHCP options。我们将通过直接对OVN northbound DB进行查找来获取该信息。以下是查找的结果。

    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"}
    

      

    我们需要的是"172.16.255.128/26"这个网络的UUID(在我们这个例子中是c0c29381-c945-4507-922a-cb87f76c4581)。获取该UUID以备后用。

    接下来为vm5创建logical port。这些操作我们应该已经很熟悉了。需要注意的是,将其中的{uuid}用上文获取的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内的容器创建logical port。这和创建普通的logical port几乎没什么不同,不过是加了一些额外的设置。

    ubuntu1

    # create the logical port for 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}
    
    # set the parent logical port and vlan tag for c51
    ovn-nbctl set Logical_Switch_Port dmz-c51 parent_name=dmz-vm5
    ovn-nbctl set Logical_Switch_Port dmz-c51 tag=51
    
    # create the logical port for 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}
    
    # set the parent logical port and vlan tag for c52
    ovn-nbctl set Logical_Switch_Port dmz-c52 parent_name=dmz-vm5
    ovn-nbctl set Logical_Switch_Port dmz-c52 tag=52
    

      

    因此,唯一的不同仅仅只是我们为container logical port设置了parent_name和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
    

      

    Configure vm5

    对于本次实验,首先需要记住的是,我们使用的并不是真正的虚拟机,我们仅仅通过直接在Ubuntu主机上模拟它们来作为ovs internal ports。对于vm1-vm4我们是直接在br-int创建这些internal port的,但对于vm5,我们的要求有所不同,因此我们会使用一个专门的ovs bridge。这个bridge叫做br-vm5,它并不由OVN管理,当你真正对一个容器宿主机进行配置时,需要对这样一个网桥进行配置。这个网桥会为虚拟机和它的容器提供网络,并且会被配置为进行VLAN tagging操作。下图显示了当我们配置完成时的拓扑结构:

    这个实验的配置是非常简单的,我将所有容器都放在了同一个logical switch中,事实上这不是必须的,我可以将container logical switch放在任何logical switch上。

    那接下来就开始吧。第一步是对vm5进行配置,这一步我们将放在ubuntu2上进行。

    # create the bridge for vm5
    ovs-vsctl add-br br-vm5
    
    # create patch port on br-vm5 to br-int
    ovs-vsctl add-port br-vm5 brvm5-brint -- set Interface brvm5-brint type=patch options:peer=brint-brvm5
    
    # create patch port on br-int to br-vm5. set external id to dmz-vm5 since this is our connection to 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
    
    # create vm5 within a namespace, vm5 traffic will be untagged
    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
    

      

    从vm5 ping 它的默认网关确认连通性:

    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
    

      

    Configuring the vm5 "Containers"

    现在vm5已经启动并正常工作了,接下来我们就能配置它的fake "containers"了。这看起来和配置我们的fake "vm"相同,只是我们还需要对它进行vlan tagging的配置。

    # create c51 within a namespace. c51 traffic will be tagged with vlan 51
    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
    
    # create c52 within a namespace. c52 traffic will be tagged with vlan 52
    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
    

      

    Final Words

    根据ovn-architecture guide,如果你直接在hypervisor运行容器,或者将他们直接绑定在integration bridge上,那么随着系统的扩展,它们可能会使整个OVN系统停滞。上文这种嵌套的网络解决方案就比较好,因为它有效地减少了integration bridge上的VIF的数目,因此它能最小化对性能带来的影响。再次强调,本文的目的不是为了对真实世界容器解决方案的模拟,仅仅只是为了说明OVN内置的容器网络特性。

    原文链接:http://blog.spinhirne.com/2016/10/ovn-and-containers.html

  • 相关阅读:
    【Linux 读书笔记】Linux文件的硬连接和符号连接
    Shell参数
    Shellcase语句的例子
    Shellselect
    Shell小程序一个
    SHELL起步
    接昨天的 while
    Shell循环控制
    Shellwhile循环的例子
    Shellfor语句
  • 原文地址:https://www.cnblogs.com/YaoDD/p/7479118.html
Copyright © 2020-2023  润新知