• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > 利用OpenVSwitch在多台主机上部署Docker的教程

利用OpenVSwitch在多台主机上部署Docker的教程

作者:sean 字体:[增加 减小] 来源:互联网

本文主要包含Linux,Docker,OpenVSwitch等服务器相关知识,sean 希望可以进行参考

【编者的话】当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛。在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂。嗯,是的,本文用到了 OpenVSwitch。

运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器。这台主机可以是Linux服务器,也可以是Mac(借助类似boot2docker的项目)。

在多台主机上运行却是另外一回事……

可选方案:

    分别在每台主机上运行Docker,在公网或内网网卡上暴露端口以便容器间相互通讯。这可能比较麻烦,而且会引发安全问题。
    运行类似Weave的中间层方案来完全地抽象网络。这个项目前景不错,不过还太年轻,尚未与compose(之前的fig)或maestro-ng这类编排工具整合。
    运行类似Deis或Flynn的Docker多主机一站式方案。这可能不在你的考虑范围内。
    在主机间的网状网络中创建一个共享网桥,让Docker服务在那运行容器。这听起来有点复杂,不过……本文中我们将看到这可以非常容易地完成!
201533192619750.jpg (720×540)概述

基本上,我们将执行以下步骤:

  •     在每台服务器上安装Docker;
  •     在每台服务器上安装OpenVSwitch;
  •     自定义网络设置用以自动在主机间创建网桥/隧道(在每台服务器的/etc/network/interfaces里);
  •     自定义每个Docker服务配置,只处理docker0 IP范围的一小部分,防止新容器的IP地址发生重叠。


就是这样。重启服务或重启服务器后,你将获得一个具备连接冗余(link redundancy)的全网状网络,Docker服务可以在专用的IP范围(不会重叠)上运行容器,并且不需要在公网或内网网卡上暴露所有端口就能互联。很棒,对么?
技术

简单列一下我们用到的技术:

  •     Docker:嗯……这是篇关于Docker与网络的文章,所以……
  •     OpenVSwitch:非常棒的虚拟网络交换机项目,伸缩性非常好,根据本指南,你可以运行“任意”规模的网络。


我们将假定服务器运行的是Ubuntu Server 14.04.02 LTS x64,对于其它系统,你可能需要修改下面提供的各项配置。
安装
Docker

无需多言,遵循官网提供的指南就行。稍后我们将深入其配置,以便运行于服务器上的不同Docker服务可相互协作。
OpenVSwitch

糟糕的是,默认仓库里OpenVSwitch安装包不可用(或过期了),我们需要自己构建.deb文件(一次),然后分发给不同主机。为了保持生产机的整洁,可另外找台小主机来安装开发包,并构建安装包。

OpenVSwitch GitHub上有详细的构建手册。

执行下列命令来构建安装包(新版请按要求修改):

#获取最新存档
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz
tar xzvf openvswitch-2.3.1.tar.gz
cd openvswitch-2.3.1

#安装依赖
sudo apt-get install -y build-essential fakeroot debhelper \
          autoconf automake bzip2 libssl-dev \
          openssl graphviz python-all procps \
          python-qt4 python-zopeinterface \
          python-twisted-conch libtool

# 构建(不使用并行检查)
DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary

# 得到最新deb文件并复制到某处
cd ..
ls -al *deb


现在你有了新的.deb安装包,接下来将其推送并安装到所有主机上。

# 复制包到各主机并ssh登录
scp -r *deb user@remote_host:~/.
ssh user@remote_host

# 安装一些依赖(后面需要)并安装包
sudo apt-get install -y bridge-utils
sudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb \
     openvswitch-switch_2.3.1-1_amd64.deb

 
配置
网络

你可以使用OpenVSwitch提供的不同命令行工具来构建网状网络(比如ovs-vsctl),不过Ubuntu提供了一个辅助工具让你可以通过/etc/network/interfaces文件定义网络。

假定三台主机:1.1.1.1、2.2.2.2和3.3.3.3,可以通过上述IP相互ping通,它们是在公网或内网上并不重要。host1的/etc/network/interfaces大概如下。

...
# eth0、eth1和lo配置
...

# auto:为了有效地在主机启动时启动它
# br0=br0:防止在`ifquery --list`时被找到
auto br0=br0
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports gre1 gre2
ovs_extra set bridge ${IFACE} stp_enable=true
mtu 1462

# 没有auto,这是ovs的一个额外配置
# 两台主机的gre名字必须相符
allow-br0 gre1
iface gre1 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=2.2.2.2

allow-br0 gre2
iface gre2 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=3.3.3.3

# auto:启动时创建
# 定义docker要使用的docker0,并(在可用时)连接到到OpenVSwitch创建的br0网桥上
# 每台主机需要使用不同的IP地址(不要相互冲突!)
auto docker0=docker0
iface docker0 inet static
address 172.17.42.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
mtu 1462


