Open Virtual Networking 与 Docker

本文档描述如何使用Open Virtual Networking与Docker 1.9.0版本或更新版本。

重要:

要求Docker 1.9.0或之后版本。仅Docker 1.9.0+以上版本支持多宿主机网络。咨询 www.docker.com 关于如何安装Docker的指南。

:

你必须编译并安装Open vSwitch,在继续以下的指南之前。参考Open vSwitch官方文档/intro/install/index获取更多信息.

建立

对于OVN和Docker的多主机网络,Docker的启动需要一个分布式的键值存储。例如,如果你决定使用consul作为你的分布式键值存储,你的主机IP地址是$HOST_IP,如下命令开启Docker守护进程:

$ docker daemon --cluster-store=consul://127.0.0.1:8500 \
    --cluster-advertise=$HOST_IP:0

OVN为容器提供网络虚拟化。OVN与Docker的整合目前有两种工作模式 — "underlay"模式或"overlay"模式。

在"underlay"模式下,OVN需要OpenStack来提供容器网络。在这种模式下,可以创建逻辑网络,可以在VMs内运行的容器,可创建独立的VMs(没有任何容器在它们内部运行)以及可将物理机器连接到同一逻辑网络。这是一个多租户、多主机的解决方案。

在"overlay"模式下,OVN可以在多个主机上运行的容器之间创建逻辑网络。这是一个单租户(根据工作负载的安全特性可扩展到多个租户),多主机解决方案。在这种模式下,你不需要预先创建的OpenStack。

为了使这两种模式都能工作,用户必须在每个计划运行容器的VM/Host中安装并启动Open vSwitch。

overlay 模式

:

工作在 “overlay” 模式的OVN要求Open vSwitch的版本最低为 2.5.

  1. 启动中央组件 Start the central components.

OVN体系结构有一个中央组件,用于在数据库中存储你的网络布局。在你的一台IP地址$CENTRAL_IP的计算机上,安装并启动Open vSwitch,你将需要启动一些中央组件。

启动ovn-northd守护进程。这个守护进程将来自Docker的OVN_Northbound数据库中的网络请求,转换为OVN_Southbound数据库总的逻辑流。例如:

  $ /usr/share/openvswitch/scripts/ovn-ctl start_northd

对于2.7或更高版本的Open vSwitch,你需要运行以下附加命令(请阅读ovn-nb的手册页了解更多关于允许的连接类型的控制):

  $ ovn-nbctl set-connection ptcp:6641
  $ ovn-sbctl set-connection ptcp:6642
  1. 建立一次 One time setup

    在每个计划生成容器的主机上,你需要运行一次下面的命令。如果你的OVS数据库被清除,你可能需要再次运行此命令。在任何情况下再次运行它都是无害的:

    $ ovs-vsctl set Open_vSwitch . \
        external_ids:ovn-remote="tcp:$CENTRAL_IP:6642" \
        external_ids:ovn-nb="tcp:$CENTRAL_IP:6641" \
        external_ids:ovn-encap-ip=$LOCAL_IP \
        external_ids:ovn-encap-type="$ENCAP_TYPE"
    

    where:

    $LOCAL_IP
    其它主机可以通过IP地址访问此主机。这作为你的本地隧道端点。

    $ENCAP_TYPE
    是要用于覆层网络的隧道类型。可选项有"geneve"或"stt"。你的内核必须支持选择的$ENCAP_TYPE。"geneve"和"stt"都是Open vSwitch 内核模块的一部分,此内核模块由本仓库的代码编译而来。如果你使用打开上游Linux自带的Open vSwitch 内核模块,你将需要支持"geneve"的最低3.18内核版本。上游Linux中没有"stt"支持。你可以验证你的内核的支持情况,如下:

      $ lsmod | grep $ENCAP_TYPE
    

    此外,OVN部署中的每个Open vSwitch 实例都需要一个唯一的,持久标识符,称为system-id。如果你从Open vSwitch 的发行软件包安装的OVS(例如.deb或.rpm包),或你使用包含在Open vSwitch中的ovs-ctl 工具,它会自动配置system-id。如果手动启动Open vSwitch,则应自行设置system-id。例如:

    $ id_file=/etc/openvswitch/system-id.conf
    $ test -e $id_file || uuidgen > $id_file
    $ ovs-vsctl set Open_vSwitch . external_ids:system-id=$(cat $id_file)
    
  2. 启动ovn-controller.

    你需要在每次启动时运行以下命令:

    $ /usr/share/openvswitch/scripts/ovn-ctl start_controller
    
  3. 开启Open vSwitch 网络驱动.

    默认情况下,Docker使用Linux网桥进行联网。但它支持外部驱动程序。要使用Open vSwitch而不是linux网桥,你需要启动Open vSwitch驱动程序。

    Open vSwitch驱动程序使用Python的flask模块来监听Docker的网络API调用。所以,如果你的主机没有Python的flask模块,以下命令进行安装:

    $ sudo pip install Flask
    

    在每个计划创建容器的主机上启动Open vSwitch驱动程序。请参阅关于$OVS_PYTHON_LIBS_PATH的注释,其将在之后的文件末尾使用:

    $ PYTHONPATH=$OVS_PYTHON_LIBS_PATH ovn-docker-overlay-driver --detach
    

    注释:

    $OVS_PYTHON_LIBS_PATH变量应指向Open vSwitch模块的安装目录. 如果你通过Debian软件包python-openvswitch安装Open vSwitch模块,或者通过运行pip命令pip install ovs安装,你不需要知道PATH。如果你安装Open vSwitch文档/intro/install/general中的指示进行的安装,你应指定PATH。在此情况下,PATH取决于传递到./configure的选项。它通常为/usr/share/openvswitch/python/usr/local/share/openvswitch/python

