在Docker中使用Open vSwitch创建跨主机的容器网络

简介: 本文讲的是在Docker中使用Open vSwitch创建跨主机的容器网络,【编者的话】本文介绍了如何使用Open vSwitch为Docker 1.9.0及以后版本提供网络支持。操作前请先确认你已经按照INSTALL.md 编译,或者通过包管理器安装了Open vSwitch。
本文讲的是在Docker中使用Open vSwitch创建跨主机的容器网络 【编者的话】本文介绍了如何使用Open vSwitch为Docker 1.9.0及以后版本提供网络支持。操作前请先确认你已经按照 INSTALL.md  编译,或者通过包管理器安装了Open vSwitch。关于如何安装Docker,请参考 www.docker.com 上提供的介绍。

Docker从1.9.0版本之后提供了跨主机的网络支持。通过将Docker和Open vSwitch整合,则可以利用Open vSwitch virtual network(OVN)进行互联互通。

安装

要想使用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与其他宿主机通讯。 $ENCAP_TYPE 指通道类型。目前可选项是"geneve" 和 "stt"。(注意你的宿主机内核必须支持你选择的 $ENCAP_TYPE 类型。这两种类型都默认包含在了Open vSwitch的内核模块中。如果你的Open vSwitch内核模块来自于上游Linux发行版,那么geneve最低支持的内核版本是3.18。发行版中的内核模块不支持stt。你可以通过 lsmod | grep $ENCAP_TYPE 来确认是否支持相应的模式。)
ovs-vsctl set Open_vSwitch . external_ids:ovn-remote="tcp:$CENTRAL_IP:6640" \
external_ids:ovn-encap-ip=$LOCAL_IP external_ids: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

删除逻辑交换机

docker network rm bar

Underlay模式

此模式需要预先安装运行OpenStack。

初始化各节点(仅需执行一次)

OpenStack租户先要在他们的网络内创建单或多网络端口的虚拟机。租户需要先取得想要作为宿主机的端口ID(port-id)。可以通过以下命令取得虚拟机关联的网络端口ID:
nova list

然后执行:
neutron port-list --device_id=$id

在虚拟机中,下载包含租户信息的OpenStack RC文件(下文称之为'openrc.sh')。编辑并添加之前获得的端口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'),你创建一个名为breth0的网桥,然后将eth0网卡上的IP和路由信息全部转移到网桥上。(如果有多块网卡,你需要在想要发送网络流量的那块上进行这个操作。)

如果你使用DHCP服务获取IP地址,首先需要停掉在物理网卡(如eth0)上监听的DHCP客户端,然后在新创建的网桥(如breth0)上启动监听。

根据你的虚拟机的不同,你需要把以上操作设置到启动脚本中。

例如你的虚拟机运行Debian/Ubuntu,可以参考 openvswitch-switch.README.Debian 。如果虚拟机运行RHEL系统,参考 README.RHEL

启动Open vSwitch网络驱动

Open vSwitch驱动使用了Python的flask模块来监听Docker的网络API调用,也使用了OpenStack的python-neutronclient库。如果你还没有安装他们,请先安装:
easy_install -U pip
pip install python-neutronclient
pip install Flask

执行openrc文件:
. ./openrc.sh

启动网络驱动,并在询问时提供你的OpenStack租户密码:
ovn-docker-underlay-driver --bridge breth0 --detach

接下来,你可以使用上文在Overlay模式中介绍的命令来使用Docker了。

供多关于OVN架构的细节,请通过 man ovn-architecture 参考。

原文链接:How to Use Open vSwitch with Docker(翻译:刘思贤)

原文发布时间为:2016-04-09
本文作者:starlight36
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:在Docker中使用Open vSwitch创建跨主机的容器网络
目录
相关文章
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1037 108
|
4月前
|
网络协议 Linux 虚拟化
配置VM网络:如何设定静态IP以访问主机IP和互联网
以上就是设定虚拟机网络和静态IP地址的基本步骤。需要注意的是,这些步骤可能会因为虚拟机软件、操作系统以及网络环境的不同而有所差异。在进行设定时,应根据具体情况进行调整。
429 10
|
4月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
4月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
498 6
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
664 5
|
6月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
456 16
|
6月前
|
安全 持续交付 Docker
Docker:重塑现代软件交付的容器引擎
Docker:重塑现代软件交付的容器引擎