在其它主机上要对这个配置上做些调整:remote_ip的IP地址要相互配对。

201533192719156.jpg (720×540)几点说明:

  •     生成树协议(Spanning Tree Protocol):如果应用该配置,将在3台服务器中创建一个网络回路,这可不行。给br0网桥添加stp_enable=true将确保一些gre隧道被切断。同时确保网状网络的冗余,允许网络在其中一台主机下线时恢复。
  •     MTU:这是一项关键设定!没有这项,你可能获得一些意外“惊喜”:网络看起来工作正常(比如可以ping),但无法支持大数据包(比如BW测试中的iperf、大数据量请求或简单的文件复制)。注意,GRE隧道需要封装多种协议:
  •         以太网:14字节——我们说的是网桥间的第2层;
  •         IPv4:20字节——容器/主机间通讯;
  •         GRE:4字节——因为,嗯,这是个GRE隧道;
  •         也就是物理网卡MTU减去38字节,结果是1462(基于常规的1500 MTU网卡)。
  •     在auto定义中使用“=”:对于具有固定IP的服务器这不是必需的,但有些云服务商(这里就不说是谁了……Digital Ocean(译者:软广再次乱入))使用了一个依靠ifquery --list --allow auto的init服务(/etc/init/cloud-init-container.conf)。不加上“=”号将包含OpenVSwitch网卡,并延迟整个启动过程直到init脚本失败并超时。
  •     docker0网桥:每台服务器都需要自己的IP地址(比如172.17.42.1、172.17.42.2)。由于docker0网桥处在br0网桥之上,它们将(也应该!)可以相互连接。想象一下,要解决IP冲突会有多乱……这也是为什么我们要在启动时定义它,而不依赖docker服务来为我们创建这个网桥。
  •     GRE隧道:你可以从gre0(而不是gre1)开始,它能完美工作。但由于某种原因,在输入ifconfig时你可以看到gre0,却看不到其他隧道。这可能是gre0作为虚拟网卡的一个副作用。从gre1开始将让所有的gre隧道对ifconfig“隐身”(好过于只能看见一个)。别着急,你还是可以使用ovs-vsctl命令显示隧道/网桥。
  •     3台以上主机:你可以遵循相同的逻辑,并且:
  •         添加额外的隧道(iface greX)来连接新主机。
  •         在br0网桥定义中更新ovs_ports以包含interfaces文件中定义的所有gre隧道。
  •         聪明点……不要将每台服务器跟其他主机一一链接……STP收敛(convergence)将需要更长的时间,并且无法提供任何除了多重额外链路冗余之外的有用价值。


如果现在重启服务器,你将拥有一个具备冗余的网状网络,你可以运行以下命令来测试:

  •     从host1上ping 172.17.42.2或其他IP;
  •     在主机上运行iperf,通过ifconfig查看使用中的链接;
  •     在ping第三台主机时停止“中间”那台,查看网络收敛(通过STP)时ping中断了几秒钟。


201533192746734.jpg (720×540)

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 虚拟机下Linux系统Hadoop单机/伪分布式配置:Hadoop2.5.2+Ubuntu14.04(半原创),hadoophadoop2.5.2
  • KVM崛起 企业虚拟化的新选择
  • IBM KVM三特点:Linux、虚拟化与开源
  • 浅谈openstack中使用linux_bridge实现vxlan网络
  • Linux下Docker CE使用从包中安装的方式详解
  • Docker基础知识之Linux namespace图文详解
  • Linux 开发环境中为VirtualBox安装增强功能
  • Linux中docker的使用方法讲解
  • Linux新建用户并允许docker及docker基本命令
  • VMware下配置Linux系统局域网和外网访问图文教程

相关文章

  • Docker Cloud实现部署应用操作详解
  • 基于openstack安装部署私有云详细图文教程
  • KVM虚拟化技术之virt-manager使用及KVM虚拟化平台网络模型介绍
  • OpenStack 组件的更新教程
  • 记一次Docker生产环境搭建的方法
  • 详解MAC OSX Docker开发环境搭建
  • Docker实践—CentOS7上部署Kubernetes详解
  • 详解docker 允许主机ssh连接到docker容器中
  • 详解ASP.NET Core Docker部署
  • Docker 数据卷及数据容器详细介绍及示例

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • centos 6.6 安装 KVM 虚拟机的方法
    • Docker构建ELK Docker集群日志收集系统
    • 使用Docker开发python Web 应用
    • Docker push镜像失败解决方法
    • 详解docker容器分配静态IP
    • 详解使用docker搭建kafka环境
    • KVM崛起 企业虚拟化的新选择
    • 详解vmware14Pro中ubuntu系统界面太小的问题解决
    • VM12中CentOS7以NAT的方式连接网络的方法
    • 一次因为数据问题引起的reduce被卡住streaming作业问题排查,reducestreaming

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有