第2章 OpenStack Platform のアップグレードの準備

このプロセスでは、完全な更新に向けて OpenStack を準備します。これには、以下のステップを伴います。

  • アンダークラウドとオーバークラウドの両方をバックアップします。
  • アンダークラウドのパッケージを更新し、アップグレードコマンドを実行します。
  • 新しいカーネルまたはシステムパッケージがインストールされた場合には、アンダークラウドを再起動します。
  • overcloud upgrade コマンドでオーバークラウドを更新します。
  • 新しいカーネルまたはシステムパッケージがインストールされた場合には、オーバークラウドノードを再起動します。
  • アンダークラウドとオーバークラウドの両方で検証のチェックを実行します。

これらの手順により、OpenStack Platform 環境は、アップグレードを開始する前に、最適な状態となります。

2.1. アンダークラウドのバックアップ

完全なアンダークラウドのバックアップには、以下のデータベースおよびファイルが含まれます。

  • アンダークラウドノード上の MariaDB データベース
  • (データベースを正確に復元できるように) アンダークラウド上の MariaDB 設定ファイル
  • 設定データ: /etc
  • ログデータ: /var/log
  • イメージデータ: /var/lib/glance
  • 証明書生成データ: /var/lib/certmonger
  • コンテナーイメージデータ: /var/lib/docker/var/lib/registry
  • Swift の全データ: /srv/node
  • stack ユーザーのホームディレクトリー (/home/stack) 内の全データ: /home/stack
注記

バックアッププロセスを実行する前に、アンダークラウドに利用可能なディスク容量が十分にあることを確認します。アーカイブファイルは、少なくとも 3.5 GB となることが予想され、それ以上になる可能性があります。

手順

  1. アンダークラウドに root ユーザーとしてログインします。
  2. データベースをバックアップします。

    # mysqldump --opt --all-databases > /root/undercloud-all-databases.sql
  3. データベースのバックアップと設定ファイルをアーカイブします。

    # sudo tar --xattrs --ignore-failed-read -cf \
        undercloud-backup-`date +%F`.tar \
        /root/undercloud-all-databases.sql \
        /etc \
        /var/log \
        /var/lib/glance \
        /var/lib/certmonger \
        /var/lib/docker \
        /var/lib/registry \
        /srv/node \
        /root \
        /home/stack

    これで、undercloud-backup-<date>.tar.gz という名前のファイルが作成されます。<date> はシステムの日付です。この tar ファイルをセキュアな場所にコピーします。

2.2. コンテナー化されたオーバークラウドのコントロールプレーンサービスのバックアップ

以下の手順では、コンテナー化されたオーバークラウドのデータベースと設定のバックアップを作成します。オーバークラウドのデータベースとサービスのバックアップにより、作業環境のスナップショットが確保されます。スナップショットがあると、操作のエラーが発生してオーバークラウドを元の状態に復元する必要がある場合に役立ちます。

重要

この手順では、不可欠なコントロールプレーンサービスのみが含まれます。コンピュートノードのワークロード、Ceph Storage ノード上のデータ、追加のサービスのバックアップは対象外です。

