忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/11    10« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  »12

OpenStack で Docker イメージを元にインスタンスを作る

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

OpenStack で Docker イメージを元にインスタンスを作る

OpenStack は色々な仮想化基盤をサポートしている。2013年2月リリースの Havana からは Docker をもサポートするようになった。

私が実際に Docker を用いたコンピュートノードを作成し、 Docker イメージを元にインスタンスを作るに際してとった手順や困ったことなどを書き残しておく。

前提

  • 参照しているドキュメントはすべて2016年2月末時点のもの。
    閲覧時点では更新されている可能性がある
  • OpenStack のバージョンは Liberty (2015年10月リリース) を使っている
  • 使ったサーバの OS は Ubuntu 14.04 LTS

Docker のコンピュートノードを作る方法

基本的には Docker - OpenStack の手順に従う。

  1. Docker のコンピュートノードにするノードと GLANCE を入れているノード (多くの場合はコントローラノードだと思われる) に Docker をインストールする。
  2. とりあえず普通にコンピュートノードを作る手順を行う。
    OpenStack Docs にインストールガイドがある。
  3. コンピュートノードを Docker を使ったノードにする。以下はコンピュートノードで実行する。
    1. ユーザ nova に docker に関する権限を付与する
      # usermod -aG docker nova
    2. novadocker (コンピュートノードで docker を使うためのドライバ) をダウンロードしてくる
      $ pip install -e git+https://github.com/stackforge/nova-docker#egg=novadocker
    3. ドキュメントにない手順
      ダウンロードしてきた novadocker のバージョンを適切なものに変更する。
      $ cd src/novadocker
      $ git checkout stable/liberty (Liberty を使っている前提。適宜書きかえること!)
    4. novadocker をインストール
      $ python setup.py install
    5. コンピュートノードで使うドライバを Docker のものにする。
      /etc/nova/ にあるであろう nova-compute.conf を書き換え、
      compute_driver = novadocker.virt.docker.DockerDriver とする。
      (ドキュメントには nova.conf を書き換えよ、とあるがどちらでもよい)
    6. nova の設定を書き換える。/etc/nova/rootwrap.d 内に docker.filter というファイルを作成し、以下の内容を記述する。
      # nova-rootwrap command filters for setting up network in the docker driver
      # This file should be owned by (and only-writeable by) the root user

      [Filters]
      # nova/virt/docker/driver.py: 'ln', '-sf', '/var/run/netns/.*'
      ln: CommandFilter, /bin/ln, root
    7. コンピュートノードを再起動する。
      # service nova-compute restart
  4. GLANCE を入れているノードをセットアップする。
    1. GLANCE の設定を書き換え、 docker イメージを許容するようにする。
      /etc/glance にある glance-api.conf を編集し、つぎのようにする。
      container_formats = ami,ari,aki,bare,ovf,docker
      docker が追加された。
    2. 設定を変えたサービスを再起動する。
      # service nova-scheduler restart
      # service glance-api restart
  5. 準備が整ったので docker イメージを使ってインスタンスを立てる。
    1. 適当なイメージを pull してくる。とりあえず cirros。
      $ docker pull cirros
    2. 得た Docker イメージを GLANCE に登録する。コマンドがドキュメントと若干違うので注意。
      $ docker save cirros | \
      glance image-create --visibilitty public --container-format docker --disk-format raw --name cirros

      なお、Docker イメージ名と GLANCE に登録するイメージ名は一致している必要がある。
    3. ドキュメントにない手順
      登録したイメージのプロパティに加筆を行い、hypervisor_typedocker にする。
      horizon からやると簡単。
  6. horizon からインスタンスを起動する。コマンドで起動しても構わない。

詰まった所1 - 非 Docker インスタンスにインスタンスが立てられてしまう

hypervisor_typedocker にした理由がこれである。なお、非 Docker ノードとは KVM や QEMU 等、Docker でない仮想化基盤を使ったコンピュートノードである。

nova のモジュール nova-scheduler はインスタンス作成リクエストに従い、インスタンスを作成するのにふさわしいコンピュートノードを検索する。この際、 Liberty の nova-scheduler はイメージの種類をコンピュートノードの持つ supported_instances の情報と照らし合わせて確認する (nova-scheduler の filter である ImagePropertiesFilter がこの役割を担っている)

この際、コンピュートノードは Docker をサポートしている旨を発信しているが登録された Docker イメージは自らが Docker イメージであることを主張しない。その為、 ImagePropertiesFilter は Docker を扱えないノードをコンピュートノードの候補から除くことができない。

その結果、Docker をサポートしていない非 Docker ノードに Docker イメージをベースにしたインスタンスを立てようとする。そして、起動に失敗する。

ただし、次のリリースでは確認するプロパティを変更する可能性がある。よく確認すること。

詰まった所2 - エラーで起動に失敗する

コンピュートノードで Docker インスタンスの起動に失敗する。エラーログを確認すると nova.compute.manager AttributeError: 'dict' object has no attribute 'container_format' というメッセージが出ていた。

これは単純な話で、 novadocker のバージョンを最新にしてしまっていたためであった。Liberty を使っているのだから novadocker のバージョンも Liberty に揃えるべきであった。

参考文献

PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R