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

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

Copy
apt install -y jq

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

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

Copy
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

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

Copy
#!/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 из исходного кода:

Copy
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

Copy
openstack ImportError: No module named queue

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

Copy
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:

Copy
apt install python-zunclient

Ошибка nova-compute

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

Copy
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'

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

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

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

Copy
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. Ставим его:

Copy
pip install pymysql

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

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

Copy
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

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

Copy
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), надо удостовериться, что они работают.

Copy
nova-ctl status

nova-api

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

Copy
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:

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

nova-scheduler

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

Copy
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:

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

nova-console

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

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

Copy
[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

Запускаем:

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

Сообщение:

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

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

nova-novncproxy

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

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

Copy
apt install -y novnc

Установка placement

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

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

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

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

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

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

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

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

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

Copy
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

Copy
[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

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

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

Copy
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>

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

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

БД placement

Copy
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

Copy
su -s /bin/sh -c "placement-manage db sync" placement su -s /bin/sh -c "placement-manage db version" placement b5c396305c25
Copy
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)
Copy
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)

Copy
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
Copy
openstack compute service list