Aton-Kish / OpenStack Ussuri 追加インストールその1―Octavia編
Created 2021-02-13 17:59:36 Modified 2021-03-15

6550 Words

OpenStack Ussuri 追加インストールその1―Octavia 編

アーキテクチャ

openstack_architecture+octavia


Controller

  • Octavia はロードバランササービス
  • Neutron server と同じノードにインストールすることを前提としているらしいのでコントローラノード(あるいはネットワークノードを分けている場合はネットワークノード)にインストールしていく
  • コンピュートノード上にHAProxyを稼働する Amphora という VM を建ててロードバランシングする

前提条件

OpenStack Docs: Install and configure for Ubuntu - Prerequisites

  1. 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データベースの作成とアクセス権限の付与
  2. admin環境スクリプトの読み込み

    $any user

    . admin-openrc
    
  3. サービス資格情報作成

    • 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を入力
    • 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                    |
      +-------------+----------------------------------+
      
  4. 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           |
    +--------------+----------------------------------+
    
    • publicinternaladminにそれぞれ作成

Amphora VM イメージ作成

OpenStack Docs: Building Octavia Amphora Images

  • Amphora は内部で HAProxy を動かしてロードバランシングしてくれる VM
  • 今回は OpenStack 上に Ubuntu Server 20.04 LTS の VM を建てて作成することにしました
    (そこまで環境汚染されることもないと思うのでコントローラノード上で直接作成しても問題ないです)
  • (ここからは VM 上での作業のつもりです)
  1. 環境構築

    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に変えているが、ディスク作成スクリプトのオプションでブランチを指定することもできるみたい
  2. 作成

    pipenv run ./diskimage-create.sh
    
    • デフォルトでは Ubuntu 18.04 ベースのイメージを作成する(-dオプションで変更できるみたいだが、focalつまり Ubuntu 20.04 ベースを指定したところエラーが出てしまった)
    • -g stable/ussuriのようにブランチ指定もできるらしい
  3. イメージ移動

    • カレントディレクトリにamphora-x64-haproxy.qcow2が生成されているので、これをコントローラノードに移動する(scpコマンドなど適当に)

Amphora VM イメージ登録

