Переход сервисов nova с pike на train

Для начала необходимо создать чистый контейнер Ubuntu 18.04

apt install -y jq

Перенос настроек из старого контейнера

Далее, идут команды, которые надо запускать в новом контейнере.

lxc-attach -n CMPT-0201
export service=nova; useradd --uid 995 --home-dir /var/lib/${service} --create-home --system --shell /bin/false ${service}

apt update
apt install -y git vim netcat sockstat apache2 libapache2-mod-wsgi novnc
apt install -y python python-pip python-six python-memcache python-openstackclient python-zunclient python-pymysql python-novnc

for dd in /var/lib/nova/tmp /var/log/nova /etc/nova; do mkdir $dd; chown nova:nova $dd; done
echo -e "ServerName CMPT-0201" >> /etc/apache2/apache2.conf

Все настройки перенесем с помощью скрипта, который надо запустить из хоста.

#!/bin/bash
OLD_CNT="CMPT-0001"
NEW_CNT="CMPT-0201"
OLD_IP="192.168.30.21"
NEW_IP="192.168.30.22"

NCFL="
/usr/local/bin/nova-ctl
/root/admin-openrc
/root/demo-openrc
/root/.vimrc
/etc/apache2/sites-available/nova-metadata.conf
/etc/apache2/sites-available/nova-placement-api.conf
/etc/apache2/sites-available/nova-api.conf
"
for NCF in $NCFL; do
  cp /var/lib/lxc/$OLD_CNT/rootfs/$NCF /var/lib/lxc/$NEW_CNT/rootfs/$NCF
done

