使用OpenStack管理Docker容器(二)

jopen 9年前發布 | 47K 次閱讀 Docker

本文將講述如何使用OpenStack創建并管理Docker,有3種流行的使用方法,使用的分別是Nova Docker驅動,Heat Docker插件,以及Magnum。這篇文章分成2部分,第一部分,將主要介紹Nova Docker驅動的用法,第二部分,是關于Heat Docker插件和Magnum。這是序列文章的第二部分,即最后一部分。

這篇文章是之前的那篇 《如何使用OpenStack管理Docker容器》的后續,在這篇文章中,我將使用OpenStack Docker的Heat plugin,以及Magnum。
下面是一些Nova Docker驅動目前所不具備的功能:

  1. 傳遞環境變量
  2. 連接容器
  3. 指定volumes
  4. 編排和調度容器
    Heat Docker插件可以解決1-3的問題,第4個問題無法完美解決。下面是我在OpenStack Docker wiki上查找的,關于Heat的架構示意圖。
     使用OpenStack管理Docker容器(二)

    • 這里不涉及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架構示意圖
     使用OpenStack管理Docker容器(二)

    • 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 with Docker-part 2 (翻譯:洪國安 審校:李穎杰)

    ============================================
    譯者介紹
    洪國安,編程愛好者,目前是一名大三學生,希望通過幫社區翻譯,提高自己的知識面。

    來自:http://dockone.io/article/476
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!