OpenStack Docs: Install and configure for Ubuntu - Prerequisites

  • (ここからはコントローラノード上での作業です)
  1. 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_PASSoctaviaユーザのパスワードに書き換える
  2. octavia環境スクリプトの読み込み

    $any user

    . octavia-openrc
    
  3. 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にするか、他の環境で作成しましょう
  4. 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 認証するための証明書を発行する
  • (正直あまりわかっていないです)
  1. 認証局の作業ディレクトリ作成

    $any user

    mkdir -m700 certs
    cd certs
    
    • デリケートな情報なので権限管理はしっかりしておきましょう
  2. 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_daysdefault_bits[ req_distinguished_name ]フィールドの項目を適宜変更する
  3. サーバ、クライアントの 2 つの認証局

    $any user

    mkdir server_ca
    mkdir client_ca
    
  4. サーバ認証局準備

    $any user

    cd server_ca
    mkdir certs crl newcerts private
    chmod 700 private
    touch index.txt
    echo 1000 > serial
    
  5. サーバ CA 用の鍵生成

    $any user

    openssl genrsa -aes256 -out private/ca.key.pem 4096
    chmod 400 private/ca.key.pem
    
    • 適宜パスワードを設定する
  6. サーバ 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は必ず記入すること
  7. クライアント認証局準備

    $any user

    cd ../client_ca
    mkdir certs crl csr newcerts private
    chmod 700 private
    touch index.txt
    echo 1000 > serial
    
  8. クライアント CA 用の鍵生成

    $any user

    openssl genrsa -aes256 -out private/ca.key.pem 4096
    chmod 400 private/ca.key.pem
    
    • 適宜パスワードを設定する
  9. クライアント 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は必ず記入すること
  10. コントローラで使用するクライアント証明書の鍵生成

    $any user

    openssl genrsa -aes256 -out private/client.key.pem 2048
    
    • 適宜パスワードを設定する
  11. コントローラで使用するクライアント証明書の証明書署名要求(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は必ず記入すること
  12. クライアント証明書要求に署名

    $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 用の鍵の生成時に指定したパスワードが必要
  13. クライアント証明書と鍵を連結する

    $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

  1. パッケージインストール

    #root user

    apt install \
        octavia-api \
        octavia-health-manager \
        octavia-housekeeping \
        octavia-worker \
        python3-octavia \
        python3-octaviaclient
    
  2. 証明書を配置する

    #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 certsOctavia 証明書発行の作業ディレクトリへの移動を意味していることに注意
  3. octavia環境スクリプトの読み込み

    $any user

    . octavia-openrc
    
  4. ロードバランサ用のセキュリティグループとルールを作成する

    $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
    
  5. Amphora インスタンス用の SSH 鍵登録

    $any user

    openstack keypair create --public-key ./path/to/id_rsa.pub mykey
    
    • mykeyはキーペアの名前にあたる部分なので適宜変更する
  6. 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
    
  7. ネットワーク作成

    1. ロードバランサネットワークのサブネットなどを決める

      $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 内部のプライベートなネットワークを作成するので外部ネットワークとサブネットが重複しないように注意して決めればよい
    2. ロードバランサネットワーク作成

      $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_IPOCTAVIA_MGMT_PORT_IPが一致しているか確認してみるとよいかもしれない

      • MGMT_PORT_MACの値は後ほど使うので控えておく

        $any user

        echo $MGMT_PORT_MAC
        
    3. インターフェース作成

      $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-hm0OCTAVIA_MGMT_PORT_IPが振られていることが確認できる

      • BRNAMEの値は後ほど使うので控えておく

        $any user

        echo $BRNAME
        
  8. 再起動してもネットワーク設定を保持するようにする

    1. /etc/systemd/network/o-hm0.networkを作成

      [Match]
      Name=o-hm0
      
      [Network]
      DHCP=yes
      
    2. /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に指定するスクリプトの保存場所は自由
    3. /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
        
  9. /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が使われるが本番環境では変えるべきとのこと
  10. 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 ロードバランサをやってみます
  1. 適当に作ったselfserviceネットワーク(selfserviceサブネット)に Nginx Web サーバの VM を 2 台建てておく

    • Web サーバの IP アドレスは10.0.0.11, 10.0.0.12と仮定する
    • それぞれWelcome to node1, Welcome to node2を返すようにindex.htmlを書き換えておく
  2. octavia環境スクリプトの読み込み

    $any user

    . octavia-openrc
    
  3. ロードバランサ作成

    $any user

    openstack loadbalancer create --name http-lb --vip-subnet-id selfservice
    
  4. HTTP をロードバランシングするためのリスナーを作成

    $any user

    openstack loadbalancer listener create --name http-listener --protocol HTTP --protocol-port 80 http-lb
    
  5. ロードバランサ対象のプールを作成

    $any user

    openstack loadbalancer pool create --name http-pool --lb-algorithm ROUND_ROBIN --listener http-listener --protocol HTTP
    
    • --lb-algorithmはラウンドロビン以外にもあるようなので適宜変更する
  6. プールに 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
    
  7. ヘルスモニタ作成

    $any user

    openstack loadbalancer healthmonitor create --name http-pool-hm --delay 5 --max-retries 4 --timeout 10 --type HTTP --url-path / http-pool
    
    • VM の様子を監視して、落ちるとプールから自動的に外してくれるらしい(回復すると再び参加するらしい)
  8. 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が取得できたと仮定する
  9. アクセスしてみる

    # ...
    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 を通しているか確認しましょう

おわり

以上で Octavia 編終了です
お疲れ様でした

関連記事一覧