本文档描述如何使用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.
- 启动中央组件 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
-
建立一次 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)
-
启动
ovn-controller
.你需要在每次启动时运行以下命令:
$ /usr/share/openvswitch/scripts/ovn-ctl start_controller
-
开启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网络.
-
一次建立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
-
创建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
。 -
启动 Open vSwitch 网络驱动
Open vSwitch驱动程序使用Python的flask模块来监听Docker的网络API调用。驱动程序还使用OpenStack的
python-neutronclient
库。如果你的主机没有Pythonflask
模块或者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架构的详细信息.