使用OpenStack管理Docker容器(二)
本文將講述如何使用OpenStack創建并管理Docker,有3種流行的使用方法,使用的分別是Nova Docker驅動,Heat Docker插件,以及Magnum。這篇文章分成2部分,第一部分,將主要介紹Nova Docker驅動的用法,第二部分,是關于Heat Docker插件和Magnum。這是序列文章的第二部分,即最后一部分。
這篇文章是之前的那篇 《如何使用OpenStack管理Docker容器》的后續,在這篇文章中,我將使用OpenStack Docker的Heat plugin,以及Magnum。
下面是一些Nova Docker驅動目前所不具備的功能:
- 傳遞環境變量
- 連接容器
- 指定volumes
- 編排和調度容器
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/tcp, 443/tcp trusting_pasteur
到這里,我們就可以在本地容器上訪問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 --max-count 1 fedoratest
為了下載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/tcp, 443/tcp tender_morse
這里有一份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組件整合得較好。我覺得隨著時間的推移,最好的技術會生存下來的。
參考:
- OpenStack heat docker templates – 1,2and3
- OpenStack heat github page
- Magnum wiki
- Magnum github page
- OpenStack Vancouver Magnum presentation
備注: 上面的圖片來自參考文章。
原文鏈接:OpenStack with Docker-part 2 (翻譯:洪國安 審校:李穎杰)
============================================
譯者介紹
洪國安,編程愛好者,目前是一名大三學生,希望通過幫社區翻譯,提高自己的知識面。
來自:http://dockone.io/article/476
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!