OpenStack Nova

Самое сердце OpenStack - сервис, отвечающий за работу ВМ на конечных нодах.

Подготовка

Создаём несколько БД

  • nova_api - под API
  • nova - под сам сервис
  • nova_cell0 - модный функционал, позволяющий объединять кластера под один оркестратор
  • placement

Теперь заводим пользователя, сервис и endpoint в keystone

# openstack user create --domain owlhost --password-prompt nova
# openstack role add --project service --user nova admin
# openstack service create --name nova --description "OpenStack Compute" compute
# openstack endpoint create --region RegionOne compute public http://mgt1.cloud.ow1.in:8774/v2.1
# openstack endpoint create --region RegionOne compute internal http://mgt1.cloud.ow1.in:8774/v2.1
# openstack endpoint create --region RegionOne compute admin http://mgt1.cloud.ow1.in:8774/v2.1

А так же нам потребуется завести placement

# openstack user create --domain owlhost --password-prompt placement
# openstack role add --project service --user placement admin
# openstack service create --name placement --description "Placement API" placement
# openstack endpoint create --region RegionOne placement public http://mgt1.cloud.ow1.in:8778
# openstack endpoint create --region RegionOne placement internal http://mgt1.cloud.ow1.in:8778
# openstack endpoint create --region RegionOne placement admin http://mgt1.cloud.ow1.in:8778

Установка менеджмент ноды

Здесь будет много пакетов

# yum install openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api

И теперь корячим конфиг

/etc/nova/nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@mgt1.cloud.ow1.in
my_ip =  10.22.1.1 # Здесь должен быть адрес ноды
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
 
[database]
connection = postgresql+psycopg2://openstack:DBPASS@mgt1.cloud.ow1.in/nova
 
[api_database]
connection = postgresql+psycopg2://openstack:DBPASS@mgt1.cloud.ow1.in/nova_api
 
[placement_database]
connection = postgresql+psycopg2://openstack:DBPASS@mgt1.cloud.ow1.in/placement
 
[api]
auth_strategy = keystone
 
[keystone_authtoken]
www_authenticate_uri  = http://mgt1.cloud.ow1.in:5000
auth_url = http://mgt1.cloud.ow1.in:5000
memcached_servers = mgt1.cloud.ow1.in:11211
auth_type = password
project_domain_name = owlhost
user_domain_name = owlhost
project_name = service
username = nova
password = NOVA_PASS
 
[neutron]
url = http://mgt1.cloud.ow1.in:9696
auth_url = http://mgt1.cloud.ow1.in:5000
auth_type = password
project_domain_name = owlhost
user_domain_name = owlhost
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
 
 
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
vncserver_listen = 0.0.0.0
novncproxy_base_url = http://ext-mgt1.cloud.ow1.in:6080/vnc_auto.html
 
[glance]
api_servers = http://mgt1.cloud.ow1.in:9292
 
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
 
[placement]
region_name = RegionOne
project_domain_name = owlhost
project_name = service
auth_type = password
user_domain_name = owlhost
auth_url = http://mgt1.cloud.ow1.in:5000
username = placement
password = PLACEMENT_PASS

Поскольку вместе apache/httpd мы используем связку uwsgi + nginx - делаем ещё приложение и проксинруем на него из nginx

/etc/uwsgi.d/nova-placement-api.ini
[uwsgi]
wsgi-file = /usr/bin/nova-placement-api
processes = 4
uid = nova
thunder-lock = True
lazy-apps = True
name = nova-placement-api
gid = nova
master = True
plugins = python
buffer-size = 65535
enable-threads = True
socket = 127.0.0.1:8779
/etc/nginx/conf.d/nova-placement-api.conf
server {
    listen      8778;
    server_name mgt1.cloud.ow1.in ext-mgt1.cloud.ow1.in;
    charset     utf-8;
 
    location / {
        uwsgi_pass  127.0.0.1:8779;
        include     /etc/nginx/uwsgi_params;
    }
}

Мигрируем БД nova_api

# su -s /bin/sh -c "nova-manage api_db sync" nova

Инициализируем ячейки1)

# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

И мигрируем БД nova

# su -s /bin/sh -c "nova-manage db sync" nova

Проверяем, что обе ячейки зарегистрировались нормально

# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

Если в выводе есть cell0 и cell1 - радуемся и запускаем пачку сервисов

# systemctl start openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
# systemctl enable openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service

Можно кстати поглядеть какие у нас сервисы есть и поднялись ли они

