您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
使用OpenStack管理Docker容器
 
译者:洪国安 来源:简单之美 发布于 2016-1-14
  3234  次浏览      15
 

文将讲述如何使用OpenStack创建并管理Docker,有3种流行的使用方法,使用的分别是Nova Docker驱动,Heat Docker插件,以及Magnum。这篇文章分成2部分,第一部分,将主要介绍Nova Docker驱动的用法。

在这篇文章中,我将介绍一些不同的方法,这些方法是关于OpenStack如何创建,以及管理Docker容器。三种主要的方法分别使用的是 Nova Docker驱动,Heat Docker插件,以及Magnum。Magnum比较新颖,现在仍在开发中。OpenStack是开源云编排软件,Docker则是一个开源的容器管理 软件。文章中,我假设用户已经熟悉OpenStack和Docker。如果不熟悉的话,那么网上有许多资料可以用来学习OpenStack和 Docker,我的博客也可以找到关于 OpenStack和 Docker的文章。

Nova Docker Driver

Nova通常用来管理虚拟机。在这种方法中,Nova驱动将会进行扩展,以便用来催生Docker容器。接下来是Nova Docker wiki里面提及的架构示意图。

为了催生容器,Nova计算驱动将指向Docker。

Nova Docker Virt驱动使用http api与Docker进行对话

Docker镜像保存在Docker Registry中,并且从这里暴露给Glance,Nova将会使用Docker Registry创建容器。

Nova Docker 驱动与Devstack

我按照 wiki里面提到的步骤,在OpenStack Devstack kilo下获取Nova Docker驱动。为了使其可以在我的系统下正常工作,要进行一些镜像调整。我在Virtualbox下使用Ubuntu 14.04进行下列测试,下面是一些主要步骤:

安装Docker

安装Nova Docker插件

进行Devstack的堆叠

安装Nova-Docker rootwrap过滤器

应用Kilo解决方案

创建Docker镜像,并将其暴露给Glance

由Nova催生Docker容器

1. 安装Docker

Docker可以使用 这里提到的步骤进行安装。下面是我系统上使用的版本,我已经开启用户访问,这样我就不需要在每个Docker命令中运行sudo。

$ docker --version
Docker version 1.6.2, build 7c8fca2

2. 安装Nova Docker插件

wiki里面提到的步骤可以出色的工作。当我在查看驱动时,我使用的是稳定版本的kilo。

git clone -b stable/kilo https://github.com/stackforge/nova-docker.git

下面是安装成功后,Nova Docker插件的版本号

$ sudo pip list | grep nova-docker
nova-docker (0.0.1.dev197)

3. 进行Devstack的堆叠

首先,检查Devstack Kilo的代码库。

git clone -b stable/kilo https://github.com/openstack-dev/devstack.git

我稍微修改了local.conf文件,修改后的版本在 这里。接下来是进行堆叠。

cd devstack;./stack.sh

4. 安装Nova-Docker rootwrap过滤器

wiki里面提到的步骤可以出色的工作。

sudo cp nova-docker/etc/nova/rootwrap.d/docker.filters \
/etc/nova/rootwrap.d/

我稍微修改了local.conf文件,修改后的版本在 这里。接下来是进行堆叠。

这里有点要特别说明的地方

5. 应用Kilo解决方案

堆叠抛出了下面错误:

2015-06-03 22:28:57.870 ERROR nova.openstack.common.threadgroup
 [req-f89bc2cd-5fcc-42e4-a588-ef92ab101fb3 None None] 'module' object has no attribute 'DOCKER'
n-cpu.log.2015-06-03-222501:2015-06-03 22:28:57.870 TRACE nova.openstack.common.threadgroup AttributeError: 'module' object has no attribute 'DOCKER'

在OpenStack的 邮件列表讨论过这个问题,解决方法是编辑Docker驱动文件。在我的案例中,文件位于“/usr/local/lib/python2.7/dist-packages/novadocker/virt/docker“。