手順

  1. データベースのバックアップを実行します。

    1. コントロールノードにログインします。オーバークラウドには、アンダークラウドからアクセスできます。

      $ ssh heat-admin@192.0.2.100
    2. root ユーザーに変更します。

      $ sudo -i
    3. バックアップを保管するための一時ディレクトリーを作成します。

      # mkdir -p /var/tmp/mysql_backup/
    4. データベースのパスワードを取得して、MYSQLDBPASS の環境変数に保存します。このパスワードは、 /etc/puppet/hieradata/service_configs.json ファイルの mysql::server::root_password の変数に保管されています。以下のコマンドを使用してパスワードを保管します。

      # MYSQLDBPASS=$(sudo hiera mysql::server::root_password)
    5. データベースをバックアップします。

      # mysql -uroot -p$MYSQLDBPASS -s -N -e "select distinct table_schema from information_schema.tables where engine='innodb' and table_schema != 'mysql';" | xargs mysqldump -uroot -p$MYSQLDBPASS --single-transaction --databases > /var/tmp/mysql_backup/openstack_databases-`date +%F`-`date +%T`.sql

      このコマンドにより、/var/tmp/mysql_backup/openstack_databases-<date>.sql という名前のデータベースバックアップがダンプされます。<date> はシステムの日付と時刻です。このデータベースダンプを安全な場所にコピーします。

    6. ユーザーおよびパーミッションに関する全情報をバックアップします。

      # mysql -uroot -p$MYSQLDBPASS -s -N -e "SELECT CONCAT('\"SHOW GRANTS FOR ''',user,'''@''',host,''';\"') FROM mysql.user where (length(user) > 0 and user NOT LIKE 'root')" | xargs -n1 mysql -uroot -p$MYSQLDBPASS -s -N -e | sed 's/$/;/' > /var/tmp/mysql_backup/openstack_databases_grants-`date +%F`-`date +%T`.sql

      このコマンドにより、/var/tmp/mysql_backup/openstack_databases_grants-<date>.sql という名前のデータベースバックアップがダンプされます。<date> はシステムの日付と時刻です。このデータベースダンプを安全な場所にコピーします。

  2. OpenStack Telemetry データベースをバックアップします。

    1. 任意のコントローラーに接続して、MongoDB のプライマリーインスタンスの IP を取得します。

      # MONGOIP=$(sudo hiera mongodb::server::bind_ip)
    2. バックアップを作成します。

      # mkdir -p /var/tmp/mongo_backup/
      # mongodump --oplog --host $MONGOIP --out /var/tmp/mongo_backup/
    3. /var/tmp/mongo_backup/ 内のデータベースダンプを安全な場所にコピーします。
  3. Redis クラスターをバックアップします。

    1. HAProxy から Redis のエンドポイントを取得します。

      # REDISIP=$(sudo hiera redis_vip)
    2. Redis クラスターのマスターパスワードを取得します。

      # REDISPASS=$(sudo hiera redis::masterauth)
    3. Redis クラスターの接続をチェックします。

      # redis-cli -a $REDISPASS -h $REDISIP ping
    4. Redis データベースをダンプします。

      # redis-cli -a $REDISPASS -h $REDISIP bgsave

      このコマンドにより、データベースのバックアップがデフォルトの /var/lib/redis/ ディレクトリーに保管されます。このデータベースダンプを安全な場所にコピーします。

  4. 各コントローラーノードのファイルシステムをバックアップします。

    1. バックアップ用のディレクトリーを作成します。

      # mkdir -p /var/tmp/filesystem_backup/
    2. 以下の tar コマンドを実行します。

      # tar --ignore-failed-read --xattrs \
          -zcvf /var/tmp/filesystem_backup/fs_backup-`date '+%Y-%m-%d-%H-%M-%S'`.tar.gz \
          /var/lib/config-data \
          /var/log/containers \
          /etc/corosync \
          /etc/logrotate.d \
          /etc/openvswitch \
          /var/log/openvswitch \
          /srv/node \
          /home/heat-admin

      --ignore-failed-read オプションを使用すると、見つからないディレクトリーは無視されます。これは、特定のサービスが使用されていない場合や、独自のカスタムロール上に分離されている場合に役立ちます。

  5. 作成された tar ファイルを安全な場所にコピーします。

2.3. アンダークラウドのマイナーアップデートの実行

director では、アンダークラウドノード上のパッケージを更新するためのコマンドが提供されています。これにより、OpenStack Platform 環境の現在のバージョン内のマイナー更新を実行することができます。

手順

  1. director に stack ユーザーとしてログインします。
  2. python-tripleoclient パッケージと依存関係を更新し、マイナーバージョンの更新向けの最新のスクリプトを使用できるようにします。

    $ sudo yum update -y python-tripleoclient
  3. director は openstack undercloud upgrade コマンドを使用して、アンダークラウドの環境を更新します。以下のコマンドを実行します。

    $ openstack undercloud upgrade
  4. アンダークラウドのアップグレードプロセスが完了するまで待ちます。
  5. アンダークラウドを再起動して、オペレーティングシステムのカーネルとその他のシステムパッケージを更新します。

    $ sudo reboot
  6. ノードが起動するまで待ちます。

2.4. コンテナー化されたオーバークラウドのマイナー更新の実行

director では、全オーバークラウドノード上のパッケージを更新するためのコマンドが提供されています。これにより、OpenStack Platform 環境の現在のバージョン内のマイナー更新を実行することができます。

