そろそろOpenStackの環境を更新しようと。
こことここにならってコンポーネント毎にアップグレードを行っていく。
オフィシャルでは始める前にsytemdのスナップショットをとれとあるが,そんなオプションはないと怒られる・・・。もう廃止されたオプションなのか???ググっても情報見つけられず。
Before updating, take a
systemd
snapshot of the OpenStack services:https://www.rdoproject.org/install/upgrading-rdo-1/# systemctl snapshot openstack-services
とりあえずこの手順を飛ばし,以下流れで進めていく。
- OpenStackサービスの停止
- アップグレード
- DBの同期
- OpenStackサービス起動
OpenStackサービスの停止
# systemctl stop 'openstack-*'
# systemctl stop 'neutron-*'
# systemctl stop 'openvswitch'
上記で停止するのは以下ユニット
openstack-aodh-evaluator.service
openstack-aodh-listener.service
openstack-aodh-notifier.service
openstack-ceilometer-notification.service
openstack-ceilometer-polling.service
openstack-cinder-api.service
openstack-cinder-backup.service
openstack-cinder-scheduler.service
openstack-cinder-volume.service
openstack-glance-api.service
openstack-losetup.service
openstack-nova-compute.service
openstack-nova-conductor.service
openstack-nova-novncproxy.service
openstack-nova-scheduler.service
openstack-swift-account-auditor.service
openstack-swift-account-reaper.service
openstack-swift-account-replicator.service
openstack-swift-account.service
openstack-swift-container-auditor.service
openstack-swift-container-replicator.service
openstack-swift-container-sync.service
openstack-swift-container-updater.service
openstack-swift-container.service
openstack-swift-object-auditor.service
openstack-swift-object-expirer.service
openstack-swift-object-reconstructor.service
openstack-swift-object-replicator.service
openstack-swift-object-updater.service
openstack-swift-object.service
openstack-swift-proxy.service
neutron-ovn-metadata-agent.service
neutron-server.service
openvswitch.service
アップグレード
# dnf install -y https://www.rdoproject.org/repos/rdo-release.rpm
# dnf update
DBの同期
# su -s /bin/sh -c "keystone-manage db_sync" keystone
# su -s /bin/sh -c "glance-manage db_sync" glance
# su -s /bin/sh -c "cinder-manage db sync" cinder
# su -s /bin/sh -c "neutron-db-manage upgrade heads" neutron
# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
# su -s /bin/sh -c "nova-manage --config-file /etc/nova/nova.conf cell_v2 create_cell --name=cell1 --verbose" nova
# su -s /bin/sh -c "nova-manage db sync" nova
# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
# nova-manage cell_v2 list_cells
# su -s /bin/sh -c "nova-manage cell_v2 map_instances --cell_uuid <cell UUID>" nova
# su -s /bin/sh -c "nova-manage api_db sync" nova
うちの環境特有かもしれないが,httpdもアップグレードされ,デフォルトのssl.confが作成されているので削除。
# rm /etc/httpd/conf.d/ssl.conf
OpenStackサービス起動
再起動して完了。
と,思いきややはりというかエラーで起動しない。
エラー1つめ(nova)
コンピュートのバージョンが古すぎる?
こんなログがnova-scheduler.logに出てNG。
ERROR nova File "/usr/lib/python3.6/site-packages/nova/utils.py", line 1100, in raise_if_old_compute
ERROR nova oldest_supported_service=oldest_supported_service_level)
ERROR nova nova.exception.TooOldComputeService: Current Nova version does not support computes older than Xena but the minimum compute service level in your system is 56 and the oldest supported service level is 57.
QからYはサポート外なのか???とりあえずutils.pyの1100行目を見てみるとバージョン判定箇所らしい。私の力ではこれ以上解析が無理なので力業でコメントアウト。
1095 if current_service_version < oldest_supported_service_level:
1096 # raise exception.TooOldComputeService(
1097 # oldest_supported_version=service.OLDEST_SUPPORTED_SERVICE_VERSION,
1098 # scope=scope,
1099 # min_service_level=current_service_version,
1100 # oldest_supported_service=oldest_supported_service_level)
1101 return
novaはこれで起動したw (今はこれでいいんだ)
エラー2つ目(neutronというかopenvswitch)
openvswichの6642に接続できないというエラーを吐いてNeutronも起動しない。ovn-northd.serviceが起動していなかったので起動したらここはクリアになった。
終わらないトラブル
無事にアップデート前の状態までもっていくことが出来たと思いきや,インスタンスは起動するものの外部ネットワークへ繋がらない問題発生。新しいインスタンスを作成してみるもエラー,既存のインスタンスを削除しようにもエラー。ログを見ると「’c.consumer_type_id という知らない引数が渡されている」的なメッセージが出ていた。ググってみるとどうやらPlacement関連で何か引っかかっている模様。そういえばplacementのDB同期はやっていなかった。ひとまずインスタンスは空にして今の環境で作り直すとする。
必要なインスタンスだけスナップショットをとり,DBから直接インスタンスを削除してから↓。
# placement-manage db sync
インスタンス作成→失敗・・・orz。インスタンス削除 → 成功 !一歩前進。DB直でいじったからインスタンス割り当たっているけどDBに無いよというエラーメッセージが永遠と出る。対処法はこれ。
$ pip install osc-placement # resourceオプションがなかったから入れる
$ openstack resource provider list # compute nodeのUUID確認
$ openstack resource provider show --allocations <UUID> # ServerのUUID確認(念のためエラーメッセージのUUIDと同じか確認)
$ openstack resource provider allocation delete <Server UUID>
nova周りはさらにエラーは続き,Neutron周りでもエラーが出続ける。
ERROR ovsdbapp.backend.ovs_idl.command [-] Error executing command (DbAddCommand): ovsdbapp.backend.ovs_idl.idlutils.RowNotFound: Cannot find Chassis_Private with name=xxx
色々ググったあげく,Southband側の問題のように見えたのでovs-sbなんたらとかでいじっていると,そもそもSouthband側が機能していないことに気づき,以下で解決した。
# systemctl start ovn-controller.service
アップグレード前と後でサービスの起動ってこんなに違ったかしら・・・・?
要らないと思っていたsystemctlのSnapshot,必要だったかもしれない・・・。
一応すったもんだ丸2日かかったけれど,無事にYogaへアップグレード完了した。
まとまっていないが,何年か後に自分が見直すためのメモとして。