# openstack compute service list
+----+------------------+-------------------+----------+---------+-------+------------+
| ID | Binary           | Host              | Zone     | Status  | State | Updated At |
+----+------------------+-------------------+----------+---------+-------+------------+
|  1 | nova-scheduler   | mgt1.cloud.ow1.in | internal | enabled | up    | None       |
|  3 | nova-conductor   | mgt1.cloud.ow1.in | internal | enabled | up    | None       |
|  6 | nova-consoleauth | mgt1.cloud.ow1.in | internal | enabled | up    | None       |
+----+------------------+-------------------+----------+---------+-------+------------+

Установка compute ноды

Собственно тут всё намного проще. Ставим пакет:

# yum install openstack-nova-compute

И в принципе можно даже взять конфиг от менеджмент ноды, только выкинуть ненужные запчасти и добавить запчасти neutron:

/etc/nova/nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@mgt1.cloud.ow1.in
my_ip =  10.22.1.1 # Здесь должен быть адрес ноды
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver
 
[database]
connection = postgresql+psycopg2://openstack:DBPASS@mgt1.cloud.ow1.in/nova
 
[api]
auth_strategy = keystone
 
[keystone_authtoken]
www_authenticate_uri  = http://mgt1.cloud.ow1.in:5000
auth_url = http://mgt1.cloud.ow1.in:5000
memcached_servers = mgt1.cloud.ow1.in:11211
auth_type = password
project_domain_name = owlhost
user_domain_name = owlhost
project_name = service
username = nova
password = NOVA_PASS
 
[vnc]
enabled = true
server_proxyclient_address = $my_ip
vncserver_listen = 0.0.0.0
novncproxy_base_url = http://ext-mgt1.cloud.ow1.in:6080/vnc_auto.html
 
[glance]
api_servers = http://mgt1.cloud.ow1.in:9292
 
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
 
[placement]
region_name = RegionOne
project_domain_name = owlhost
project_name = service
auth_type = password
user_domain_name = owlhost
auth_url = http://mgt1.cloud.ow1.in:5000
username = placement
password = PLACEMENT_PASS

Конечно же конфиг можно смержить, если compute у нас на менеджменте. И снова проверяем список сервисов:

[root@mgt1 owlbook]# openstack compute service list
+----+------------------+-------------------+----------+---------+-------+----------------------------+
| ID | Binary           | Host              | Zone     | Status  | State | Updated At                 |
+----+------------------+-------------------+----------+---------+-------+----------------------------+
|  1 | nova-scheduler   | mgt1.cloud.ow1.in | internal | enabled | up    | 2019-05-10T14:00:02.578843 |
|  6 | nova-consoleauth | mgt1.cloud.ow1.in | internal | enabled | up    | 2019-05-10T14:00:04.223108 |
|  8 | nova-compute     | mgt1.cloud.ow1.in | nova     | enabled | up    | 2019-05-10T14:00:05.830386 |
|  3 | nova-conductor   | mgt1.cloud.ow1.in | internal | enabled | up    | 2019-05-10T14:00:06.451830 |
+----+------------------+-------------------+----------+---------+-------+----------------------------+

Если мы используем в бэкенде для nova CEPH, требуется ещё настроить Бэкенд для OpenStack

Теперь нужно пойти на менеджмент ноду и добавить compute в Cells. Для этого прогоняем следующую комманду

# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

Дополнительные крутилки

Nested virtualization

Если openstack корячится на виртуалку, запущенную без Nested virtualisation или на сервер без поддержки виртуализации - нужно в /etc/nova/nova.conf добавить следующий блок

[libvirt]
virt_type = qemu

Проверить можно командой

# egrep -c '(vmx|svm)' /proc/cpuinfo

Если больше нуля - всё хорошо, если равно - добавляем в конфиг крутилку, если меньше - проверяем окружение.

А вообще и на железе можно это включить, хуже не будет.

И совсем уж дополнительная фича - можно пробрасывать CPU as-is в виртуалки, для этого нужно добавить в конфиг новы следующее

/etc/nova/nova.conf
[libvirt]
cpu_mode = host-passthrough

Соответственно если блок libvirt есть - нужно просто добавить в него крутилку.

Live migration

По умолчанию в CentOS живая миграция не работает2) Для её активации нужно выполнить несколько не хитрых шагов. А именно включить tcp в libvirt. Делается это правкой двух файлов

/etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
listen_addr = "10.22.1.1" # Адрес, который нужно слушать, можно 0.0.0.0
auth_tcp = "none"
/etc/sysconfig/libvirt
LIBVIRTD_ARGS="--listen"

И перезапуском сервиса

# systemctl restart libvirtd
1)
cells
2)
за другие системы не скажу