RDO(All-in-One)アップグレード(Queens→Yoga)

そろそろOpenStackの環境を更新しようと。

ここここにならってコンポーネント毎にアップグレードを行っていく。

オフィシャルでは始める前にsytemdのスナップショットをとれとあるが,そんなオプションはないと怒られる・・・。もう廃止されたオプションなのか???ググっても情報見つけられず。

Before updating, take a systemd snapshot of the OpenStack services:

# systemctl snapshot openstack-services
https://www.rdoproject.org/install/upgrading-rdo-1/

とりあえずこの手順を飛ばし,以下流れで進めていく。

  1. OpenStackサービスの停止
  2. アップグレード
  3. DBの同期
  4. 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へアップグレード完了した。

まとまっていないが,何年か後に自分が見直すためのメモとして。

RDOインストールメモ(RHEL8)

参考

https://www.rdoproject.org/install/packstack/

基本的に公式の手順にならって進める。

接続イメージ

事前準備

/etc/environment に以下追加。

LANG=en_US.utf-8
LC_ALL=en_US.utf-8

network周りの準備

network-scripts インストール,Network Manager 無効化,Firewalld無効化,SELinux無効化。

# dnf install network-scripts
# systemctl disable firewalld
# systemctl stop firewalld
# systemctl disable NetworkManager
# systemctl stop NetworkManager
# systemctl enable network
# systemctl start network

teaming設定

NetworkManagerを無効化したため,/etc/sysconfig/network-scripts 配下に以下ファイル作成&編集。

ifcfg-team0

DEVICE=team0
DEVICETYPE=Team
ONBOOT=yes
BOOTPROTO=none
TEAM_CONFIG='{"runner": {"name": "lacp", "active": true, "fast_rate": true, "tx_hash": ["eth", "ipv4"]}, "link_watch": {"name": "ethtool"}}'

ifcfg-enp1s0f0

NAME=enp1s0f0
DEVICE=enp1s0f0
ONBOOT=yes
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio": 0}'

ifcfg-enp1s0f1

NAME=enp1s0f1
DEVICE=enp1s0f1
ONBOOT=yes
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio":0}'

ifup team0で リンクアップさせ,ステータスを確認。

# ifup tema0
# teamdctl team0 state
setup:
  runner: lacp
ports:
  enp1s0f0
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 2
    runner:
      aggregator ID: 5, Selected
      selected: yes
      state: current
  enp1s0f1
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 2
    runner:
      aggregator ID: 5, Selected
      selected: yes
      state: current
runner:
  active: yes
  fast rate: yes

VLAN設定

team0ではVLAN trunk(802.1Q)で複数の外部ネットワークを指定できるようにしたいので,VLAN設定を行う。

# modprobe 8021q
# lsmod | grep 8021q
8021q                  40960  0
garp                   16384  1 8021q
mrp                    20480  1 8021q

外部ネットワーク用にteam0を割り当てるため,ifcfg-team0にOVS用の設定。

DEVICE=team0
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br_ex
ONBOOT=yes
BOOTPROTO=none
TEAM_CONFIG='{"runner": {"name": "lacp", "active": true, "fast_rate": true, "tx_hash": ["eth", "ipv4"]}, "link_watch": {"name": "ethtool"}}'

インストール

RDOリポジトリインストール & サブスクリプションでcodeready-builderを有効化。

# dnf install -y https://www.rdoproject.org/repos/rdo-release.el8.rpm
# subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms

パッケージの更新。

# dnf update

Packstack installerのインストール。

# dnf install openstack-packstack

インストール。

#  packstack --allinone --provision-demo=n --os-neutron-ovn-bridge-mappings=extnet:br-ex --os-neutron-ovn-bridge-interfaces=br-ex:team0

VLANの設定が入っていなかったのでml2_config.iniを編集。

[ml2]
type_drivers=geneve,flat,vlan   #vlan追加
tenant_network_types=geneve
mechanism_drivers=ovn
path_mtu=0
extension_drivers=port_security,qos

[securitygroup]
enable_security_group=True

[ml2_type_geneve]
max_header_size=38
vni_ranges=10:100

[ml2_type_flat]
flat_networks=*

# ↓追記
[ml2_type_vlan]
# VLAN IDを指定しなければ任意のVLANを通せる
network_vlan_ranges=extnet

<略>

ip a で見るといけているっぽい。

10: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP group default qlen 1000

openstack環境構築

ネットワークの作成

外部ネットワーク作成

まずは外部との接点となる外部ネットワークの作成。今回はスイッチ上でVLAN100で設定している192.168.1.0/24を指定する。(相変わらずOpenstackのネットワークの作成→サブネットの作成という流れに違和感を覚える。あまりネットワークにサブネットをぶら下げるメリットがあるようには思えないのだけど,この設計思想は一体どこからきたんだろうか・・・。)

openstack用に割り当てたレンジ(192.168.1.120~192.168.1.129)をDHCPのレンジで設定する。

$ openstack network create --provider-network-type vlan --external --provider-physical-network extnet --provider-segment 100 --share VLAN100
$ openstack subnet create --network VLAN100 --subnet-range 192.168.1.0/24 --dhcp --gateway 192.168.1.1 --allocation-pool start=192.168.1.120,end=192.168.1.129 --dns-nameserver 1.1.1.1 subnet_V100

内部ネットワーク作成

続いて内部ネットワークの作成。172.16.1.0/24,GWは末尾1,DHCPプールは50~100とした。

$ openstack network create internal01
$ openstack subnet create --network internal01 --gateway 172.16.1.1 --subnet-range 172.16.1.0/24 --dhcp --dns-nameserver 1.1.1.1 --allocation-pool start=172.16.1.50,end=172.16.1.100  subnet01

ルータ作成

最後にルータの作成,外部ネットワークの接続,内部ネットワークの接続。

$ openstack router create ext-router
$ openstack router set --external-gateway VLAN100 --enable-snat --fixed-ip ip-address=192.168.1.4 ext-router
$ openstack router add subnet ext-router subnet01

シンプルな構成のできあがり。

外部と内部をルータでつなげただけの構成

イメージ作成

テスト用にcirrosのイメージを作成。ここからwgetで持ってきて,7zを解答。vmdkファイルを結合してqcow2へ変換する。

$ qemu-img convert -O qcow2 ./Kali-Linux-2021.2-vmware-amd64.vmdk kali-linux-2021.2.qcow2
$ openstack image create "cirros" --file ./cirros-0.5.2-x86_64-disk.img --disk-format qcow2 --container-format bare --public

インスタンスの起動はダッシュボードからポチポチやって(ここは省略),無事に起動確認。(そういえば,デフォルトパスワードがUS配列の影響をうけないものに変わって嬉しいw)

無事にpingも通った。