手順

  1. コンテナー化されたサービスのイメージの最新タグを確認します。

    $ openstack overcloud container image tag discover \
      --image registry.access.redhat.com/rhosp12/openstack-base:latest \
      --tag-from-label version-release

    最も新しいタグを書き留めておきます。

  2. openstack overcloud container image prepare コマンドで、コンテナーイメージのソース用の更新された環境ファイルを作成します。たとえば、 registry.access.redhat.com からのイメージを使用する場合は、以下のコマンドを実行します。

    $ openstack overcloud container image prepare \
      --namespace=registry.access.redhat.com/rhosp12 \
      --prefix=openstack- \
      --tag [TAG] \ 1
      --set ceph_namespace=registry.access.redhat.com/rhceph \
      --set ceph_image=rhceph-2-rhel7 \
      --set ceph_tag=latest \
      --env-file=/home/stack/templates/overcloud_images.yaml \
      -e /home/stack/templates/custom_environment_file.yaml 2
    1
    [TAG] の箇所は、前のステップで取得したタグに置き換えます。
    2
    -e パラメーターで追加の環境ファイルをすべて指定します。director は指定されているすべての環境ファイルでカスタムリソースを確認して、コンテナー化されたサービスに必要なコンテナーイメージを特定します。

    この環境ファイルを異なるソース種別用に生成する方法についての詳しい情報は、『director のインストールと使用方法』ガイドの「コンテナーイメージのソースの設定」を参照してください。

  3. openstack overcloud update stack コマンドを実行して、オーバークラウド内のコンテナーイメージの場所を更新します。

    $ openstack overcloud update stack --init-minor-update \
      --container-registry-file /home/stack/templates/overcloud_images.yaml

    --init-minor-update はオーバークラウドスタック内のパラメーターの更新のみを実行します。実際のパッケージやコンテナーの更新は行いません。このコマンドが完了するまで待ちます。

  4. openstack overcloud update コマンドを使用してパッケージとコンテナーの更新を実行します。--nodes オプションを使用して、各ロールのノードをアップグレードします。たとえば、以下のコマンドは、Controller ロールのノードを更新します。

    $ openstack overcloud update stack --nodes Controller

    以下の順序で、各ロールグループにこのコマンドを実行します。

    • Controller
    • CephStorage
    • Compute
    • ObjectStorage
    • DatabaseMessageBusNetworker などのカスタムロール
  5. 選択したロールの更新プロセスが開始します。director は Ansible playbook を使用して更新を実行し、各タスクの出力を表示します。
  6. 次のロールグループを更新します。全ノードの更新が完了するまで作業を繰り返してください。

2.5. コントローラーノードおよびコンポーザブルノードの再起動

以下の手順では、コントローラーノードと、コンポーザブルロールをベースとするスタンドアロンのノードを再起動します。これには、コンピュートノードと Ceph Storage ノードは含まれません。

手順

  1. ノードを選択してログインします。
  2. ノードを再起動します。

    [heat-admin@overcloud-controller-0 ~]$ sudo reboot
  3. ノードが起動するまで待ちます。
  4. ノードにログインしてサービスをチェックします。以下に例を示します。

    1. ノードが Pacemaker サービスを使用している場合には、ノードがクラスターに再度参加したかどうかを確認します。

      [heat-admin@overcloud-controller-0 ~]$ sudo pcs status
    2. ノードが Systemd サービスを使用している場合には、全サービスが有効化されているかどうかを確認します。

      [heat-admin@overcloud-controller-0 ~]$ sudo systemctl status

2.6. Ceph Storage (OSD) クラスターの再起動

以下の手順では、Ceph Storage (OSD) ノードのクラスターを再起動します。

手順

  1. Ceph MON またはコントローラーノードにログインして、Ceph Storage クラスターのリバランスを一時的に無効にします。

    $ sudo ceph osd set noout
    $ sudo ceph osd set norebalance
  2. 再起動する最初の Ceph Storage ノードを選択して、ログインします。
  3. ノードを再起動します。

    $ sudo reboot
  4. ノードが起動するまで待ちます。
  5. ノードにログインして、クラスターのステータスを確認します。

    $ sudo ceph -s

    pgmap により、すべての pgs が正常な状態 (active+clean) として報告されることを確認します。

  6. ノードからログアウトして、次のノードを再起動し、ステータスを確認します。全 Ceph Storage ノードが再起動されるまで、このプロセスを繰り返します。
  7. 完了したら、Ceph MON またはコントローラーノードにログインして、クラスターのリバランスを再度有効にします。

    $ sudo ceph osd unset noout
    $ sudo ceph osd unset norebalance
  8. 最終のステータスチェックを実行して、クラスターがHEALTH_OK を報告していることを確認します。

    $ sudo ceph status

