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へアップグレード完了した。

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

PPPoE LAN型払い出し設定

よくあるフレッツ系回線収容するときにPPPoE IP8で契約してルータなりFWなりで受ける構成を組むときのメモ。IOSはそれなりにやっているから良いとして,SRXやFortigateで最近構築することがあるのでメモを残す。

LAN払い出し型の場合,ルータ単体では実装は難しい(というか無理)なようで別途RADIUSサーバを準備する必要がある。(TACACS+でもいけるかなと思ったが,RAIDUSの「Framed-IP-Address/Framed-IP-Netmask」に該当するものが見当たらなかったので素直にFreeradiusをDebianに入れることにした。)

FreeRADIUS準備

Debian10にfreeradiusを入れる。公式を見ると4.0はめちゃくちゃ面倒だからただ使いなら3.xつかえとあったのでそれに従う。

参考) https://networkradius.com/packages/#fr32-debian-buster

# apt install freeradius -y

結構時間がかかるけれど,これで完了。次にclient.confの編集。

# vi /etc/freeradius/3.0/client.conf
# 以下追加
client 192.168.1.3 {                         # PPPoEサーバのIPアドレス
        secret = secret-key                  # 認証用Key
}

続いてPPP認証用のユーザ設定。

# vi /etc/freeradius/3.0/user
# 以下追加
radius-user Cleartext-Password := "rad-secret"
        Service-Type = Framed-User,
        Framed-Protocol = PPP,
        Framed-IP-Address = 10.10.10.1,
        Framed-IP-Netmask = 255.255.255.248

RADIUS再起動。

# systemctl restart freeradius

PPPoEサーバ準備

次にIOS XE17系でPPPoEサーバの準備。(以下抜粋)

radius server FreeRadius
 address ipv4 <radiusのIP> auth-port 1812 acct-port 1813
 key secret-key
!
aaa new-model
!
!
aaa group server radius PPPoE
 server name FreeRadius
 ip radius source-interface GigabitEthernet0/4
!

aaa authentication ppp default group PPPoE
aaa authorization network default group PPPoE
aaa accounting network default start-stop group PPPoE
!

bba-group pppoe FLETS
 virtual-template 1
!
interface Loopback1
 ip address 172.17.1.1 255.255.255.0
!
interface GigabitEthernet1                   # RADIUSサーバと通信するIF
 ip address 192.168.1.3 255.255.255.0
 duplex auto
 speed auto
!
interface GigabitEthernet3                   # PPPoE接続用IF
 no ip address
 duplex auto
 speed auto
 pppoe enable group FLETS
!
interface Virtual-Template1
 mtu 1454
 ip unnumbered Loopback1
 ppp authentication chap
!

PPPoEクライアント設定

IOS 15.x系

interface GigabitEthernet0/0
 no ip address
 pppoe enable group global
 pppoe-client dial-pool-number 1
!
interface GigabitEthernet0/1
 ip address 10.10.10.1 255.255.255.248
!
interface Dialer0
 ip unnumbered GigabitEthernet0/1
 encapsulation ppp
 dialer pool 1
 dialer-group 1
 ppp authentication chap callin
 ppp chap hostname radius-user
 ppp chap password 0 rad-secret
!
ip route 0.0.0.0 0.0.0.0 Dialer0
!
dialer-list 1 protocol ip permit

JUNOS

このまんま。

set interfaces ge-0/0/0 unit 0 encapsulation ppp-over-ether
set interfaces ge-0/0/1 unit 0 family inet address 10.10.10.1/29
set interfaces fxp0 unit 0
set interfaces pp0 unit 1 ppp-options chap default-chap-secret "$9$eZBMxdbwgZGiN-kP5Q9CuO1Ervx7V2oG"
set interfaces pp0 unit 1 ppp-options chap local-name radius-user
set interfaces pp0 unit 1 ppp-options chap passive
set interfaces pp0 unit 1 pppoe-options underlying-interface ge-0/0/0.0
set interfaces pp0 unit 1 pppoe-options auto-reconnect 10
set interfaces pp0 unit 1 pppoe-options client
set interfaces pp0 unit 1 family inet unnumbered-address ge-0/0/1.0
set routing-options static route 0.0.0.0/0 next-hop pp0.1

Fortigate

WANのインタフェースにネットワークアドレス部分を入れないと駄目のようで,設定上気持ちが悪い。(が仕方が無いらしい)

system_interface:
    - wan:
        vdom: "FG-traffic"
        mode: pppoe
        allowaccess: ping
        type: physical
        lldp-reception: disable
        role: wan
        snmp-index: 1
        ipunnumbered: 10.10.10.0
        username: "radius-user"
        pppoe-unnumbered-negotiate: disable
        password: ENC xxxx
    - internal:
        vdom: "FG-traffic"
        ip: 10.10.10.1 255.255.255.248
        allowaccess: ping
        type: hard-switch
        device-identification: enable
        lldp-reception: disable
        lldp-transmission: disable
        role: lan
        snmp-index: 10

なお,PPPoEではないが,この構成でIPSecを行う際に送信元IPの指定がGUIでは「Local ID」しか設定することができず,CLIで「localid-type」を「address」に指定しないとPhase1の認証がこける。ここでハマって1日費やした。