安装
要想使用OVN实现Docker的跨主机网络,Docker在启动时必须指定分布式键值存储服务,比如你打算使用Consul作为键值存储,启动Docker daemon时请使用如下参数:
docker daemon --cluster-store=consul://127.0.0.1:8500 \
–cluster-advertise=$HOST_IP:0
其中$HOST_IP是你主机本地IP。
OVN为容器提供了虚拟化的网络,目前OVN和Docker的集成,有两种方式:即”underlay”模式和”overlay”模式。
在”underlay”模式下,OVN依赖于OpenStack为容器提供网络。此模式下,使用者可以让虚拟机中的容器、独立虚拟机(不运行任何容器)、物理机都连接到相同的逻辑网络下。这是种多租户、多主机的解决方案。
在”overlay”模式下,OVN可以用来创建跨主机的容器间网络。此模式是单租户(当然在不需要额外的网络隔离的情况下可以拓展成多租户)、多主机的解决方案。此模式不依赖OpenStack。
无论哪种模式,想要让容器使用OVN都必须在所有容器宿主机上安装Open vSwitch。
Overlay模式
使用OVN的”overlay”模式要求的Open vSwitch最小版本是2.5。
初始化中心节点
在OVN的架构中,需要有一个中心节点用来存储网络定义。在需要部署的机器中选择一台作为中心节点,IP地址是$CENTRAL_IP。
通过以下命令启动ovsdb-server,监听在TCP的6640端口:
ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6640
启动ovn-northd守候进程,这个进程用来将Docker存储在OVN_Northbound中的网络定义同步到OVN_Southbound中:
/usr/share/openvswitch/scripts/ovn-ctl start_northd
初始化各节点(仅需执行一次)
以下过程在每个你需要启动容器的机器上仅执行一次(除非OVS数据库清空后,任何其他清空执行多次都会带来问题。)
下面的命令中,
LOCAL_IP指宿主机可以被访问的IP地址,OVS将通过这个IP与其他宿主机通讯。
LOCALIP指宿主机可以被访问的IP地址,OVS将通过这个IP与其他宿主机通讯。ENCAP_TYPE指通道类型。目前可选项是”geneve” 和 “stt”。(注意你的宿主机内核必须支持你选择的
ENCAP_TYPE类型。这两种类型都默认包含在了Open vSwitch的内核模块中。如果你的Open vSwitch内核模块来自于上游Linux发行版,那么geneve最低支持的内核版本是3.18。发行版中的内核模块不支持stt。你可以通过lsmod | grep
ENCAPTYPE类型。这两种类型都默认包含在了OpenvSwitch的内核模块中。如果你的OpenvSwitch内核模块来自于上游Linux发行版,那么geneve最低支持的内核版本是3.18。发行版中的内核模块不支持stt。你可以通过lsmod∣grepENCAP_TYPE来确认是否支持相应的模式。)
ovs-vsctl set Open_vSwitch . external_ids:ovn-remote=“tcp:$CENTRAL_IP:6640” \
external_ids:ovn-encap-ip= L O C A L I P e x t e r n a l i d s : o v n − e n c a p − t y p e = " LOCAL_IP external_ids:ovn-encap-type=" LOCALIPexternalids:ovn−encap−type="ENCAP_TYPE"
最后,启动ovn-controller,记得将启动命令添加到系统启动脚本中。
/usr/share/openvswitch/scripts/ovn-ctl start_controller
启动Open vSwitch驱动
默认情况下,Docker使用Linux bridge作为网络驱动,当然了它支持其他外部驱动。为了让Docker使用Open vSwitch,你需要启动Open vSwitch驱动。
Open vSwitch驱动使用了Python的flask模块来监听Docker的网络API调用。所以如果你的主机还没有安装flask,使用以下命令安装:
easy_install -U pip
pip install Flask
在所有准备运行Docker容器的机器上都要执行以下命令以启动驱动:
ovn-docker-overlay-driver --detach
Docker内建的网络和OVN的网络概念非常一致,请查阅Docker的文档获取更全面的命令指南,这里只是个简单的例子。
创建逻辑交换机
使用以下命令创建一个名为foo,子网为192.168.1.0/24的逻辑交换机。
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 lswitch-list
将Docker容器连接到逻辑交换机
例如将一个busybox容器连接到逻辑网络foo上,只需要执行:
docker run -itd --net=foo --name=busybox busybox
列出所有逻辑端口
目前Docker尚未提供命令来列出交换机端口,所以你可以通过直接查询OVN数据库来查看:
ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lport-list $NID
创建逻辑交换机并将正在运行的容器连接
docker network create -d openvswitch --subnet=192.168.2.0/24 bar
docker network connect bar busybox
你可以通过如下命令断开容器和逻辑交换机的连接
docker network disconnect bar busybox
删除逻辑交换机
最后
ybox
你可以通过如下命令断开容器和逻辑交换机的连接
docker network disconnect bar busybox
删除逻辑交换机
最后
[外链图片转存中…(img-li9o61sn-1721176556262)]
[外链图片转存中…(img-mB3u59pk-1721176556262)]
[外链图片转存中…(img-wGIlznhE-1721176556263)]