OpenStack Ussuri 追加インストールその1―Octavia 編
- OpenStack Ussuriをマニュアルインストールしてみたメモ で構築した OpenStack を拡張していきます
アーキテクチャ
- OpenStack Ussuriをマニュアルインストールしてみたメモのアーキテクチャに対して、今回はコントローラノードに新しく Octavia を導入する
Controller
- Octavia はロードバランササービス
- Neutron server と同じノードにインストールすることを前提としているらしいのでコントローラノード(あるいはネットワークノードを分けている場合はネットワークノード)にインストールしていく
- コンピュートノード上にHAProxyを稼働する Amphora という VM を建ててロードバランシングする
前提条件
OpenStack Docs: Install and configure for Ubuntu - Prerequisites
Octavia をインストールする前にデータベースを作成する必要がある
root user
mysql
# 以下は`MariaDB [(none)]>`のプロンプトに入力する CREATE DATABASE octavia; GRANT ALL PRIVILEGES ON octavia.* TO 'octavia'@'localhost' IDENTIFIED BY 'OCTAVIA_DBPASS'; GRANT ALL PRIVILEGES ON octavia.* TO 'octavia'@'%' IDENTIFIED BY 'OCTAVIA_DBPASS';
-
Caution
OCTAVIA_DBPASS
は適切なパスワードに書き換える octavia
データベースの作成とアクセス権限の付与
-
Caution
admin
環境スクリプトの読み込みany user
. admin-openrc
サービス資格情報作成
octavia
ユーザ作成any user
openstack user create --domain default --password-prompt octavia # 対話形式のパスワードプロンプトがでる User Password: Repeat User Password:
+---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | b18ee38e06034b748141beda8fc8bfad | | name | octavia | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+
-
パスワードプロンプトでは Caution
OCTAVIA_PASS
を入力
-
パスワードプロンプトでは Caution
service
プロジェクト、octavia
ユーザにadmin
の役割を割り当てるany user
openstack role add --project service --user octavia admin
load-balancer
サービス (name: octavia
) を作成any user
openstack service create --name octavia --description "OpenStack Octavia" load-balancer
+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Octavia | | enabled | True | | id | d854f6fff0a64f77bda8003c8dedfada | | name | octavia | | type | load-balancer | +-------------+----------------------------------+
load-balancer
サービスに API エンドポイント作成any user
openstack endpoint create --region RegionOne load-balancer public http://controller:9876
+--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 47cf883de46242c39f147c52f2958ebf | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | d854f6fff0a64f77bda8003c8dedfada | | service_name | octavia | | service_type | load-balancer | | url | http://controller:9876 | +--------------+----------------------------------+
any user
openstack endpoint create --region RegionOne load-balancer internal http://controller:9876
+--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 225aef8465ef4df48a341aaaf2b0a390 | | interface | internal | | region | RegionOne | | region_id | RegionOne | | service_id | d854f6fff0a64f77bda8003c8dedfada | | service_name | octavia | | service_type | load-balancer | | url | http://controller:9876 | +--------------+----------------------------------+
any user
openstack endpoint create --region RegionOne load-balancer admin http://controller:9876
+--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 375eb5057fb546edbdf3ee4866179672 | | interface | admin | | region | RegionOne | | region_id | RegionOne | | service_id | d854f6fff0a64f77bda8003c8dedfada | | service_name | octavia | | service_type | load-balancer | | url | http://controller:9876 | +--------------+----------------------------------+
public
、internal
、admin
にそれぞれ作成
Amphora VM イメージ作成
OpenStack Docs: Building Octavia Amphora Images
- Amphora は内部で HAProxy を動かしてロードバランシングしてくれる VM
- 今回は OpenStack 上に Ubuntu Server 20.04 LTS の VM を建てて作成することにしました
(そこまで環境汚染されることもないと思うのでコントローラノード上で直接作成しても問題ないです) - (ここからは VM 上での作業のつもりです)
環境構築
sudo apt update sudo apt install python3-pip qemu-utils git kpartx debootstrap # Python 3 が入っていなければ `python3` もインストールする sudo pip3 install pipenv git clone https://opendev.org/openstack/octavia.git cd octavia/diskimage-create git checkout stable/ussuri pipenv install -r requirements.txt
- 公式ドキュメントでは Pipenv ではなく Virtualenv を使ってます(正直どっちでもいいと思います)
- ブランチを
stable/ussuri
に変えているが、ディスク作成スクリプトのオプションでブランチを指定することもできるみたい
作成
pipenv run ./diskimage-create.sh
- デフォルトでは Ubuntu 18.04 ベースのイメージを作成する(
-d
オプションで変更できるみたいだが、focal
つまり Ubuntu 20.04 ベースを指定したところエラーが出てしまった) -g stable/ussuri
のようにブランチ指定もできるらしい
- デフォルトでは Ubuntu 18.04 ベースのイメージを作成する(
イメージ移動
- カレントディレクトリに
amphora-x64-haproxy.qcow2
が生成されているので、これをコントローラノードに移動する(scp
コマンドなど適当に)
- カレントディレクトリに
Amphora VM イメージ登録
OpenStack Docs: Install and configure for Ubuntu - Prerequisites
- (ここからはコントローラノード上での作業です)
octavia
ユーザ用の環境スクリプトoctavia-openrc
を作成するexport OS_PROJECT_DOMAIN_NAME=Default export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_NAME=service export OS_USERNAME=octavia export OS_PASSWORD=OCTAVIA_PASS export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 export OS_VOLUME_API_VERSION=3
OCTAVIA_PASS
はoctavia
ユーザのパスワードに書き換える
octavia
環境スクリプトの読み込みany user
. octavia-openrc
Amphora イメージを
QCOW2
ディスク形式、ベアコンテナ形式で Glance に登録any user
openstack image create "amphora-x64-haproxy" \ --tag amphora \ --file ./path/to/amphora-x64-haproxy.qcow2 \ --disk-format qcow2 \ --container-format bare \ --private
--private
を指定しているのでservice
プロジェクトからしか参照できない- 不都合ある場合は
--public
にするか、他の環境で作成しましょう
- 不都合ある場合は
Amphora 用フレーバー作成
any user
openstack flavor create --id 200 --vcpus 1 --ram 1024 --disk 2 "amphora" --private
--id 200
は適宜重複しないように変更する- ディスク容量は
2G
にしてあるが適宜増やしてもよいかもしれない --private
を指定しているのでservice
プロジェクトからしか参照できない- 不都合ある場合は
--public
にするか、他の環境で作成しましょう
- 不都合ある場合は
Octavia 証明書発行
OpenStack Docs: Octavia Certificate Configuration Guide - Creating the Certificate Authorities
- Octavia の各種プロセスと Amphora 間では TLS 接続がおこなわれる
- 双方向に TLS 認証するための証明書を発行する
- (正直あまりわかっていないです)
認証局の作業ディレクトリ作成
any user
mkdir -m700 certs cd certs
- デリケートな情報なので権限管理はしっかりしておきましょう
OpenSSL 構成ファイル
openssl.cnf
作成# OpenSSL root CA configuration file. [ ca ] # `man ca` default_ca = CA_default [ CA_default ] # Directory and file locations. dir = ./ certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand # The root key and root certificate. private_key = $dir/private/ca.key.pem certificate = $dir/certs/ca.cert.pem # For certificate revocation lists. crlnumber = $dir/crlnumber crl = $dir/crl/ca.crl.pem crl_extensions = crl_ext default_crl_days = 30 # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 3650 preserve = no policy = policy_strict [ policy_strict ] # The root CA should only sign intermediate certificates that match. # See the POLICY FORMAT section of `man ca`. countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] # Options for the `req` tool (`man req`). default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 # Extension to add when the -x509 option is used. x509_extensions = v3_ca [ req_distinguished_name ] # See <https://en.wikipedia.org/wiki/Certificate_signing_request>. countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name emailAddress = Email Address commonName = Common Name # ここの部分を変えておくと作業が非常に楽になる # Optionally, specify some defaults. countryName_default = [国名2文字コード、JPなど] stateOrProvinceName_default = [都道府県、Tokyoなど] localityName_default = [市区町村] 0.organizationName_default = [組織名] organizationalUnitName_default = [組織内の部署名とか?] emailAddress_default = [メールアドレス] commonName_default = [コモンネーム、ドメイン名やIPアドレス(ワイルドカード使用可)] [ v3_ca ] # Extensions for a typical CA (`man x509v3_config`). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ usr_cert ] # Extensions for client certificates (`man x509v3_config`). basicConstraints = CA:FALSE nsCertType = client, email nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, emailProtection [ server_cert ] # Extensions for server certificates (`man x509v3_config`). basicConstraints = CA:FALSE nsCertType = server nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ crl_ext ] # Extension for CRLs (`man x509v3_config`). authorityKeyIdentifier=keyid:always
default_days
やdefault_bits
、[ req_distinguished_name ]
フィールドの項目を適宜変更する
サーバ、クライアントの 2 つの認証局
any user
mkdir server_ca mkdir client_ca
サーバ認証局準備
any user
cd server_ca mkdir certs crl newcerts private chmod 700 private touch index.txt echo 1000 > serial
サーバ CA 用の鍵生成
any user
openssl genrsa -aes256 -out private/ca.key.pem 4096 chmod 400 private/ca.key.pem
- 適宜パスワードを設定する
サーバ CA 証明書発行
any user
openssl req -config ../openssl.cnf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem
- 5. サーバ CA 用の鍵の生成時に指定したパスワードが必要
openssl.cnf
の[ req_distinguished_name ]
フィールドから修正する必要があれば修正するCommon Name
は必ず記入すること
クライアント認証局準備
any user
cd ../client_ca mkdir certs crl csr newcerts private chmod 700 private touch index.txt echo 1000 > serial
クライアント CA 用の鍵生成
any user
openssl genrsa -aes256 -out private/ca.key.pem 4096 chmod 400 private/ca.key.pem
- 適宜パスワードを設定する
クライアント CA 証明書発行
any user
openssl req -config ../openssl.cnf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem
- 8. クライアント CA 用の鍵の生成時に指定したパスワードが必要
openssl.cnf
の[ req_distinguished_name ]
フィールドから修正する必要があれば修正するCommon Name
は必ず記入すること
コントローラで使用するクライアント証明書の鍵生成
any user
openssl genrsa -aes256 -out private/client.key.pem 2048
- 適宜パスワードを設定する
コントローラで使用するクライアント証明書の証明書署名要求(CSR)を作成
any user
openssl req -config ../openssl.cnf -new -sha256 -key private/client.key.pem -out csr/client.csr.pem
- 10. コントローラで使用するクライアント証明書の鍵の生成時に指定したパスワードが必要
openssl.cnf
の[ req_distinguished_name ]
フィールドから修正する必要があれば修正するCommon Name
は必ず記入すること
クライアント証明書要求に署名
any user
openssl ca -config ../openssl.cnf -extensions usr_cert -days 7300 -notext -md sha256 -in csr/client.csr.pem -out certs/client.cert.pem
- 8. クライアント CA 用の鍵の生成時に指定したパスワードが必要
クライアント証明書と鍵を連結する
any user
openssl rsa -in private/client.key.pem -out private/client.cert-and-key.pem cat certs/client.cert.pem >> private/client.cert-and-key.pem
- 10. コントローラで使用するクライアント証明書の鍵の生成時に指定したパスワードが必要
Octavia インストール
OpenStack Docs: Install and configure for Ubuntu - Install and configure components
OpenStack Docs: Octavia Certificate Configuration Guide - Configuring Octavia
パッケージインストール
root user
apt install \ octavia-api \ octavia-health-manager \ octavia-housekeeping \ octavia-worker \ python3-octavia \ python3-octaviaclient
証明書を配置する
root user
cd certs mkdir -m700 /etc/octavia/certs cp server_ca/private/ca.key.pem /etc/octavia/certs/server_ca.key.pem chmod 700 /etc/octavia/certs/server_ca.key.pem cp server_ca/certs/ca.cert.pem /etc/octavia/certs/server_ca.cert.pem cp client_ca/certs/ca.cert.pem /etc/octavia/certs/client_ca.cert.pem cp client_ca/private/client.cert-and-key.pem /etc/octavia/certs/client.cert-and-key.pem chmod 700 /etc/octavia/certs/client.cert-and-key.pem chown -R octavia:octavia /etc/octavia/certs
- 最初の
cd certs
はOctavia 証明書発行の作業ディレクトリへの移動を意味していることに注意
- 最初の
octavia
環境スクリプトの読み込みany user
. octavia-openrc
ロードバランサ用のセキュリティグループとルールを作成する
any user
openstack security group create lb-mgmt-sec-grp openstack security group rule create --protocol icmp lb-mgmt-sec-grp openstack security group rule create --protocol tcp --dst-port 22 lb-mgmt-sec-grp openstack security group rule create --protocol tcp --dst-port 9443 lb-mgmt-sec-grp
openstack security group create lb-health-mgr-sec-grp openstack security group rule create --protocol udp --dst-port 5555 lb-health-mgr-sec-grp
Amphora インスタンス用の SSH 鍵登録
any user
openstack keypair create --public-key ./path/to/id_rsa.pub mykey
mykey
はキーペアの名前にあたる部分なので適宜変更する
dhclient.conf
作成any user
git clone https://opendev.org/openstack/octavia.git cd octavia git checkout stable/ussuri sudo mkdir -m755 -p /etc/dhcp/octavia sudo cp etc/dhcp/dhclient.conf /etc/dhcp/octavia
ネットワーク作成
ロードバランサネットワークのサブネットなどを決める
any user
OCTAVIA_MGMT_SUBNET=172.17.0.0/16 OCTAVIA_MGMT_SUBNET_START=172.17.0.100 OCTAVIA_MGMT_SUBNET_END=172.17.31.254 OCTAVIA_MGMT_PORT_IP=172.17.0.2
- OpenStack 内部のプライベートなネットワークを作成するので外部ネットワークとサブネットが重複しないように注意して決めればよい
ロードバランサネットワーク作成
any user
openstack network create lb-mgmt-net openstack subnet create \ --network lb-mgmt-net \ --allocation-pool start=$OCTAVIA_MGMT_SUBNET_START,end=$OCTAVIA_MGMT_SUBNET_END \ --subnet-range $OCTAVIA_MGMT_SUBNET \ lb-mgmt-subnet SUBNET_ID=$(openstack subnet show lb-mgmt-subnet -f value -c id) PORT_FIXED_IP="--fixed-ip subnet=$SUBNET_ID,ip-address=$OCTAVIA_MGMT_PORT_IP" MGMT_PORT_ID=$(openstack port create\ --security-group lb-health-mgr-sec-grp \ --device-owner Octavia:health-mgr \ --host=$(hostname) \ -c id \ -f value \ --network lb-mgmt-net \ $PORT_FIXED_IP octavia-health-manager-listen-port) MGMT_PORT_MAC=$(openstack port show -c mac_address -f value $MGMT_PORT_ID) MGMT_PORT_IP=$(openstack port show -f yaml -c fixed_ips \ $MGMT_PORT_ID | awk '{FS=",|";gsub(",","");gsub("'\''",""); \ for(line = 1; line <= NF; ++line) {if ($line ~ /^- ip_address:/) \ {split($line, word, " ");if (ENVIRON["IPV6_ENABLED"] == "" && word[3] ~ /\./) \ print word[3];if (ENVIRON["IPV6_ENABLED"] != "" && word[3] ~ /:/) print word[3];} \ else {split($line, word, " ");for(ind in word) {if (word[ind] ~ /^ip_address=/) \ {split(word[ind], token, "=");if (ENVIRON["IPV6_ENABLED"] == "" && token[2] ~ /\./) \ print token[2];if (ENVIRON["IPV6_ENABLED"] != "" && token[2] ~ /:/) print token[2];}}}}}')
MGMT_PORT_IP
とOCTAVIA_MGMT_PORT_IP
が一致しているか確認してみるとよいかもしれないMGMT_PORT_MAC
の値は後ほど使うので控えておくany user
echo $MGMT_PORT_MAC
インターフェース作成
any user
sudo ip link add o-hm0 type veth peer name o-bhm0 NETID=$(openstack network show lb-mgmt-net -c id -f value) BRNAME=brq$(echo $NETID|cut -c 1-11) sudo brctl addif $BRNAME o-bhm0 sudo ip link set o-bhm0 up sudo ip link set dev o-hm0 address $MGMT_PORT_MAC sudo iptables -I INPUT -i o-hm0 -p udp --dport 5555 -j ACCEPT sudo dhclient -v o-hm0 -cf /etc/dhcp/octavia
ip a
などを叩くと Octavia ヘルスマネージャー用のインターフェースo-hm0
にOCTAVIA_MGMT_PORT_IP
が振られていることが確認できるBRNAME
の値は後ほど使うので控えておくany user
echo $BRNAME
再起動してもネットワーク設定を保持するようにする
/etc/systemd/network/o-hm0.network
を作成[Match] Name=o-hm0 [Network] DHCP=yes
/etc/systemd/system/octavia-interface.service
を作成[Unit] Description=Octavia Interface Creator Requires=neutron-linuxbridge-agent.service After=neutron-linuxbridge-agent.service [Service] Type=oneshot RemainAfterExit=true ExecStart=/usr/local/bin/octavia-interface.sh start ExecStop=/usr/local/bin/octavia-interface.sh stop [Install] WantedBy=multi-user.target
ExecStart
,ExecStop
に指定するスクリプトの保存場所は自由
/usr/local/bin/octavia-interface.sh
を作成#!/bin/bash set -ex MAC=[`$MGMT_PORT_MAC`の値に書き換える] BRNAME=[`$BRNAME`の値に書き換える] if [ "$1" == "start" ]; then ip link add o-hm0 type veth peer name o-bhm0 brctl addif $BRNAME o-bhm0 ip link set o-bhm0 up ip link set dev o-hm0 address $MAC ip link set o-hm0 up iptables -I INPUT -i o-hm0 -p udp --dport 5555 -j ACCEPT dhclient -v o-hm0 -cf /etc/dhcp/octavia # もしかしたら不要かも? elif [ "$1" == "stop" ]; then ip link del o-hm0 else brctl show $BRNAME ip a s dev o-hm0 fi
ドキュメントには
dhclient ...
の行は書かれていなかったが、うまくアドレスが振られない気がしたので…- 自分の環境の DHCP まわりに問題があっただけかもしれないです
実行権限も忘れずに付与する
any user
sudo chmod +x /usr/local/bin/octavia-interface.sh
/etc/octavia/octavia.conf
編集[DEFAULT] # `RABBIT_PASS`は適切なパスワードに書き換える transport_url = rabbit://openstack:RABBIT_PASS@controller # ... [database] # `OCTAVIA_DBPASS`は適切なパスワードに書き換える connection = mysql+pymysql://octavia:OCTAVIA_DBPASS@controller/octavia # ... [oslo_messaging] topic = octavia_prov # ... [api_settings] bind_host = 0.0.0.0 bind_port = 9876 # ... [keystone_authtoken] # `OCTAVIA_PASS`は適切なパスワードに書き換える www_authenticate_uri = http://controller:5000 auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = octavia password = OCTAVIA_PASS # ... [service_auth] # `OCTAVIA_PASS`は適切なパスワードに書き換える auth_url = http://controller:5000 memcached_servers = controller:11211 auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = octavia password = OCTAVIA_PASS # ... [certificates] cert_generator = local_cert_generator ca_certificate = /etc/octavia/certs/server_ca.cert.pem ca_private_key = /etc/octavia/certs/server_ca.key.pem ca_private_key_passphrase = [サーバCA鍵のパスワード] # server_certs_key_passphrase = insecure-key-do-not-use-this-key server_certs_key_passphrase = [32文字のなんらかの文字列] # ... [haproxy_amphora] client_cert = /etc/octavia/certs/client.cert-and-key.pem server_ca = /etc/octavia/certs/server_ca.cert.pem # ... [health_manager] # `$OCTAVIA_MGMT_PORT_IP`に指定したアドレスに適宜書き換える bind_port = 5555 bind_ip = OCTAVIA_MGMT_PORT_IP controller_ip_port_list = OCTAVIA_MGMT_PORT_IP:5555 # ... [controller_worker] amp_image_owner_id = [`service`プロジェクトのID、`openstack project show service`などで調べる] amp_image_tag = amphora amp_ssh_key_name = [Amphora用キーペア名、mykeyなど] amp_secgroup_list = [`lb-mgmt-sec-grp`セキュリティグループのID、`openstack security group show lb-mgmt-sec-grp`などで調べる] amp_boot_network_list = [`lb-mgmt-net`ネットワークのID、`openstack network show lb-mgmt-net`などで調べる] amp_flavor_id = [Amphora用フレーバーのID、200など] network_driver = allowed_address_pairs_driver compute_driver = compute_nova_driver amphora_driver = amphora_haproxy_rest_driver client_ca = /etc/octavia/certs/client_ca.cert.pem # ...
-
Caution
RABBIT_PASS
は適切なパスワードに書き換える -
Caution
OCTAVIA_DBPASS
は適切なパスワードに書き換える -
Caution
OCTAVIA_PASS
は適切なパスワードに書き換える -
Caution
server_certs_key_passphrase
は 32 文字のなんらかの文字列に書き換える- デフォルトでは
insecure-key-do-not-use-this-key
が使われるが本番環境では変えるべきとのこと
- デフォルトでは
-
Caution
Octavia データベース更新
root user
octavia-db-manage --config-file /etc/octavia/octavia.conf upgrade head
サービス再起動
OpenStack Docs: Install and configure for Ubuntu - Finalize installation
root user
systemctl restart octavia-api
systemctl restart octavia-health-manager
systemctl restart octavia-housekeeping
systemctl restart octavia-worker
- 念の為
systemctl status
で確認しておきましょうserver_certs_key_passphrase
の 32 文字設定に誤っていたりで起動失敗することがあります
Amphora v2 のための追加設定
OpenStack Docs: Additional configuration steps to configure amphorav2 provider
- Redis か Zookeeper が追加で必要になりそうなので今回はとりあえず追加設定しません
動作確認
OpenStack Docs: Basic Load Balancing Cookbook
- 簡単な HTTP ロードバランサをやってみます
適当に作った
selfservice
ネットワーク(selfservice
サブネット)に Nginx Web サーバの VM を 2 台建てておく- Web サーバの IP アドレスは
10.0.0.11
,10.0.0.12
と仮定する - それぞれ
Welcome to node1
,Welcome to node2
を返すようにindex.html
を書き換えておく
- Web サーバの IP アドレスは
octavia
環境スクリプトの読み込みany user
. octavia-openrc
ロードバランサ作成
any user
openstack loadbalancer create --name http-lb --vip-subnet-id selfservice
HTTP をロードバランシングするためのリスナーを作成
any user
openstack loadbalancer listener create --name http-listener --protocol HTTP --protocol-port 80 http-lb
ロードバランサ対象のプールを作成
any user
openstack loadbalancer pool create --name http-pool --lb-algorithm ROUND_ROBIN --listener http-listener --protocol HTTP
--lb-algorithm
はラウンドロビン以外にもあるようなので適宜変更する
プールに Web サーバを参加させる
any user
openstack loadbalancer member create --name node1 --subnet-id selfservice --address 10.0.0.11 --protocol-port 80 http-pool openstack loadbalancer member create --name node2 --subnet-id selfservice --address 10.0.0.12 --protocol-port 80 http-pool
ヘルスモニタ作成
any user
openstack loadbalancer healthmonitor create --name http-pool-hm --delay 5 --max-retries 4 --timeout 10 --type HTTP --url-path / http-pool
- VM の様子を監視して、落ちるとプールから自動的に外してくれるらしい(回復すると再び参加するらしい)
floating IP の設定
any user
openstack floating ip create provider openstack floating ip set --port [http-lbのポートID] [floating IPのID]
- ロードバランサ
http-lb
にプロバイダネットワークの floating IP を設定することで外部からの疎通ができるようになる- floating IP は
172.16.100.100
が取得できたと仮定する
- floating IP は
- ロードバランサ
アクセスしてみる
# ... curl http://172.16.100.100/ Welcome to node1 curl http://172.16.100.100/ Welcome to node2 curl http://172.16.100.100/ Welcome to node1 # ...
- Web サーバの
index.html
を書き換えておくとラウンドロビンしている様子がわかりやすい - つながらない場合は Web サーバを建てているプロジェクトのセキュリティグループが HTTP を通しているか確認しましょう
- Web サーバの
おわり
以上で Octavia 編終了です
お疲れ様でした
関連記事一覧
- OpenStack Ussuriをマニュアルインストールしてみたメモ
- OpenStack Ussuriマニュアルインストールその1―環境構築編
- OpenStack Ussuriマニュアルインストールその2―Keystone編
- OpenStack Ussuriマニュアルインストールその3―Glance編
- OpenStack Ussuriマニュアルインストールその4―Placement編
- OpenStack Ussuriマニュアルインストールその5―Nova編
- OpenStack Ussuriマニュアルインストールその6―Neutron編
- OpenStack Ussuriマニュアルインストールその7―Horizon編
- OpenStack Ussuriマニュアルインストールその8―Cinder編
- OpenStack Ussuriマニュアルインストールその9―起動編
- OpenStack Ussuri 追加インストールその1―Octavia編(当記事)
- OpenStack Victoriaをマニュアルインストールしてみたメモ
- OpenStack Tips
- Issues