2.7. コンピュートノードの再起動

以下の手順では、コンピュートノードを再起動します。OpenStackPlatform 環境内のインスタンスのダウンタイムを最小限に抑えるために、この手順には、選択したコンピュートノードからインスタンスを移行するステップも含まれています。これは、以下のワークフローを伴います。

  • 再起動するコンピュートノードを選択して無効にし、新規インスタンスをプロビジョニングしないようにします。
  • インスタンスを別のコンピュートノードに移行します。
  • 空のコンピュートノードを再起動して有効化します。

手順

  1. アンダークラウドに stack ユーザーとしてログインします。
  2. 全コンピュートノードとその UUID を一覧表示します。

    $ source ~/stackrc
    (undercloud) $ openstack server list --name compute

    再起動するコンピュートノードの UUID を特定します。

  3. アンダークラウドから、コンピュートノードを選択し、そのノードを無効にします。

    $ source ~/overcloudrc
    (overcloud) $ openstack compute service list
    (overcloud) $ openstack compute service set [hostname] nova-compute --disable
  4. コンピュートノード上の全インスタンスを一覧表示します。

    (overcloud) $ openstack server list --host [hostname] --all-projects
  5. 以下のコマンドの 1 つを使用して、インスタンスを移行します。

    1. 選択した特定のホストにインスタンスを移行します。

      (overcloud) $ openstack server migrate [instance-id] --live [target-host]--wait
    2. nova-scheduler により対象のホストが自動的に選択されるようにします。

      (overcloud) $ nova live-migration [instance-id]
    3. 一度にすべてのインスタンスのライブマイグレーションを行います。

      $ nova host-evacuate-live [hostname]
      注記

      nova コマンドで非推奨の警告が表示される可能性がありますが、安全に無視することができます。

  6. 移行が完了するまで待ちます。
  7. 正常に移行したことを確認します。

    (overcloud) $ openstack server list --host [hostname] --all-projects
  8. 選択したコンピュートノードのインスタンスがなくなるまで、移行を続けます。
  9. コンピュートノードのログインしてリブートします。

    [heat-admin@overcloud-compute-0 ~]$ sudo reboot
  10. ノードが起動するまで待ちます。
  11. コンピュートノードを再度有効化します。

    $ source ~/overcloudrc
    (overcloud) $ openstack compute service set [hostname] nova-compute --enable
  12. コンピュートノードが有効化されているかどうかを確認します。

    (overcloud) $ openstack compute service list

2.8. アンダークラウドの検証

アンダークラウドの機能を確認する手順を以下に示します。

手順

  1. アンダークラウドのアクセス情報を読み込みます。

    $ source ~/stackrc
  2. エラーが発生している Systemd サービスがあるかどうかを確認します。

    (undercloud) $ sudo systemctl list-units --state=failed 'openstack*' 'neutron*' 'httpd' 'docker'
  3. アンダークラウドの空き領域を確認します。

    (undercloud) $ df -h
  4. アンダークラウド上に NTP をインストールしている場合にはクロックが同期されていることを確認します。

    (undercloud) $ sudo ntpstat
  5. アンダークラウドのネットワークサービスを確認します。

    (undercloud) $ openstack network agent list

    全エージェントが Alive で、それらの状態が UP である必要があります。

  6. アンダークラウドの Compute サービスを確認します。

    (undercloud) $ openstack compute service list

    全エージェントのステータスが enabled で、状態が up である必要があります。

関連情報

  • OpenStack Orchestration (heat) のデータベースで削除済みとマークされている stack のエントリーを完全削除する方法は https://access.redhat.com/solutions/2215131 のソリューションに記載されています。

2.9. コンテナー化されたオーバークラウドの検証

コンテナー化されたオーバークラウドの機能を確認する手順を以下に示します。

