整合容器与 OVN 和 OpenStack

容器之间的隔离比虚拟机之间的隔离弱,因此在一些环境下,将不同租户的容器部署到单独的虚拟机中,以作为额外的安全措施。本文档描述虚拟机中容器的创建,以及如何将它们安全地作为逻辑网络的一部分。这个创建的逻辑网络可以包括虚拟机、容器和作为端点的物理机。为了更好地理解容器与OVN和OpenStack的整合,本文档描述了一个从开头到结尾的任务流的例子。

  • OpenStack租户创建一个具有单个网络接口的VM(比如说VM-A)。其接口属于管理逻辑网络。虚拟机是用来承载容器。OpenStack Nova选择在其上创建VM-A的Hypervisor。

  • 一个Neutron端口可能已经提前创建,并与创建新虚拟机的请求一同传给了Nova。如果没有,Nova将向Neutron发出请求创建新端口。来自Neutron的逻辑端口ID也将用作VM-A虚拟机的虚拟网络接口(virtual network interface - VIF)的vif-id。

  • 当在Hypervisor上创建VM-A时,其VIF接口将添加到Open vSwitch的integration网桥中。这将在Open_vSwitch数据库的Interface表中创建一行记录。正如文档integration guide(位于Open vSwitch 代码文档的位置:topics/integration)中所述,与虚拟机网络接口关联的vif-id添加到Interface表中新创建行的external_ids:iface-id列中。

  • 既然VM-A属于一个逻辑网络,它可得到一个IP地址。此IP地址用于在VM内生成容器(手动或通过容器编排系统),也用于监控已创建容器的健康情况。

  • 通过使用租户证书向Neutron发起调用,可获取与虚拟机网络接口相关联的vif-id。

  • 此任务流程假定一个名为"container network plugin"的组件。如果你以Docker作为容器,可以想象这个插件是Docker的一个封装器或者是一个Docker自身的功能,其能够理解如何执行此处描述的部分工作流程,以使容器连接到Neutron管理的逻辑网络。剩余的流程部分将这个尚不存在的逻辑组件称为"container network plugin"容器网络插件。

  • 所有到Neutron的调用都需要租户的证件。这些调用可以从租户的虚拟机内部发起(此虚拟机作为容器网络插件的一部分),也可以从租户虚拟机外部发起(如果租户不愿意使用来自租户VMs内部的临时Keystone令牌)。为了简单起见,本文档使用前一种调用发起方法解释工作流程。

  • 承载容器的虚拟机需要安装Open vSwitch虚拟交换机。VM内部的Open vSwitch交换机的唯一工作就是标记(tag)来自容器的网络流量。

  • 当需要在VM内部创建具有容器网络接口的容器时,期望接口连接到特定的逻辑交换机,VM虚拟机中的"容器网络插件"选择任何未使用的VLAN(此VLAN标记只需要在虚拟机中独一无二。这限制了所有容器的接口数量在单个虚拟机中不超过4096个)。这个VLAN标记在Hypervisor中由OVN剥除,并且仅用作OVN的上下文(或元数据)。

  • 然后"容器网络插件"向Neutron发起调用创建逻辑端口。除了此调用Neutron创建端口所需的所有输入之外,一并发送了vif-id和VLAN标记作为输入。

  • 反过来,Neutron将验证vif-id是否属于以上讨论的租户。然后使用OVN特定的插件在OVN Northbound 数据库的Logical_Switch_Port表中创建一条新记录。Neutron响应返回该网络接口的IP地址和MAC地址。所以Neutron成为IPAM系统,并为同一个逻辑网络上的不同VM和容器提供唯一的IP和MAC地址信息。

  • 上述为容器创建逻辑端口的Neutron API 调用将显著的增加容器创建的时间。然而,这里可以进行优化。可以提前创建逻辑端口并由负责容器编排的系统重新使用。额外的Neutron API 调用只有当端口需要连接到不同的逻辑网络时才需要调用。

  • 当容器最终被删除时,该虚拟机中的"容器网络插件"可能发起到Neutron的调用以删除其端口。继而Neutron会删除OVN Northbound 数据库的Logical_Switch_Port表中的条目。

例如,考虑Docker容器。由于目前Docker自身没有"容器网络插件"特性,这个例子使用一个假设的Docker封装器向Neutron发起调用

  • 创建逻辑交换机:
      $ ovn-docker --cred=cca86bd13a564ac2a63ddf14bf45d37f create network LS1

以上的命令将带着credentials发起到Neutron的调用以创建逻辑交换机。如果逻辑交换机已经从虚拟机外部创建,可不用再执行以上操作。

  • 列出租户可用的网络:

    $ ovn-docker --cred=cca86bd13a564ac2a63ddf14bf45d37f list networks
    
  • 创建一个容器,并关联一个端口到之前创建的交换机上,作为逻辑端口:

    $ ovn-docker --cred=cca86bd13a564ac2a63ddf14bf45d37f --vif-id=$VIF_ID \
        --network=LS1 run -d --net=none ubuntu:14.04 /bin/sh -c \
        "while true; do echo hello world; sleep 1; done"
    

上面的命令将发起到Neutron的调用,带着目前所有为创建逻辑端口所需的输入参数。Neutron将此信息添加到OVS中,并返回该端口的MAC地址和IP地址。然后,ovn-docker 将创建一对veth端口,将其中一端接口插入容器中作为"eth0",另一端接口作为本地OVS网桥的端口,作为所选VLAN的访问access端口。

猜你喜欢

转载自blog.csdn.net/sinat_20184565/article/details/94654601