cp -rpv /var/lib/lxc/$OLD_CNT/rootfs/etc/nova/* /var/lib/lxc/$NEW_CNT/rootfs/etc/nova/
cp -rpv /var/lib/lxc/$OLD_CNT/rootfs/etc/systemd/system/nova-*.service /var/lib/lxc/$NEW_CNT/rootfs/etc/systemd/system/
sed -i 's/'${OLD_IP}'/'${NEW_IP}'/g' /var/lib/lxc/$NEW_CNT/rootfs/etc/nova/nova.conf

Установка сервисов nova

Ставим компоненты nova/train из исходного кода:

cd /opt
git clone https://opendev.org/openstack/nova.git -b stable/train
pip install -r requirements.txt
python setup.py install

a2ensite nova-placement-api
# эти сервисы через
a2dissite nova-metadata
a2dissite nova-api

systemctl restart apache2

pip uninstall SQLAlchemy
pip install SQLAlchemy==1.3.0

nova-ctl enable
nova-ctl start
nova-ctl status

Проверяем клиента openstack

openstack
ImportError: No module named queue

Надо исправить импорт queue в двух файлах

sed -i  's/import queue/import Queue as queue/g' /usr/local/lib/python2.7/dist-packages/openstack/cloud/openstackcloud.py
sed -i  's/import queue/import Queue as queue/g' /usr/local/lib/python2.7/dist-packages/openstack/utils.py

После этого openstack client начнет работать

Поставим еще и zunclient:

apt install python-zunclient

Ошибка nova-compute

После установки nova-компонентов из исходного кода, модуль nova-manage выдает ошибку:

File "/usr/local/lib/python3.6/dist-packages/eventlet/hubs/__init__.py", line 96, in use_hub
    hubclass = getattr(mod, classname or 'Hub')
AttributeError: module 'oslo_service' has no attribute 'service_hub'

Чтобы ее исправить, надо заполнить пустой файл

/usr/local/lib/python3.6/dist-packages/oslo_service/__init__.py

Вот этот код надо добавить:

import os

import eventlet.patcher
from oslo_log import log as logging

time = eventlet.patcher.original('time')

LOG = logging.getLogger(__name__)

# TODO(bnemec): When we have a minimum dependency on a version of eventlet
# that uses monotonic by default, remove this monkey patching.
if hasattr(time, 'monotonic'):
    # Use builtin monotonic clock, Python 3.3+
    _monotonic = time.monotonic
else:
    import monotonic
    _monotonic = monotonic.monotonic

def service_hub():
    # NOTE(dims): Add a custom impl for EVENTLET_HUB, so we can
    # override the clock used in the eventlet hubs. The default
    # uses time.time() and we need to use a monotonic timer
    # to ensure that things like loopingcall work properly.
    hub = eventlet.hubs.get_default_hub().Hub()
    hub.clock = _monotonic
    # get_default_hub() will return a hub that is supported on this platform
    hub.is_available = lambda: True
    return hub

os.environ['EVENTLET_HUB'] = 'oslo_service:service_hub'

Код взят отсюда: https://opendev.org/openstack/oslo.service/src/commit/e86fb9dcce7f872c718829b416a1c8484fc4e962/oslo_service/__init__.py

pymysql

Далее команда nova-manage db version сообщит, что нет модуля pymysql. Ставим его:

pip install pymysql

Модернизация БД

Проверим версию БД nova

su -s /bin/sh -c 'nova-manage db version' nova
378
su -s /bin/sh -c 'nova-manage api_db version' nova
58

378 - это версия БД nova для релиза queens

Обновляем и вновь проверим:

su -s /bin/sh -c 'nova-manage api_db sync' nova
su -s /bin/sh -c 'nova-manage api_db version' nova
67
su -s /bin/sh -c 'nova-manage db sync' nova
su -s /bin/sh -c 'nova-manage db version' nova
xxx

Тестирование новых сервисов

Прежде чем переключаться на новую версию контейнера (и всех сервисов nova), надо удостовериться, что они работают.

nova-ctl status

nova-api

При запуске в логе следующие ошибки:

ERROR stevedore.extension [-] Could not load 'oslo_cache.etcd3gw': No module named 'etcd3gw': ModuleNotFoundError: No module named 'etcd3gw'
2021-05-28 07:43:20.208 17170 ERROR stevedore.extension [-] Could not load 'oslo_cache.memcache_pool': No module named 'memcache': ModuleNotFoundError: No module named 'memcache'

ERROR stevedore.extension [-] Could not load 'oslo_cache.memcache_pool': No module named 'dataclasses': ModuleNotFoundError: No module named 'dataclasses'

Ставим недостающие модули pip:

pip install memcache
pip install etcd3gw
pip install dataclasses
## for nova-conductor
pip install monotonic

nova-scheduler

Ошибка в логе:

CRITICAL nova [req-02a6eee8-6f60-408b-b2fa-4434b7a02a38 - - - - -] Unhandled error: nova.exception.SchedulerHostFilterNotFound: Scheduler Host Filter RamFilter, CoreFilter could not be found.

Убираем в /etc/nova/nova.conf:

[filter_scheduler]
#enabled_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,CoreFilter,NUMATopologyFilter,AggregateInstanceExtraSpecsFilter
enabled_filters = RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,NUMATopologyFilter,AggregateInstanceExtraSpecsFilter

nova-console

mv /etc/systemd/system/nova-consoleauth.service /etc/systemd/system/nova-console.service

Исправить код юнита /etc/systemd/system/nova-console.service:

[Unit]
Description=nova-console

[Service]
WorkingDirectory=/usr/local/bin
User=nova
Group=nova
ExecStart=/usr/bin/python nova-console --config-file=/etc/nova/nova.conf
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Запускаем:

systemctl daemon-reload
systemctl enable nova-console
systemctl start nova-console

Сообщение:

Deprecated: Option "vncserver_listen" from group "vnc" is deprecated. Use option "server_listen" from group "vnc".

Переименовал опцию vncserver_listen на server_listen.

nova-novncproxy

Can not find html/js files at /usr/share/novnc

Ставим недостающий пакет

apt install -y novnc

Установка placement

placement по-другому в train реализован https://docs.openstack.org/placement/train/install/

его вынесли из состава nova в отдельный репозиторий.

Добавляем пользователя:

export service=placement; useradd --uid 986 --home-dir /var/lib/${service} --create-home --system --shell /bin/false ${service}

Делаем каталоги и права:

for dd in /opt/placement /var/lib/placement /var/log/placement /etc/placement; do mkdir $dd; chown placement:placement $dd; done

Ставим из исходников:

cd /opt
git clone https://opendev.org/openstack/placement.git -b stable/train
cd placement
python setup.py install

Генерируем конфигурационные файлы:

su -s /bin/sh -c "oslo-config-generator --config-file etc/placement/config-generator.conf" placement
pip install osprofiler
cp etc/placement/placement.conf.sample /etc/placement/placement.conf
chown placement:placement /etc/placement/placement.conf

Заполняем /etc/placement/placement.conf

[DEFAULT]

[api]
auth_strategy = keystone

[cors]

[keystone_authtoken]
auth_uri = http://10.10.31.2:5000/v3
memcached_servers = 192.168.30.18:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = zbiES8XqOm6Tb

[oslo_policy]
[placement]

[placement_database]
connection = mysql+pymysql://placement:yoo9iY7o@192.168.30.2/placement

[profiler]

Настройка apache wsgi

mv /etc/apache2/sites-available/nova-placement-api.conf  /etc/apache2/sites-available/placement-api.conf

Приводим к placement-api.conf к виду

Listen 8778
<VirtualHost *:8778>
   WSGIDaemonProcess placement processes=5 threads=1 user=nova group=nova display-name=%{GROUP}
   WSGIProcessGroup placement
   WSGIScriptAlias / /usr/local/bin/placement-api
   WSGIApplicationGroup %{GLOBAL}
   WSGIPassAuthorization On
   ErrorLogFormat "%{cu}t %M"
   ErrorLog /var/log/apache2/placement-api-err.log
   CustomLog /var/log/apache2/placement-api-acc.log combined

   <Directory /usr/local/bin>
        Require all granted
   </Directory>

</VirtualHost>

Меняем имя конфигрурации

a2dissite nova-placement-api
a2ensite placement-api
systemctl restart apache2

БД placement

create database placement default character set utf8;
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'yoo9iY7o';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'yoo9iY7o';
flush privileges;

Заполняем БД placement

su -s /bin/sh -c "placement-manage db sync" placement
su -s /bin/sh -c "placement-manage db version" placement
b5c396305c25
MariaDB [placement]> show tables;
+------------------------------+
| Tables_in_placement          |
+------------------------------+
| alembic_version              |
| allocations                  |
| consumers                    |
| inventories                  |
| placement_aggregates         |
| projects                     |
| resource_classes             |
| resource_provider_aggregates |
| resource_provider_traits     |
| resource_providers           |
| traits                       |
| users                        |
+------------------------------+
12 rows in set (0.00 sec)
su -s /bin/sh -c "placement-status upgrade check" placement
+----------------------------------+
| Upgrade Check Results            |
+----------------------------------+
| Check: Missing Root Provider IDs |
| Result: Success                  |
| Details: None                    |
+----------------------------------+
| Check: Incomplete Consumers      |
| Result: Success                  |
| Details: None                    |
+----------------------------------+

....

Переключаемся на новые версии nova

Меняем IP-адрес контейнера CMPT в haproxy-контейнере (HPRX-0001)

cd /etc/haproxy
cp haproxy.cfg haproxy-1.cfg
sed -i 's/192.168.30.21/192.168.30.22/g' haproxy.cfg
systemctl restart haproxy
openstack compute service list