下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

教您在Docker中使用Open vSwitch

作者:课课家教育     来源: http://www.kokojia.com点击数:1229发布时间: 2017-10-18 10:28:55

标签: Open vSwitchDocker云计算

  欢迎各位阅读本篇文章,Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现 虚拟化。本篇文章讲述了教您在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)。我们可以通过OVN(Open vSwitch virtual network)来将Docker的网络和Open vSwitch结合起来。

教您在Docker中使用Open vSwitch_Open vSwitch_Docker_云计算_课课家教育

  简介

  对于OVN和Docker的多主机网络(multi-host networking),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来提供容器网络。在这个模式下,用户可以创建逻辑网络,并且让运行在虚拟机中的容器、独立的虚拟机(没有容器运行在其中)和物理机器连接到同一个逻辑网络上。这是一种多租户、多主机的解决办法。

  在overlay模式下,OVN可以为运行跨主机的容器们提供一个逻辑网络。这是一种单租户(是否能扩展到多租户取决于安全特性)、多主机的解决办法。在这种模式下,你并不需要预创建好的OpenStack。

  值得注意的是,用户必须在他想要运行容器的虚拟机或主机上安装并运行Open vSwitch。

  Overlay 模式

  Overlay模式下,需要Open vSwitch 2.5版本或后续版本的支持。

  1、启动核心模块

  OVN架构中会有一个核心的模块来存储网络信息。因此你需要在你其中一台主机(IP地址为$CENTRAL_IP,并且已经安装和启动了Open vSwitch)上启动相关的核心服务。

  首先我们让ovsdb-server监听一个TCP端口:

  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

  2、一次性配置

  在每一个你打算创建容器的主机上,你需要运行以下的命令(如果你的OVS数据库被清空,你需要再次运行这个命令。除此之外,重复运行这个命令都是没有任何影响的)。

  其他的主机可以通过$LOCAL_IP地址来访问到这个主机,它就相当于本地通道的端点。

  $ENCAP_TYPE是指用户想使用的通道的类型。它可以是”geneve“或者”stt“。(注意,你的内核需要支持以上两个类型,用户可以通过运行以下命令来检测内核是否支持以上类型:"llsmod | 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

  3、启动Open vSwitch网络驱动

  在默认情况下,Docker使用Linux网桥,但它支持外扩展。为了替换Linux网桥,我们需要先启动Open vSwitch驱动。

  Open vSwitch驱动使用了Python Flask模块来监听Docker的网络API请求。因此,用户需要先安装Python 的Flask模块。

  /usr/share/openvswitch/scripts/ovn-ctl start_controller

  在每一个你想要创建容器的主机上启动Open vSwitch驱动:

  ovn-docker-overlay-driver --detach

  Docker内部包含了一些模块,这些模块拥有类似于OVN的逻辑交换机和逻辑端口的概念。请读者仔细阅读Docker的文档来查找相关的命令。这里我们给出了一些案例:

  1)创建用户自己的逻辑交换机

  下面的命令创建了一个名为”foo“的逻辑交换机,它的网段为”192.168.1.0/24”:

  NID=`docker network create -d openvswitch --subnet=192.168.1.0/24 foo`

  2)显示已有逻辑交换机

  docker network ls

  你也可以通过以下命令从OVN的northbound数据库中查找到这个逻辑交换机:

  ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lswitch-list

  3)Docker创建逻辑端口,并且将这个端口附加到逻辑网络上

  比如说,将一个逻辑端口添加到容器busybox的“foo”网络上:

  docker run -itd --net=foo --name=busybox busybox

  4)显示所有的逻辑端口

  Docker现在并没有一个CLI命令来罗列所有的逻辑端口,但是你可以从OVN的数据库中找到它们:

  ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lport-list $NID

  5)用户也可以创建一个逻辑端口,并将它添加到一个运行中的容器上:

  docker network create -d openvswitch --subnet=192.168.2.0/24 bar

  docker network connect bar busybox

  用户可以删除逻辑端口,或者将它们从运行容器上分离出来:

  docker network disconnect bar busybox

  6)用户也可以删除逻辑交换机:

  docker network rm bar

  Underlay模式

  在这个模式下,OVN要求用户预安装好OpenStack。

  1、一次性配置

  一个OpenStack的租户创建了一个虚拟机,这个虚拟机拥有单张或多张网卡。如果租户想要发送虚拟机中容器的网络包,他需要获取这些网卡的port-id。Port-id可以通过以下命令获得:

  nova list

  然后运行:

  neutron port-list --device_id=$id

  在虚拟机中,下载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

  2、创建Open vSwitch网桥

  如果用户的虚拟机只有一个以太网接口(比如说eth0),你需要将这个设备作为一个端口加入到Open vSwitch的”breth0”网桥上,并且移除它的IP地址,将其他相关的信息转移到这个网桥上。(如果有多个网路接口,用户自己创建Open vSwitch网桥,并且添加接口到网桥上)

  如果你使用DHCP来获取IP地址,你需要关闭监听eth0的DHCP客户端,并且开启一个监听Open vSwitch breth0网桥的DHCP客户端。

  你可以让以上的步骤持久化,比如说你的虚拟机是Debian/Ubuntu,你可以参考 openvswitch-switch.README.Debian,如果你的虚拟机基于RHEL,你可以阅读 README.RHEL完成持久化。

  3、开启Open vSwitch网络驱动

  Open vSwitch驱动使用了Python Flask模块来监听Docker的网络API调用。这个驱动还使用了OpenStack的python-neutronclient库。因此,如果你的主机还没有安装Python Flask或者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命令了。请阅读“man ovn-architecture”来理解OVN的技术细节。

  小结:Docker起源

  Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言并遵从Apache2.0协议开源。

Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎

  Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是 Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。

  一款开源软件能否在商业上成功,很大程度上依赖三件事 - 成功的 user case(用例), 活跃的社区和一个好故事。 dotCloud 自家的 PaaS 产品建立在 docker之上,长期维护且有大量的用户,社区也十分活跃,接下来我们看看docker的故事。

  环境管理复杂 - 从各种OS到各种中间件到各种app, 一款产品能够成功作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对。

  云计算时代的到来 - AWS的成功, 引导开发者将应用转移到 cloud 上, 解决了硬件管理的问题,然而中间件相关的问题依然存在 (所以openstack HEAT和 AWS cloudformation 都着力解决这个问题)。开发者思路变化提供了可能性。

  虚拟化手段的变化 - cloud 时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性。然而无论是KVM还是Xen在 docker 看来,都在浪费资源,因为用户需要的是高效运行环境而非OS, GuestOS既浪费资源又难于管理, 更加轻量级的LXC更加灵活和快速

  LXC的移动性 - LXC在 linux 2.6 的 kernel 里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可迁移性,决定其构建出的环境难于迁移和标准化管理(相对于KVM之类image和snapshot的概念)。docker 就在这个问题上做出实质性的革新。这是docker最独特的地方。

Docker面对上述几个问题

  Docker面对上述几个问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。

  这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。

  小结:容器是完全使用 沙箱机制,相互之间不会有任何接口。相信最后大家阅读完毕本篇文章,肯定学到了不少知识吧?其实大家私下还得多多自学,当然如果大家还想了解更多方面的详细内容的话呢,不妨关注课课家教育平台,在这个学习知识的天堂中,您肯定会有意想不到的收获的!

赞(17)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程