手順

  1. アンダークラウドのアクセス情報を読み込みます。

    $ source ~/stackrc
  2. ベアメタルノードのステータスを確認します。

    (undercloud) $ openstack baremetal node list

    全ノードの電源状態が有効で (on)、かつメンテナンスモードが falseである必要があります。

  3. エラーが発生している Systemd サービスがあるかどうかを確認します。

    (undercloud) $ for NODE in $(openstack server list -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo systemctl list-units --state=failed 'openstack*' 'neutron*' 'httpd' 'docker' 'ceph*'" ; done
  4. エラーが発生しているコンテナー化されたサービスがあるかどうかを確認します。

    (undercloud) $ for NODE in $(openstack server list -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo docker ps -f 'exited=1' --all" ; done
    (undercloud) $ for NODE in $(openstack server list -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo docker ps -f 'status=dead' -f 'status=restarting'" ; done
  5. 全サービスへの HAProxy 接続をチェックします。コントロールプレーンの仮想 IP アドレスとhaproxy.stats サービスの認証情報を取得します。

    (undercloud) $ NODE=$(openstack server list --name controller-0 -f value -c Networks | cut -d= -f2); ssh heat-admin@$NODE sudo 'grep "listen haproxy.stats" -A 6 /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg'

    以下の cURL 要求でそれらの情報を使用します。

    (undercloud) $ curl -s -u admin:<PASSWORD> "http://<IP ADDRESS>:1993/;csv" | egrep -vi "(frontend|backend)" | awk -F',' '{ print $1" "$2" "$18 }'

    <PASSWORD><IP ADDRESS> は、haproxy.stats サービスからのそれぞれの情報に置き換えます。その結果表示される一覧には、各ノード上の OpenStackPlatform サービスとそれらの接続ステータスが表示されます。

  6. オーバークラウドデータベースのレプリケーションの正常性をチェックします。

    (undercloud) $ for NODE in $(openstack server list --name controller -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo docker exec clustercheck clustercheck" ; done
  7. RabbitMQ クラスターの正常性を確認します。

    (undercloud) $ for NODE in $(openstack server list --name controller -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo docker exec $(ssh heat-admin@$NODE "sudo docker ps -f 'name=.*rabbitmq.*' -q") rabbitmqctl node_health_check" ; done
  8. Pacemaker リソースの正常性を確認します。

    (undercloud) $ NODE=$(openstack server list --name controller-0 -f value -c Networks | cut -d= -f2); ssh heat-admin@$NODE "sudo pcs status"

    以下の点を確認します。

    • 全クラスタノードが online であること
    • いずれのクラスターノード上でも stopped のリソースがないこと
    • pacemaker で failed のアクションがないこと
  9. 各オーバークラウドノードでディスク領域を確認します。

    (undercloud) $ for NODE in $(openstack server list -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo df -h --output=source,fstype,avail -x overlay -x tmpfs -x devtmpfs" ; done
  10. オーバークラウドの Ceph Storage クラスターの正常性を確認します。以下のコマンドを使用すると、コントローラーノード上で ceph ツールが実行されて、クラスターをチェックします。

    (undercloud) $ NODE=$(openstack server list --name controller-0 -f value -c Networks | cut -d= -f2); ssh heat-admin@$NODE "sudo ceph -s"
  11. Ceph Storage OSD に空き領域があるかどうかを確認します。以下のコマンドを使用すると、コントローラーノード上で ceph ツールが実行され、空き領域をチェックします。

    (undercloud) $ NODE=$(openstack server list --name controller-0 -f value -c Networks | cut -d= -f2); ssh heat-admin@$NODE "sudo ceph df"
  12. オーバークラウドノードでクロックが同期されていることを確認します。

    (undercloud) $ for NODE in $(openstack server list -f value -c Networks | cut -d= -f2); do echo "=== $NODE ===" ; ssh heat-admin@$NODE "sudo ntpstat" ; done
  13. オーバークラウドのアクセス情報を読み込みます。

    (undercloud) $ source ~/overcloudrc
  14. オーバークラウドのネットワークサービスを確認します。

    (overcloud) $ openstack network agent list

    全エージェントが Alive で、それらの状態が UP である必要があります。

  15. オーバークラウドの Compute サービスを確認します。

    (overcloud) $ openstack compute service list

    全エージェントのステータスが enabled で、状態が up である必要があります。

  16. オーバークラウドのボリュームサービスを確認します。

    (overcloud) $ openstack volume service list

    全エージェントのステータスが enabled で、状態が up である必要があります。

関連情報