OpenStackでESXi環境を置き換える

大雑把な手順

  • CentOS 7をインストールする。
  • NetworkManagerをアンインストールする。
  • OpenStack Junoをインストールする。
  • ネットワークを設定する。
  • ISOイメージ+HDD構成できるようにバグを直す。
  • 仮想マシンにOSをインストールする。

このページでは以下の記法をしています。

  • 設定ファイルを作成・編集する場合、ファイル名に続けて内容を示します。
  • すでに存在するファイルに対する編集の場合は、その内容すべてを表してはいません。(書いていない内容はデフォルトです。)
  • すでに存在する設定内容を書き換える場合、書き換え元をコメントアウトする表現をしています。
    例えば、以下のデフォルト設定があり、

    [DEFAULT]
    foo1=bar1
    foo2=old

    これを以下に書き換える場合、

    [DEFAULT]
    foo1=bar1
    foo2=new

    以下で表現します。共通である部分は表現していないことに注意してください。

    [DEFAULT]
    #foo2=old
    foo2=new

  • 目的

    ESXiの代わりにOpenStackを使う。

    私の考えるESXiの代わり、なので、すでにあるOSのクローンを大量に展開する、といったクラウド的な考え方は一切ありません。
    Webから操作できる仮想化のプラットフォームを求めます。

    また、2台以上での環境は構築しません。


    CentOS 7のインストール

    このへん(http://www.centos.org/download/)からダウンロードしてDVDを焼いて、インストールします。

    今回はMinimal ISOを使いました。
    Xはサーバには不要。どっか行け。


    NetworkManagerのアンインストール

    生かしておく理由がないのでアンインストールします。
    邪魔なだけです。(本当に邪魔するのでアンインストール必須。)

    # service NetworkManager stop
    # yum remove NetworkManager

    OpenStack Junoのインストール

    後述するFlatNetworkingを使いたいので、ちょこちょこと指定します。enp2s0は物理インタフェースの名前、physicalはこの物理インタフェースにブリッジするネットワークの名前(お好み)です。

    # yum install -y https://repos.fedorapeople.org/repos/openstack/openstack-juno/rdo-release-juno-1.noarch.rpm
    # yum install openstack-packstack
    # packstack \
        --allinone \
        --os-neutron-ml2-type-drivers=vxlan,flat,gre,vxlan \
        --os-neutron-l2-agent=linuxbridge \
        --os-neutron-lb-interface-mappings=physical:enp2s0 \
        --provision-demo=n

    インストールが無事完了すれば、Webブラウザからログインできるはずです。
    ユーザ名とパスワードは、/root/keystonerc_adminのOS_USERNAMEとOS_PASSWORDを使います。


    novaの設定

    最小限の設定として、nova.confをいじります。

    我が家はローカルネットワーク用のDNSが居るので、ホストに接続するにはホスト名を使います。
    ところが、コンソール表示する際に使うURLはnova.confにIPアドレスで書かれている(packstackが勝手に設定する)ため、JavaScriptでCross Site Accessな制限を受け、正しく動作しません。
    このため、nova.confの設定を直してあげます。

    nova.conf:

    #novncproxy_base_url=http://10.0.0.1:6080/vnc_auto.html
    novncproxy_base_url=http://openstack.local:6080/vnc_auto.html

    ネットワークの設定

    FlatNetworkingの設定をします。

    1. novaの設定を変更します。
      /etc/nova/nova.conf:

      #network_manager=nova.network.manager.FlatDHCPManager
      network_manager=nova.network.manager.FlatManager
      fixed_range=10.1.0.0/24

      FlatDHCPManagerを封印してFlatManagerに変えてやります。OpenStackにIPアドレスを管理させる気は微塵もありませんから、fixed_rangeの値も適当です。
      ちなみにnetwork_manager=の行は最初からある行の隣にでも書きます。fixed_rangeはないので、これは適当なところに書きます。

    2. neutronの設定を変更します。
      /etc/neutron/plugins/ml2/ml2_conf.ini:

      #mechanism_drivers =openvswitch
      mechanism_drivers =linuxbridge

      OpenvSwitchなどという高級なものは不要なので、直ちに退去してもらいます。(neutronも相当に高級だけど)

      /etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini:

      [securitygroup]
      # enable_security_group = True
      enable_security_group = False
      

      iptablesを使ったファイアウォールも切ります。
      セキュリティグループを設定してあげるのがよりよいですが、どうせブリッジするので不要です。

    3. マシンごと再起動します。
      neutron関連サービスの再起動だけでもいけそうですが、面倒を起こすのもイヤなので再起動しましょう。
    4. 新しいネットワークを作成します。Flatを使い、インタフェースにはphysical(–os-neutron-lb-interface-mappingsで指定した名前)、External Network(とお好みでShared)を指定します。
    5. 作ったネットワークにサブネットを定義します。これも適当。ただしDHCPはOFFにしておきます。(念のため。多分関係ないと思いますが……)

    ISOイメージ+HDD構成のバグを直す

    タイトルの通り、バグを直します。
    といってもパッチを当てるだけです。
    https://bugs.launchpad.net/nova/+bug/1379212

    少々乱暴ですが、直接当てます。

    # yum install patch
    # curl https://git.openstack.org/cgit/openstack/nova/patch/?id=2f0f67d17cfedef2da4b1215f8d9072172a0d04f | ( cd /usr/lib/python2.7/site-packages/nova ; patch -p2 )
    

    nova/test/unit以下のパッチを当てようとするので、これらは無視します。

    File to patch: (空のままEnter)
    Skip this patch? [y] (空のままEnter)
    

    nova-computeを再起動します。

    # service openstack-nova-compute restart
    

    cinderでNFSを使う

    我が家には共有ストレージがあるので使うように設定します。iSCSIもよいですが、今回はNFSです。

    1. 設定ファイルを書きます。
      /etc/cinder/cinder.conf:

      [DEFAULT]
      #enabled_backends=lvm
      enabled_backends=nfs
      
      [nfs]
      volume_backend_name=nfs
      volume_driver=cinder.volume.drivers.nfs.NfsDriver
      nfs_shares_config=/etc/cinder/nfsshares
      nfs_sparsed_volumes=true
      nfs_mount_options=vers=3
      

      LVMとNFSの両方を使いたい人はenabled_backendsをlvm,nfsなどとしましょう。
      この場合、ボリューム作成時のvolume-typeでどちらを使うか明示できます。指定しない場合、デフォルトでは空きの多いbackendが選ばれます。

      ちなみにvolume_backend_nameを指定し忘れると、volume-type指定での作成がコケます。(ハマって数時間ソースを追いました。)

    2. volume-typeを定義します。volume_backendsが1つなら不要です。
      # cinder type-create nfs
      # cinder type-key nfs set volume_backend_name=nfs
      
    3. SELinuxを無効化します。
      /etc/selinux/config:

      #SELINUX=enforcing
      SELINUX=disabled
    4. マシンを再起動するか、サービスを再起動します。
      # setenforce 0
      # service openstack-cinder-volume restart
      # service openstack-cinder-scheduler restart

    仮想マシンへのOSのインストール

    さて、ここでESXiならCD/DVDドライブとHDDを積んだ仮想マシンを作って、ISOイメージをマウントさせて、インストールを始めます。

    OpenStackでこれをやるには、少々面倒な手順になります。

    1. ISOイメージをイメージとしてアップロードする。
    2. ISOイメージが収まるくらいのフレーバーを定義します。インストール用なので適当に。
    3. インスタンスを作る。
      ここでフレーバーは適当、ブートソースは*イメージから起動*、イメージ名はアップロードしたISOを選びます。
    4. 起動するのを待ちます。
      コンソールを見てちゃんと動いているのを確認するもよし、ステータスが稼働中になるのを待つだけでもよし。
    5. 無慈悲にシャットダウンする。インスタンスの終了じゃないよ。(終了は削除になります)
    6. ボリュームを作ります。
      これがHDDになるので、お好みの大きさで作りましょう。
    7. 作ったボリュームを接続します。
      もしLVMを使っていてうまくいかないようなら、iscsiとtargetサービスを再起動します。

      # service target restart
      # service iscsi restart
      
    8. インスタンスを起動して、OSをインストールします。
    9. インストールが終わったら、インスタンスを終了(今度はシャットダウンじゃない)します。
    10. ここから2通りのやり方があります。ボリュームの起動可能属性がGUIから直接変えられないため、2通りの方法でこれを回避します。
    11. ⭐️1
      ボリュームをイメージにアップロードします。ディスク形式はお好みで。
    12. アップロードしたイメージからインスタンスを作ります。
    13. ⭐️2
      cinderコマンドでset-bootableします。

      # source /root/keystonerc_admin
      # cinder list
      # cinder set-bootable <GUID> true
    14. bootableに指定したボリュームを指定してインスタンスを作ります。
    15. できあがり。

    インストールしなおしたい時・アンインストールしたい時

    1. openstack-junoからインストールした全パッケージを削除します。
      # yum list installed | awk '{ if ($3 == "@openstack-juno") { print $1 } }' | xargs yum remove -y
    2. /etc, /var/lib, /var/log以下を掃除します。
      # echo ceilometer cinder glance keystone neutron nova openstack-dashboard swift | xargs -n 1 echo | xargs -I {} rm -rf /etc/{} /var/lib/{} /var/log/{}
    3. openstack以外でmysqlを使っていなければ、アンインストールしてデータベースを削除します。
      # yum remove -y mysql
      # rm -rf /var/lib/mysql
      # rm -f /root/.my.cnf
    4. おとなしく再起動します。これ重要。