6. 创建Docker镜像,并将其暴露给Glance

我首先使用 “docker pull nginx"命令,从Docker Hub抓取Nginx容器

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
nginx latest a785ba7493fd 2 weeks ago 132.9 MB

接下来将镜像保存到Glance。

docker save nginx |  glance image-create --is-public=True --container-format=docker --disk-format=raw --name nginx

现在,查看Glance镜像列表,我们可以看见Docker镜像已经和其他实例镜像在一起了,并且Nginx的类型是Docker。

7. 由Nova催生Docker容器

我们使用Glance里面的镜像,创建nginx容器。Flavor事实上不是那么重要。

nova boot --flavor m1.small --image nginx nginxtest

查看主机里面正在运行的Docker容器。

$ docker ps
CONTAINER ID IMAGE COMMAN CREATED STATUS PORTS NAMES
4f514bc59a41 nginx:latest "nginx -g 'daemon of 12 seconds ago Up 11 seconds nova-931335f8-ac5c-4c28-967b-25b9474ab2de

列出Nova实例:

$ nova list
+-------------+-----------+--------+-------+--------+----+
| ID | Name | Status | Task State | Power State | Networks |
+--------------+-----------+--------+-----+-----+----------+
| 931335f8-ac5c-4c28-967b-25b9474ab2de | nginxtest | ACTIVE | - | Running | private=10.0.0.5 |
+-----------+-------+------+-------+-----+-------+

检查nginx是否正常工作:

$ curl 10.0.0.5Welcome to nginx!
|
|

这是序列文章的第二部分,即最后一部分。

这篇文章是之前的那篇 《如何使用OpenStack管理Docker容器》的后续,在这篇文章中,我将使用OpenStack Docker的Heat plugin,以及Magnum。

下面是一些Nova Docker驱动目前所不具备的功能:

1. 传递环境变量

2. 连接容器

3. 指定volumes

4. 编排和调度容器

Heat Docker插件可以解决1-3的问题,第4个问题无法完美解决。下面是我在OpenStack Docker wiki上查找的,关于Heat的架构示意图。

这里不涉及Nova。OpenStack Heat在主机上使用Docker插件与Docker代理对话。

主机是由VM催生的。VM可以由Nova催生,也可以让Heat使用Nova驱动催生。

这里不需要Glance。因为容器镜像可以保存在Docker Registry。

这种Heat方法允许我们指定环境变量,连接容器,指定volumes,以及编排运行Docker的主机。

使用Heat插件

Heat插件与OpenStack Kilo一同工作时,我遇到了一些问题。因为OpenStack Icehouse可以完美地工作,所以我将持续地使用OpenStack Icehouse。我参考 wiki上的方法,在Devstack上使用OpenStack Icehouse集成Heat插件。

我的环境:

在Virtualbox上运行Ubuntu 14.04,这个Virtualbox之前已经安装了Devstack Icehouse发行版。我的localrc文件在 这里。localrc使用Nova网络而不是Neutron。

进行堆叠并安装Heat插件:

进行堆叠。成功堆叠后,我按照wiki提及的方法,安装Heat docker插件。插件安装完成后,需要重启Heat engine service。打开screen会话,进入Heat service的screen会话,关闭会话(ctrl-c),并重启这个特殊的service。完成重启Heat engine后,我们可以检查插件是否正确安装,并运行。

$ heat resource-type-list | grep Docker
| DockerInc::Docker::Container

使用Heat启动本地容器

我 们将在主机上运行Docker代理,然后,使用OpenStack Heat插件创建容器。为了完成上述目标,第一步是在主机上安装Docker,并允许http访问,以便让Docker客户端进行连接。关于Docker的安装,使用的是 这里的步骤。默认下,Docker不允许额外的http访问,为了让Docker在端口2376上允许额外的http访问,执行下列命令:

$ sudo /usr/bin/docker -d --host=tcp://0.0.0.0:2376

