在Docker中使用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创建跨主机的容器网络

时间: 2024-10-29 19:36:22

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

容器服务是如何做到的跨主机的容器间通信?

容器间网络互通 容器服务为集群中每个容器提供集群内可达的独立IP,容器之间就可以通过这个独立的IP互相通信,而不需要通过NAT暴漏到主机端口,解耦了与宿主机IP的依赖,因此避免了做NAT的时候多个容器端口冲突的问题.而如何实现跨主机的容器通信,在不同网络模型下面的实现方案如下: VPC网络模式下: 专有网络(Virtual Private Cloud,简称VPC),帮助您基于阿里云构建出一个隔离的网络环境.您可以完全掌控自己的虚拟网络,包括选择自有 IP地址范围.划分网段.配置路由表和网关等.容

如何在Docker中使用Open vSwitch

Open vSwitch是一个虚拟交换软件,主要用于虚拟机VM环境,提供网络的虚拟化.本篇文档重点介绍如何在Docker中使用Open vSwitch. 这个文档描述了如何在Docker(大于或等于1.9.0版本)中使用Open vSwitch.我们假设你已经安装好了Open vSwitch和Docker.请没有安装好的读者可以根据INSTALL.md和www.docker.com的说明来进行安装. Docker 1.9.0开始支持多主机网络(multi-host networking).我们可

如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)

除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络. Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan.overlay 和 macvlan 用于创建跨主机的网络,我们后面有章节单独讨论. 我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如: 查看一下当前 host 的网络结构变化: 新增了一个网桥 br-eaed97dc9a77,这里 e

在Docker中创建应用

本文讲的是在Docker中创建应用,[编者的话]下面内容是在基于Docker,用node.js开发和部署网络应用过程中获得的经验和教训. 本例中,将从头开始开发一个基于Docker的socket.io聊天例子,一直到可以实用,因此希望可以从这些教训中学到什么,例如: 使用Docker开始一个节点应用 不要做"root"敢死队成员 用binds使得test-edit-reload流程更短 在容器内管理node_modules使得重建更快(有一个窍门) 使用npm shrinkwrap确保

Android中在SQLite数据库创建的触发器能跨数据库吗?

问题描述 比如有两个APK,第一个APK的数据库名为database1,有一张表table1,在第二个APK中有一个数据库database2,有一张表table2,其中table1和table2的结构是完全一样的,我想实现创建一个触发器,在向table1 insert一条记录的时候,通过触发器项table2插入一条相同的记录,这能实现吗?要怎么才能实现? 解决方案 触发器是一个数据库中的概念,没办法跨数据库,替代方案有Intent Broadcastrpc共享进程(这个方法请参考Phone和Te

Docker网络管理及容器跨主机通信(四)

1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个.容器将不会虚拟出自己的网卡,IP等,而是使用宿主机的IP和端口,也就是说如果容器是个web,那直接访问宿主机:端口,不需要做NAT转换,跟在宿主机跑web一样.容器中除了网络,其他都还是隔离的. container,--net=container:NAME_or_ID,与指定的容器共同使用网络,也没

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ping bbox1: 可见 overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务. 下面我们讨论一下 overlay 网络的具体实现: docker 会为每个 overlay 网络创建一个独立的 network namespace,其中会有一个 linux brid

在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel. 配置 Docker 连接 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd/system/docker.service,设置 --bip 和 --mtu. 这两个参数的值必须与 /run/flannel/subnet.env 中 FLANNEL_SUBNET 和FLANNEL_MTU 一致. 重启 Docker daemon. systemctl daemon-reloa

跨主机使用 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(77)

上一节我们在 docker1 上的 MySQL 容器中使用了 Rex-Ray volume mysqldata,更新了数据库.现在容器已经删除,今天将演示在 docker2 中重新使用这个卷. 在 dokcer2 上执行如下命令,启动 MySQL 容器: docker run --name mydb_on_docker2 -v mysqldata:/var/lib/mysql -d mysql 新容器也使用相同的卷 mysqldata,不过这次不需要指定环境变量 MYSQL_ROOT_PASSW