Docker具有内建的primitives,其与OVN的逻辑交换机和逻辑端口概念非常匹配。请查阅Docker的文档以了解所有可能的命令。下面是一些例子。

创建逻辑交换机

在’192.168.1.0/24’网段创建逻辑交换机’foo’,运行以下命令:

$ NID=`docker network create -d openvswitch --subnet=192.168.1.0/24 foo`

显示所有的逻辑交换机

$ docker network ls

你也通过运行以下命令在OVN的northbound数据库中查看此逻辑交换机:

$ ovn-nbctl --db=tcp:$CENTRAL_IP:6640 ls-list

删除逻辑交换机

$ docker network rm bar

创建逻辑端口

Docker一步完成创建逻辑端口并将其连接到逻辑网络。例如,要将逻辑端口连接到容器”busybox“内部的网络“foo”,运行:

$ docker run -itd --net=foo --name=busybox busybox

显示所有逻辑端口

Docker目前没有显示所有逻辑端口的CLI命令,但是你可在OVN的数据库中查看它们,运行:

$ ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lsp-list $NID

创建并关联逻辑端口到运行的容器

$ docker network create -d openvswitch --subnet=192.168.2.0/24 bar
$ docker network connect bar busybox

从运行容器脱离并删除逻辑端口

你运行以下命令从运行容器脱离并删除逻辑端口:

$ docker network disconnect bar busybox

underlay 模式

注释:

此模式要求你有预先安装的OpenStack及OVN,提供underlay网络.

  1. 一次建立One time setup

    OpenStack租户创建具有单个网络接口(或多个)的VM,其端口属于管理逻辑网络。租户需要获得与接口关联的port-id,通过其在生成的VM内部发送容器的流量。这可以通过运行下面的命令获取与虚拟机关联的“id”:

    $ nova list
    

    随后运行:

    $ neutron port-list --device_id=$id
    

    在VM中,下载包含租户信息的OpenStack RC文件(此后称做“openrc.sh”)。编辑文件并添加之前获取的port-id信息,即添加以下行:

    $ export OS_VIF_ID=$port_id
    

    编辑完成后,此文件如下所示:

    #!/bin/bash
    export OS_AUTH_URL=http://10.33.75.122:5000/v2.0
    export OS_TENANT_ID=fab106b215d943c3bad519492278443d
    export OS_TENANT_NAME="demo"
    export OS_USERNAME="demo"
    export OS_VIF_ID=e798c371-85f4-4f2d-ad65-d09dd1d3c1c9
    
  2. 创建Open vSwitch 网桥

    如果你的虚拟机有一个以太网接口(例如:“eth0”),则需要将该设备作为一个端口添加到Open vSwitch 网桥“breth0”上,并迁移其IP地址和路由信息到网桥。(如果它有多个网络接口,你需要为计划发送容器流量的接口创建和连接一个Open vSwitch 网桥)

    如果使用DHCP获取IP地址,则应终止此侦听在物理以太网接口(如eth0)上的DHCP客户端。并在Open vSwitch网桥(如 breth0)上重启此客户端。

    取决于你的VM,你可以将以上步骤设置为持久化保存,设备重启不丢失。例如,如果你的虚拟机是基于Debian/Ubuntu-based,请阅读openvswitch-switch.README.Debian,其在OVS的“debian”文件夹下。如果你的虚拟机是基于RHEL,请参阅OVS文档:/intro/install/RHEL

  3. 启动 Open vSwitch 网络驱动

    Open vSwitch驱动程序使用Python的flask模块来监听Docker的网络API调用。驱动程序还使用OpenStack的python-neutronclient库。如果你的主机没有Python flask模块或者python-neutronclient库,你必须安装它们,例如:

    $ pip install python-neutronclient
    $ pip install Flask
    

    安装完成后,source文件openrc:

    $ . ./openrc.sh
    

    启动网络驱动,并在提示时提供你的OpenStack租户密码:

    $ PYTHONPATH=$OVS_PYTHON_LIBS_PATH ovn-docker-underlay-driver \
        --bridge breth0 --detach
    

此后,你可使用与overlay模式一节相同的Docker命令.

参考ovs-architecture的手册页(man ovn-architecture) 理解OVS架构的详细信息.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页