Переход сервисов nova с pike на train
Для начала необходимо создать чистый контейнер Ubuntu 18.04
Перенос настроек из старого контейнера
Далее, идут команды, которые надо запускать в новом контейнере.
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
Надо исправить импорт 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:
Ошибка 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'
Чтобы ее исправить, надо заполнить пустой файл
Вот этот код надо добавить:
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. Ставим его:
Модернизация БД
Проверим версию БД 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-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
Исправить код юнита /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
Запускаем:
Сообщение:
Deprecated: Option "vncserver_listen" from group "vnc" is deprecated. Use option "server_listen" from group "vnc".
Переименовал опцию vncserver_listen на server_listen.
nova-novncproxy
Ставим недостающий пакет
Установка 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>
Меняем имя конфигрурации
БД 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)