下面是一个简单的Heat的YML文件,这个文件是用来在本地创建nginx容器。

heat_template_version: 2013-05-23
description: >
Heat template to deploy Docker containers to an existing host
resources:
nginx-01:
type: DockerInc::Docker::Container
properties:
image: nginx
docker_endpoint: 'tcp://192.168.56.102:2376'

使用上述模板,创建Heat堆栈。

$ heat stack-create -f ~/heat/docker_temp.yml nginxheat1

检查堆栈是否创建成功:

$ heat stack-list
+--------------------------+---------+------+---------+
| id | stack_name | stack_status | creation_time |
+--------------------------+---------+------+---------+
| d878d8c1-ce17-4f29-9203-febd37bd8b7d | nginxheat1 | CREATE_COMPLETE | 2015-06-14T13:27:54Z |
+-----------------+--------+---------+---------

检查容器是否在本地运行:

$ docker -H :2376 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
624ff5de9240 nginx:latest "nginx -g 'daemon of 2 minutes ago Up 2 minutes 80

到这里,我们就可以在本地容器上访问web服务器。

使用Heat启动远程容器

我们将使用Nova创建一个VM,开启VM上的Docker代理,然后在VM上,使用OpenStack Heat插件创建容器。

首先,创建一个Fedora镜像,并上传到Glance,我所使用的步骤来自 这里,完成上述步骤后,查看Glance里面的镜像。

$ glance image-list
+----------------+---------+------+----+-----------+------+
| ID | Name | Disk Format | Container Format | Size | Status |
+-------------+--------+-------+-------+-----------+--------+
| 17239070-5aef-4bab-85df-1f9f72b6370b | cirros-0.3.1-x86_64-uec | ami | ami | 25165824 | active |
| ea6eb351-7268-4b2e-91cd-806a67c4e9fe | fedora-software-config | qcow2 | bare | 610140160 | active |
+--------------------+-------------+-------+-------

接下来,我使用下面的脚本,创建ssh需要的密钥,并设置合适的安全组。

# Create key and upload
ssh-keygen
nova keypair-add --pub-key ~/.ssh/id_rsa.pub key1
# Permit ICMP (ping):
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
# Permit secure shell (SSH) access:
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
# Permit 2375 port access (Docker endpoint):
nova secgroup-add-rule default tcp 2375 2375 0.0.0.0/0

现在,我们使用Nova创建Fedora VM。

nova boot --flavor m1.medium --image fedora-software-config --security-groups default --key-name key1 --m

为了下载Docker镜像,这个实例需要额外的网络连接。为此,我们需要在与Nova联网时调整iptables,以便创建NAT filter。第一条规则是删除默认的filter,第二条是创建eth0地址的filter。

sudo iptables -t nat -D nova-network-snat -o br100 -s 10.0.0.0/24 -j SNAT --to-source 
sudo iptables -t nat -A nova-network-snat -o br100 -s 10.0.0.0/24 -j SNAT --to-source

检查实例的创建:

$ nova list
+-------------+------------+--------+--------+----+-------+
| ID | Name | Status | Task State | Power State | Networks |
+-----------------+------------+--------+-----+-----+----------+
| ab701808-98fb-4cba-907f-663fd762cf2a | fedoratest | ACTIVE | - | Running | private=10.0.0.2 |
+----------------+-----+----+-------+-----+-----方

为了登录Fedora VM,我们需要使用密钥,这个密钥是创建VM时使用的。

ssh -i ~/.ssh/id_rsa fedora@

fedora镜像上已经创建完成了,并且安装了Docker代理。为了可以与OpenStack Heat对话,我们需要启动Docker,并让Docker监听2375端口。

sudo cp /usr/lib/systemd/system/docker.service /etc/systemd/system/
Edit /etc/sysconfig/docker:
OPTIONS=--host=tcp://0.0.0.0:2375
sudo systemctl start docker.service

现在,我们可以在远程VM上创建容器了。现在,为了在远程VM上创建nginx容器,我们要指定Heat模板。docker文件的末尾是远程VM的ip地址。

