Самое сердце OpenStack - сервис, отвечающий за работу ВМ на конечных нодах.
Создаём несколько БД
Теперь заводим пользователя, сервис и 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
И теперь корячим конфиг
[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
[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
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 | +----+------------------+-------------------+----------+---------+-------+------------+
Собственно тут всё намного проще. Ставим пакет:
# yum install openstack-nova-compute
И в принципе можно даже взять конфиг от менеджмент ноды, только выкинуть ненужные запчасти и добавить запчасти neutron:
[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
Если openstack корячится на виртуалку, запущенную без Nested virtualisation или на сервер без поддержки виртуализации - нужно в /etc/nova/nova.conf добавить следующий блок
[libvirt] virt_type = qemu
Проверить можно командой
# egrep -c '(vmx|svm)' /proc/cpuinfo
Если больше нуля - всё хорошо, если равно - добавляем в конфиг крутилку, если меньше - проверяем окружение.
А вообще и на железе можно это включить, хуже не будет.
И совсем уж дополнительная фича - можно пробрасывать CPU as-is в виртуалки, для этого нужно добавить в конфиг новы следующее
[libvirt] cpu_mode = host-passthrough
Соответственно если блок libvirt есть - нужно просто добавить в него крутилку.
По умолчанию в CentOS живая миграция не работает2) Для её активации нужно выполнить несколько не хитрых шагов. А именно включить tcp в libvirt. Делается это правкой двух файлов
listen_tls = 0 listen_tcp = 1 listen_addr = "10.22.1.1" # Адрес, который нужно слушать, можно 0.0.0.0 auth_tcp = "none"
LIBVIRTD_ARGS="--listen"
И перезапуском сервиса
# systemctl restart libvirtd