自宅にラックサーバが1台生えてきたので、all-in-one構成でOpenStack(Xena)環境を構築してみました。
microstackなどの簡単に試せるものもいくつか試してみましたが、上流のネットワークのVLANを取り扱いたいなど少し踏み込んだことをしたい際に困ったので、Kolla Ansibleでの構築を行いました。
本記事で紹介する手法はあくまで開発用・実験用のOpenStack環境を作成するもので、productionユースに対応したものではありません。
今回は、all-in-one構成かつ上流のネットワークのVLANを扱えることを目標に構築を行います。
デプロイ先のマシンの構成
- OS: Ubuntu Server 20.04 LTS
- ベアボーン: ASRock Rack 1U2-X570/2T
- CPU: AMD Ryzen 7 5800X
- メモリ: SO-DIMM DDR4 3200MHz PC4-25600 64GB
- NIC: Intel X550-AT2 10GBASE-T x 2 ※今回は1つだけ使用
- ストレージ: NVMe SSD 1TB
通常、OpenStackは2つ以上の物理NICを使用することが必須要件となっていますが、上流のネットワークがVLANを扱える環境でかつNICがVLANを扱えるのであれば、1つの物理NICでも動かすことは可能なので今回はそのような構成にしています。
(上流のL2SWへ接続する際に使用する10GBASE-TのSFP+モジュールは高価な為、お財布事情によりこのような構成になりました)
今回デプロイする環境にはあらかじめ、以下のようにVLANの設定をしてあります。
!!あくまでこのような設定でも動くというだけで、推奨するものではありません!!
- OpenStack側で使用するインタフェース: enp36s0f1
- IPアドレスの割り当て無し
- タグ付きのVLANを扱えるように上流のL2SWを設定済み
- VLANインタフェース(仮想): vlan2
- IPアドレス: 192.168.0.113/24
- VID: 2
- ホストの管理用・OpenStackの管理に使用
- 親インタフェース: enp36s0f1
また、今回は可能な限り設定ファイルの類をgitなどのVCSで管理することを目指してセットアップを行います。
通常、kolla-ansibleはデプロイ元のホストの /etc/kolla/
に設定ファイルを配置しますが、そうすると管理上不便なため、ローカルのユーザディレクトリ内の開発用に作成した任意のディレクトリ内に配置できるようにセットアップを進めます。
Python環境(venv)の構築
あらかじめ、デプロイ元のホストにはpython3を入れておいてください。
python -m venv venv
# venv環境をactivateする
source venv/bin/activate
以下のコマンドでkolla-ansibleをvenv環境にインストールしてください。
pip install kolla-ansible
また、kolla-ansibleをインストールしても一緒にAnsibleはインストールされないので、以下のページを参考に別途対応したバージョンのAnsibleをインストールしてください。(対応してないバージョンのものを入れるとエラーになるので注意してください)
Quick Start — kolla-ansible 13.1.0.dev187 documentation
記事執筆時点の最新のkolla-ansibleのバージョンは13.1.0なので、Ansible 5.xをインストールします。
pip install 'ansible==5.*'
インストールが出来たら、requirements.txt
に依存関係を保存しておきます。
pip freeze > requirements.txt
(次にデプロイ環境を作るときは、 venv環境を作ってから pip install -r requirements.txt
で復元してください)
設定ファイルを用意する
kolla-ansibleはその設定ファイルを変更することで、多種多様なOpenStack構成をデプロイすることが出来ます。
その設定項目はHA構成などを考慮した設定も可能で非常に多いので、今回は最低限シンプルに動く状態を目指すために最小限の変更を加えます。
パスワードを生成して暗号化して保存しておく
mkdir kolla-ansible-etc/
cp venv/share/kolla-ansible/etc_examples/kolla/passwords.yml kolla-ansible-etc/
kolla-genpwd -p kolla-ansible-etc/passwords.yml
ansible-vaultを用いてしっかり強固なパスワードで暗号化しておきましょう。デプロイ時に必要になるので忘れないようにしてください!
ansible-vault encrypt kolla-ansible-etc/passwords.yml
ansible-vaultの仕組みや使い方についてはAnsibleの公式ドキュメントを参照してください!
Encrypting content with Ansible Vault — Ansible Documentation
globals.ymlを用意する
cp venv/share/kolla-ansible/etc_examples/kolla/globals.yml ./kolla-ansible-etc/
今回は以下のような設定に変更します。(変更箇所のみ抜粋)
デプロイ先のホストのIPアドレスやインタフェースに合うように修正してください。
# OpenStackの管理用IPアドレス(他と被らないIPアドレスを指定。デプロイすると管理用IFに割り当てられます。)
kolla_internal_vip_address: "192.168.0.140"
# OpenStack管理用に使用するホストのIFを指定
network_interface: "vlan2"
# OpenStackから使用するIF(VLANなどもここを通る)
neutron_external_interface: "enp36s0f1"
# kolla-ansible-etc/以下に配置したconfigを読めるように設定する(相対パスでは動かない)
node_custom_config: "{{ lookup('env', 'PWD') }}/kolla-ansible-etc/config/"
# Dockerのイメージファイルのベースになるディストリビューション(今回はUbuntuを指定)
kolla_base_distro: "ubuntu"
# デプロイするOpenStackのバージョン(今回はXenaを指定)
openstack_release: "xena"
# ボリュームの格納先にCinderを使う
enable_cinder: "yes"
enable_cinder_backend_nfs: "yes"
# VLANを使用できるようにする
neutron_tenant_network_types: "vxlan,vlan"
CinderとNeutronの設定を用意する
ボリュームの格納先になるNFSサーバとそのパスを指定しておきます。
外部のNFSサーバを用いる場合はそのサーバのIPアドレスを、all-in-one構成でデプロイするサーバ自体を指定する場合は管理用IFのIPアドレスを指定してください。(その場合は後述する手順で忘れずにNFSサーバとしても構成してください)
192.168.0.113:/share/cinder
VLANを使えるようにするために、Neutronの設定を変えておきます。
[ml2_type_vlan]
network_vlan_ranges = physnet1
all-in-one構成のinventoryを用意する
mkdir inventory
cp venv/share/kolla-ansible/ansible/inventory/* inventory/
変更箇所のみ抜粋
# These initial groups are the only groups required to be modified. The
# additional groups are for more control of the environment.
[control]
noka ansible_connection=local
[network]
noka ansible_connection=local
[compute]
noka ansible_connection=local
[storage]
noka ansible_connection=local
[monitoring]
noka ansible_connection=local
[deployment]
noka ansible_connection=local
# You can explicitly specify which hosts run each project by updating the
# groups in the sections below. Common services are grouped together.
ansible_connection
はAnsibleを実行するホストに対してデプロイする場合は local
を指定することができます。
他のホストにデプロイする場合は、別途SSHの認証周りの設定を行う必要があります。
Connection methods and details — Ansible Documentation
NFSサーバを構成する
今回はall-in-one構成ということで、デプロイするサーバ自体をNFSサーバにして、そこにボリュームを格納するようにします。
本来、これらの設定もAnsibleで行うのがあるべき姿だとは思いますが、別途playbookを書く必要があるのと、一旦本筋から逸れる為簡単な手順のみを記しておきます。
sudo apt install nfs-kernel-server
mkdir -p /share/cinder
chown nobody:nogroup /share/cinder
/share/cinder 192.168.0.0/24(rw,sync,no_subtree_check)
sudo systemctl enable nfs-kernel-server
sudo systemctl restart nfs-kernel-server
Ubuntu 20.04にNFSマウントをセットアップする方法 | DigitalOcean
デプロイを実行する
デプロイは、bootstrap -> check -> deploy の順で行います。途中のステップでエラーが発生した場合はよくエラーを見直して確認しましょう。
全体を通して20分程度時間を要するのでデプロイを開始したら止めずに気長に待ちましょう。
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass bootstrap-servers
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass prechecks
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass deploy
また、必須ではありませんが、コマンド上でOpenStackを操作する際に使用する初期化用のスクリプトを生成する post-deploy
は以下のコマンドを実行してください。
(生成される kolla-ansible-etc/admin-openrc.sh
には機微情報が含まれるので、 .gitignore
に入れるなどして取り扱いには注意してください)
ANSIBLE_BECOME_ASK_PASS=TRUE kolla-ansible -i inventory/all-in-one --configdir $(pwd)/kolla-ansible-etc/ --passwords kolla-ansible-etc/passwords.yml --ask-vault-pass post-deploy
最後に
問題なくデプロイが完了していれば、前の手順で指定した管理用IPアドレスにOpenStackのダッシュボード(Horizon)が生えてきているはずです。
(adminアカウントは kolla-ansible-etc/passwords.yml
に格納されているもので入ることが出来ます)