heat_template_version: 2013-05-23
description: >
Heat template to deploy Docker containers to an existing host
resources:
nginx-01:
type: DockerInc::Docker::Container
properties:
image: nginx
docker_endpoint: 'tcp://10.0.0.2:2375'

使用上面的模板开启Heat堆叠。

$ heat stack-create -f docker_stack1.yml docker_stack2

事前,我们需要抓取nginx的Docker镜像。利用Heat,我们可以使这个过程自动化。

现在,我们可以检查到容器已经在VM上创建了。

[fedora@fedoratest ~]$ docker -H :2375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18a7ed8f5b00 nginx:latest "nginx -g 'daemon of About a minute ago Up About a minute 80

这里有一份Heat模板,这个模板文件可以创建VM,抓取Apache和Mysql容器,并连接它们。下面是另外一份优秀的 wiki,这份wiki为Docker容器详细地解释了Heat模板,并列出了一个优秀的例子。不幸的是,在我的Devstack环境下,这些脚本无法正常工作。实例催生了,但容器创建失败。我花了许多时间,但仍无法解决。

OpenStack Magnum

OpenStack Heat插件解决了许多问题,这些问题是Nova Docker插件无法解决的。但是,它仍然无法解决动态编排和调度。Magnum是一个通用的容器管理解决方案,和其他容器技术一样,OpenStack 开发的这个方案是可以用来管理Docker的。目前,Magnum支持Kubernetes和Docker。无论是在Kubernetes,还是 Docker上,主机集群都可以被创建,并且在使用特殊的聚类算法和容器情况下,容器可以列入集群。Magnum仍然处在早期阶段,第一版本已经在几个月 前和OpenStack kilo一起发行。

下面是Magnum的wiki上提及的Magnum架构示意图

Magnum在任何需要管理容器的地方,使用其他的OpenStack组件,例如Nova, Heat, Neutron, Glance和Keystone 。

Nova用于创建micro VM实例,容器在其顶部运行,而Docker实例这时运行在每个micro VM实例上。

Heat用于整体编排,在使用Kubernetes的情况下,heat会创建Kubernetes代理,同步控制器,而对于Docker, Heat则会创建Docker Swarm集群,以及Swarm代理。

所涉及的步骤是创建bay-model(Kubernetes,Docker),以及bay和容器的创建。

我试图按照 这里提及的步骤,去创建Magnum集群。步骤一直进行到创建集群这里,但无法成功地完成这一步骤,总是卡在“CREATE_IN_PROGRESS”,我尝试过Kubernetes和Docker的bay-model,但仍没有成功。如果有人可以完成这个步骤,请告诉我。

容器编排仍然在发展中,并且有多种解决这一问题的技术仍在开发过程中。Docker正在开发自己的编排方案。对于那些已经在使用OpenStack的开发 者,Magnum是一个比较完整的解决方案,因为它与其他OpenStack组件整合得较好。我觉得随着时间的推移,最好的技术会生存下来的。

   
3234 次浏览       15
 
相关文章

云计算的架构
对云计算服务模型
云计算核心技术剖析
了解云计算的漏洞
 
相关文档

云计算简介
云计算简介与云安全
下一代网络计算--云计算
软浅析云计算
 
相关课程

云计算原理与应用
云计算应用与开发
CMMI体系与实践
基于CMMI标准的软件质量保证
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

专家视角看IT与架构
软件架构设计
面向服务体系架构和业务组件的思考
人人网移动开发架构
架构腐化之谜
谈平台即服务PaaS
更多...   
相关培训课程

云计算原理与应用
Windows Azure 云计算应用

摩托罗拉 云平台的构建与应用
通用公司GE Docker原理与实践
某研发中心 Openstack实践
知名电子公司 云平台架构与应用
某电力行业 基于云平台构建云服务
云计算与Windows Azure培训
北京 云计算原理与应用