Найти тему
Николай Калюжный

Как установить OpenStack на Debian 12 (Bookworm)

Openstack — это бесплатное облачное решение с открытым исходным кодом, которое позволяет создать частную платформу IaaS (инфраструктура как услуга) с помощью различных дополнительных услуг. Каждый сервис в OpenStack предлагает интерфейс прикладного программирования (API) для облегчения интеграции. Ключевые компоненты, доступные в OpenStack, будут предоставлять вычислительные, сетевые ресурсы и ресурсы хранения. Им можно управлять из интерфейса командной строки с помощью openstack или через интуитивно понятную панель управления, откуда вы можете администрировать облако OpenStack и контролировать его ресурсы.

В этой статье мы подробно рассмотрим шаги, необходимые для локальной настройки частного облака OpenStack на вашем компьютере с Debian 12 Linux. Это установка с одним узлом, которая подходит только для обучения и тестирования в домашних лабораториях. Мы используем ручной метод установки других решений, таких как Kolla и OpenStack Ansible.

Прежде чем приступить к этой настройке, убедитесь, что ваша машина соответствует следующим минимальным требованиям.

Свежая установка Debian 12 Linux
Включение расширения виртуализации CPU в BIOS
Пользователь root или пользователь с привилегиями sudo
2 виртуальных ЦПУ
8 ГБ ОЗУ
Емкость диска 20 ГБ
Хорошее подключение к Интернету

Давайте начнем!.
1. Подготовьте среду

Наша среда имеет следующие переменные:

IP-адрес сервера Debian 12: 192.168.1.2
Имя хоста сервера Debian 12: openstack.kalyuzhnyy.ru
Сетевой интерфейс: eno1
Регион OpenStack по умолчанию: RegionOne
Домен по умолчанию: по умолчанию

Задайте имя хоста сервера.

sudo hostnamectl set-hostname openstack.kalyuzhnyy.ru

Отредактируйте файл /etc/hosts для сопоставления IP-адреса вашего сервера с настроенным именем хоста.

$ sudo vim /etc/hosts
192.168.1.2 openstack.kalyuzhnyy.ru osp01

Обновите систему, прежде чем приступать к другим настройкам. Предполагается, что вы работаете на чистой машине Debian.

sudo apt update && sudo apt upgrade -y

Может потребоваться перезагрузка. Просто подтвердите.

[ -e /var/run/reboot-required ] && sudo reboot

Настройте синхронизацию времени NTP.

Использование Systemd timesyncd

Откройте файл timesyncd.conf файл для редактирования и обновите адрес на вашем NTP сервере.

$ sudo vim /etc/systemd/timesyncd.conf
[Time]
NTP=192.168.1.1

Перезапустите службу systemd-timesyncd.

sudo systemctl restart systemd-timesyncd

Подтвердите статус

sudo timedatectl timesync-status

Использование Chrony

Установите Chrony и настройте NTP сервер для корректировки времени. NTP использует 123/UDP.

sudo apt -y install chrony vim

Вы можете изменить NTP-серверы или использовать стандартное управление.

$ sudo vim /etc/chrony/chrony.conf
pool 2.debian.pool.ntp.org iburst

Установите часовой пояс в соответствии с вашим текущим местоположением

sudo timedatectl set-timezone Africa/Nairobi
sudo timedatectl set-ntp true

Подтвердите настройки

$ timedatectl
Local time: Wed 2024-01-31 21:47:22 EAT
Universal time: Wed 2024-01-31 18:47:22 UTC
RTC time: Wed 2024-01-31 18:47:22
Time zone: Africa/Nairobi (EAT, +0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

Перезапуск службы хроники

sudo systemctl restart chrony

Ручная синхронизация времени в системе.

$ sudo chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp1.icolo.io 2 6 37 57 +770us[ +770us] +/- 13ms
^* ntp0.icolo.io 2 6 37 57 -15us[ -895us] +/- 13ms
^- time.cloudflare.com 3 6 37 58 +3221us[+3221us] +/- 71ms
^- time.cloudflare.com 3 6 37 59 +3028us[+2156us] +/- 71ms

2. Установите MariaDB, RabbitMQ, Memcached

С этого момента мы можем переключиться на учетную запись пользователя root.

$ sudo -i
# or
$ sudo su -

Установка сервера базы данных MariaDB

apt install mariadb-server -y

Настройте максимальное количество подключений к базе данных, чтобы избежать тайм-аутов подключения.

# vim /etc/mysql/mariadb.conf.d/50-server.cnf
max_connections = 700

Перезапустите службу MariaDB после внесения изменений.

systemctl restart mariadb

Также установите пакет расширения Python MySQL.

apt install python3-pymysql

После этого выполните установку RabbitMQ, Memcached и веб-сервера Nginx.

apt install memcached rabbitmq-server nginx libnginx-mod-stream

Добавьте пользователя RabbitMQ для OpenStack, установите пароль и предоставьте права.

rabbitmqctl add_user openstack StrongPassw0rd01
rabbitmqctl set_permissions openstack ".*" ".*" ".*"

Отключите веб-страницу nginx по умолчанию.

unlink /etc/nginx/sites-enabled/default

Перезапустите службы.

systemctl restart mariadb rabbitmq-server memcached nginx

3. Установка и настройка Keystone

Сервис OpenStack Identity (Keystone) — это единая точка интеграции для аутентификации, авторизации и каталога сервисов.

Создайте базу данных и получите пользователя с соответствующими разрешениями.

# mysql
create database keystone;
grant all privileges on keystone.* to keystone@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit;

Установите Keystone и его зависимости, включая клиент OpenStack.

apt install keystone python3-openstackclient apache2 python3-oauth2client libapache2-mod-wsgi-py3 -y

Отвечайте «Нет» на все вопросы.

Отредактируйте файл конфигурации keystone и измените адрес, а также настройте параметры подключения к базе данных и поставщика токенов.

# vim /etc/keystone/keystone.conf
# Specify Memcache Server on line 363
memcache_servers = localhost:11211

# Add MariaDB connection information around line 543:
[database]
connection = mysql+pymysql://keystone:StrongPassw0rd01@localhost/keystone

# Set token provider in line 2169
provider = fernet

Заполните базу данных службы удостоверений данными, выполнив приведенные ниже команды.

su -s /bin/bash keystone -c "keystone-manage db_sync"

Безопасно игнорируйте ошибку "Исключение игнорируется в:...".

Далее мы инициализируем репозитории ключей Fernet:

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

Запустите службу идентификации. В последней версии OpenStack идентификация keystone может быть запущена на одном и том же порту для всех интерфейсов.

export controller=$(hostname -f)

keystone-manage bootstrap --bootstrap-password StrongPassw0rd01 \
--bootstrap-admin-url https://$controller:5000/v3/ \
--bootstrap-internal-url https://$controller:5000/v3/ \
--bootstrap-public-url https://$controller:5000/v3/ \
--bootstrap-region-id RegionOne

Установите полное доменное имя сервера в соответствии с ранее установленным в файле конфигурации Apache.

# vim /etc/apache2/apache2.conf
ServerName openstack.kalyuzhnyy.ru

Создайте конфигурацию Apache VirtualHost для keystone. Это позволит нам получить доступ к API с использованием FQDN, а не IP-адреса.

vim /etc/apache2/sites-available/keystone.conf

Измените и вставьте следующее содержимое. Но не забудьте заменить пути SSL на свои.
1. Использование Let's Encrypt

Ознакомьтесь со следующим руководством по использованию Let's Encrypt.

Как сгенерировать SSL-сертификаты Let's Encrypt на Linux
Сгенерируйте SSL-сертификат Let's Encrypt с помощью Cloudflare в частной сети
Как сгенерировать SSL-сертификат Let's Encrypt Wildcard

В этом примере используются следующие SSL-сертификаты.

/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/cert.pem
/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/privkey.pem
/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/chain.pem

2. Использование OpenSSL

Для самоподписанных сертификатов OpenSSL, сгенерированных следующим образом.

# vim /etc/ssl/openssl.cnf
[ home.cloudlabske.io ]
subjectAltName = DNS:openstack.kalyuzhnyy.ru

# Generate certificates
cd /etc/ssl/private
openssl genrsa -aes128 2048 > openstack_server.key
openssl rsa -in server.key -out openstack_server.key
openssl req -utf8 -new -key openstack_server.key -out openstack_server.csr
openssl x509 -in openstack_server.csr -out openstack_server.crt -req -signkey openstack_server.key -extfile /etc/ssl/openssl.cnf -extensions openstack.kalyuzhnyy.ru -days 3650
chmod 600 server.key

Пути к ключу и сертификатам будут.

/etc/ssl/private/openstack_server.crt
/etc/ssl/private/openstack_server.key

Измените приведенное ниже содержимое в соответствии с вашей средой.

Listen 5000

<VirtualHost *:5000>
SSLEngine on
SSLHonorCipherOrder on
SSLCertificateFile /etc/letsencrypt/live/openstack.kalyuzhnyy.ru/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/openstack.kalyuzhnyy.ru/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/openstack.kalyuzhnyy.ru/chain.pem
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LimitRequestBody 114688

<IfVersion >= 2.4>
ErrorLogFormat "%{cu}t %M"
</IfVersion>

ErrorLog /var/log/apache2/keystone.log
CustomLog /var/log/apache2/keystone_access.log combined

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

Alias /identity /usr/bin/keystone-wsgi-public
<Location /identity>
SetHandler wsgi-script
Options +ExecCGI

WSGIProcessGroup keystone-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>

Включите обязательные модули Apache и веб-конфигурацию keystone.

a2enmod ssl
a2ensite keystone
systemctl disable --now keystone
systemctl restart apache2

Сгенерируйте файл доступа к keystone для клиента OpenStack.

export controller=$(hostname -f)

tee ~/keystonerc<<EOF
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=StrongPassw0rd01
export OS_AUTH_URL=https://$controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF

Установите разрешения и источник файла, чтобы использовать его.

chmod 600 ~/keystonerc
source ~/keystonerc
echo "source ~/keystonerc " >> ~/.bashrc

Создание проектов

Создайте проект службы, который будет содержать уникального пользователя для каждой службы, добавляемой в среду.

root@osp01 ~(keystone)$ openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | 1067895d9b99452b8d1758eda755c7bc |
| is_domain | False |
| name | service |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+

root@osp01 ~(keystone)$ openstack project list
+----------------------------------+---------+
| ID | Name |
+----------------------------------+---------+
| 1067895d9b99452b8d1758eda755c7bc | service |
| 9a102dfdf9a54e8382fefdca727b2553 | admin |
+----------------------------------+---------+
root@osp01 ~(keystone)$

4. Установка и настройка Glance (сервис изображений)

Служба OpenStack Image (glance) позволяет пользователям кластера обнаруживать, регистрировать и извлекать образы виртуальных машин с помощью REST API. С помощью API вы можете запрашивать метаданные образа виртуальной машины и получать фактическое изображение. Образы виртуальных машин доступны через службу образов в различных местах.

Добавьте пользователя и пароль базы данных для обзора. В базе данных будут храниться метаданные образа виртуальной машины.

# mysql
create database glance;
grant all privileges on glance.* to glance@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit;

Добавление пользователя в проект сервиса Keystone.

# openstack user create --domain default --project service --password StrongPassw0rd01 glance
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 1067895d9b99452b8d1758eda755c7bc |
| domain_id | default |
| enabled | True |
| id | a4af040dceff40d1a01beb14d268a7d9 |
| name | glance |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+

Добавьте роль администратора в проект пользователя и службы glance:

openstack role add --project service --user glance admin

Создайте сущность службы glance:

# openstack service create --name glance --description "OpenStack Image service" image
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Image service |
| enabled | True |
| id | db9cb71d9f2b41128784458b057d468d |
| name | glance |
| type | image |
+-------------+----------------------------------+

Сохраните полное доменное имя контроллера в качестве переменной для удобства использования.

export controller=$(hostname -f)

Создайте конечные точки API службы изображений в регионе по умолчанию RegionOne. Мы создадим публичные, административные и внутренние конечные точки.

# openstack endpoint create --region RegionOne image public https://$controller:9292
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 5f5a8246813e436ab31ebeb37b1bb843 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | db9cb71d9f2b41128784458b057d468d |
| service_name | glance |
| service_type | image |
| url | https://openstack.kalyuzhnyy.ru:9292 |
+--------------+----------------------------------------+

# openstack endpoint create --region RegionOne image internal https://$controller:9292
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 953c077f90944774a205f5244aa28ce8 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | db9cb71d9f2b41128784458b057d468d |
| service_name | glance |
| service_type | image |
| url | https://openstack.kalyuzhnyy.ru:9292 |
+--------------+----------------------------------------+

# openstack endpoint create --region RegionOne image admin https://$controller:9292
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 3788fbdc728f4e8fab7d370ba2559103 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | db9cb71d9f2b41128784458b057d468d |
| service_name | glance |
| service_type | image |
| url | https://openstack.kalyuzhnyy.ru:9292 |
+--------------+----------------------------------------+

Установите пакет OpenStack Glance

apt install glance -y

Ответ «Нет» для всех вариантов автоматической настройки.
Настройка Glance API

API принимает вызовы Image API для обнаружения, извлечения и хранения изображений.

Создайте резервную копию текущего файла конфигурации Glance API.

mv /etc/glance/glance-api.conf /etc/glance/glance-api.conf.orig

Создайте новый файл конфигурации Glance API.

vim /etc/glance/glance-api.conf

Вставьте и измените приведенные ниже значения в соответствии с вашей средой.

В [DEFAULT] , настройка подключения RabbitMQ
В [glance_store] , настройка локального хранилища файловой системы и расположения файлов образов
В [database] раздел, настройка доступа к базе данных
В [keystone_authtoken] и [paste_deploy] , настроить доступ к сервису Identity

[DEFAULT]
bind_host = 127.0.0.1
# RabbitMQ connection info
transport_url = rabbit://openstack:StrongPassw0rd01@localhost
enforce_secure_rbac = true

[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

[database]
# MariaDB connection info
connection = mysql+pymysql://glance:StrongPassw0rd01@localhost/glance

# keystone auth info
[keystone_authtoken]
www_authenticate_uri = https://openstack.kalyuzhnyy.ru:5000
auth_url = https://openstack.kalyuzhnyy.ru:5000
memcached_servers = 127.0.0.1:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false

[paste_deploy]
flavor = keystone

[oslo_policy]
enforce_new_defaults = true

Установите новые права доступа к файлам.

chown root:glance /etc/glance/glance-api.conf
chmod 640 /etc/glance/glance-api.conf

Заполните базу данных службы изображений:

su -s /bin/bash -c "glance-manage db_sync" glance

Запустите и включите службу Glance.

systemctl restart glance-api && systemctl enable glance-api

Настройка Nginx

vim /etc/nginx/nginx.conf

Изменяйте, добавляя данные подключения Glance в запрос прокси для. Не забудьте установить правильные значения для адреса прослушивания, SSL-сертификата и ключа.

# Add the following to the end of file
stream {
upstream glance-api {
server 127.0.0.1:9292;
}
server {
listen 192.168.1.2:9292 ssl;
proxy_pass glance-api;
}
ssl_certificate "/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/privkey.pem";
}

Перезапустите веб-сервис nginx, когда закончите.

systemctl restart nginx

5. Установка и настройка Nova

OpenStack Compute является важной частью системы IaaS (инфраструктура как услуга). Она обеспечивает хостинг и управление системами облачных вычислений.

Компоненты сервиса OpenStack Compute.

Служба nova-api: принимает вызовы вычислительного API конечных пользователей и отвечает на них.
nova-api-metadata service: Принимает запросы метаданных от экземпляров.
nova-compute service — рабочий демон, который создает и завершает работу экземпляров виртуальных машин с помощью API гипервизора.
Служба nova-scheduler: принимает запрос экземпляра виртуальной машины из очереди и определяет, на каком узле вычислительного сервера он выполняется.
модуль nova-conductor: Выступает посредником во взаимодействиях между сервисом nova-compute и базой данных.
Демон nova-novncproxy: Предоставляет прокси для доступа к работающим экземплярам через VNC-соединение.
nova-spicehtml5proxy daemon: Предоставляет прокси для доступа к работающим экземплярам через SPICE-соединение.
Очередь: центральный узел для передачи сообщений между демонами
База данных SQL: хранит большинство состояний времени сборки и выполнения для облачной инфраструктуры, включая доступные типы экземпляров, используемые экземпляры, доступные сети и проекты.

1) Подготовьте предварительные условия для настройки

В этом руководстве мы выбираем виртуализацию KVM с libvirt. Установите KVM и другие необходимые утилиты.

apt install qemu-kvm libvirt-daemon libvirt-daemon-system bridge-utils libosinfo-bin virtinst

Убедитесь, что в BIOS включены расширения виртуализации ЦП.

# lsmod | grep kvm
kvm_intel 380928 0
kvm 1142784 1 kvm_intel
irqbypass 16384 1 kvm

Добавьте пользователя и базу данных на MariaDB для Nova, Nova API, Placement, Nova cell.

# mysql
create database nova;
grant all privileges on nova.* to nova@'localhost' identified by 'StrongPassw0rd01';

create database nova_api;
grant all privileges on nova_api.* to nova@'localhost' identified by 'StrongPassw0rd01';

create database placement;
grant all privileges on placement.* to placement@'localhost' identified by 'StrongPassw0rd01';

create database nova_cell0;
grant all privileges on nova_cell0.* to nova@'localhost' identified by 'StrongPassw0rd01';

flush privileges;
exit

Создайте пользователя nova:

# openstack user create --domain default --project service --password StrongPassw0rd01 nova
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 1067895d9b99452b8d1758eda755c7bc |
| domain_id | default |
| enabled | True |
| id | 424afd4671ad49268bdbd14fe32b6fe2 |
| name | nova |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+

Добавьте роль admin пользователю nova:

openstack role add --project service --user nova admin

Добавление пользователя размещения в проект сервиса

openstack user create --domain default --project service --password StrongPassw0rd01 placement

Добавьте роль администратора пользователю места размещения:

openstack role add --project service --user placement admin

Создание сервисной записи nova

# openstack service create --name nova --description "OpenStack Compute service" compute
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Compute service |
| enabled | True |
| id | ba737aa8b0a240fab38bdf49b31a60f0 |
| name | nova |
| type | compute |
+-------------+----------------------------------+

Создайте запись службы размещения.

# openstack service create --name placement --description "OpenStack Compute Placement service" placement
+-------------+-------------------------------------+
| Field | Value |
+-------------+-------------------------------------+
| description | OpenStack Compute Placement service |
| enabled | True |
| id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| name | placement |
| type | placement |
+-------------+-------------------------------------+

Определение узла Nova API

export controller=$(hostname -f)

Создание общедоступной конечной точки для nova.

# openstack endpoint create --region RegionOne compute public https://$controller:8774/v2.1/%\(tenant_id\)s
+--------------+-----------------------------------------------------------+
| Field | Value |
+--------------+-----------------------------------------------------------+
| enabled | True |
| id | 50890db0f27443ddb547d24786340330 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ba737aa8b0a240fab38bdf49b31a60f0 |
| service_name | nova |
| service_type | compute |
| url | https://openstack.kalyuzhnyy.ru:8774/v2.1/%(tenant_id)s |
+--------------+-----------------------------------------------------------+

Создание частной конечной точки для nova.

# openstack endpoint create --region RegionOne compute internal https://$controller:8774/v2.1/%\(tenant_id\)s
+--------------+-----------------------------------------------------------+
| Field | Value |
+--------------+-----------------------------------------------------------+
| enabled | True |
| id | 96b3abd5ca314429b0602a2bc153af77 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ba737aa8b0a240fab38bdf49b31a60f0 |
| service_name | nova |
| service_type | compute |
| url | https://openstack.kalyuzhnyy.ru:8774/v2.1/%(tenant_id)s |
+--------------+-----------------------------------------------------------+

Создание конечной точки администратора для nova.

# openstack endpoint create --region RegionOne compute admin https://$controller:8774/v2.1/%\(tenant_id\)s
+--------------+-----------------------------------------------------------+
| Field | Value |
+--------------+-----------------------------------------------------------+
| enabled | True |
| id | 8fcd6f0a2d4c4816b09ca214e311597a |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ba737aa8b0a240fab38bdf49b31a60f0 |
| service_name | nova |
| service_type | compute |
| url | https://openstack.kalyuzhnyy.ru:8774/v2.1/%(tenant_id)s |
+--------------+-----------------------------------------------------------+

Создание общедоступной, частной и административной конечной точки для nova.

# openstack endpoint create --region RegionOne placement public https://$controller:8778
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 2fc42dd9223d41aea94779daa6a80e19 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| service_name | placement |
| service_type | placement |
| url | https://openstack.kalyuzhnyy.ru:8778 |
+--------------+----------------------------------------+

# openstack endpoint create --region RegionOne placement internal https://$controller:8778
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | fd284797981540c2b219139edbdbdf69 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| service_name | placement |
| service_type | placement |
| url | https://openstack.kalyuzhnyy.ru:8778 |
+--------------+----------------------------------------+

# openstack endpoint create --region RegionOne placement admin https://$controller:8778
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 4c40f9d36e384c6685b9f56e7d951329 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| service_name | placement |
| service_type | placement |
| url | https://openstack.kalyuzhnyy.ru:8778 |
+--------------+----------------------------------------+

2) Установка и настройка сервисов Nova

Установка пакетов Nova

apt install nova-api nova-scheduler nova-conductor nova-novncproxy python3-novaclient placement-api

Резервное копирование текущего конфигурационного файла Nova

mv /etc/nova/nova.conf /etc/nova/nova.conf.orig

Создание новой конфигурации

vim /etc/nova/nova.conf

Вставьте во время изменения настроек в файле. Настройка подключения RabbitMQ, VNC, Glance API,

[DEFAULT]
allow_resize_to_same_host = True
osapi_compute_listen = 127.0.0.1
osapi_compute_listen_port = 8774
metadata_listen = 127.0.0.1
metadata_listen_port = 8775
state_path = /var/lib/nova
enabled_apis = osapi_compute,metadata
log_dir = /var/log/nova
# RabbitMQ connection details
transport_url = rabbit://openstack:StrongPassw0rd01@localhost

[api]
auth_strategy = keystone

[vnc]
enabled = True
novncproxy_host = 127.0.0.1
novncproxy_port = 6080
novncproxy_base_url = https://openstack.kalyuzhnyy.ru:6080/vnc_auto.html

# Glance connection info
[glance]
api_servers = https://openstack.kalyuzhnyy.ru:9292

[oslo_concurrency]
lock_path = $state_path/tmp

# MariaDB connection info
[api_database]
connection = mysql+pymysql://nova:StrongPassw0rd01@localhost/nova_api

[database]
connection = mysql+pymysql://nova:StrongPassw0rd01@localhost/nova

# Keystone auth info
[keystone_authtoken]
www_authenticate_uri = https://openstack.kalyuzhnyy.ru:5000
auth_url = https://openstack.kalyuzhnyy.ru:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false

[placement]
auth_url = https://openstack.kalyuzhnyy.ru:5000
os_region_name = RegionOne
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false

[wsgi]
api_paste_config = /etc/nova/api-paste.ini

[oslo_policy]
enforce_new_defaults = true

Установите права собственности и разрешения.

chgrp nova /etc/nova/nova.conf
chmod 640 /etc/nova/nova.conf

Установка типа прокси консоли для Nova

sudo sed -i 's/^NOVA_CONSOLE_PROXY_TYPE=.*/NOVA_CONSOLE_PROXY_TYPE=novnc/g' /etc/default/nova-consoleproxy

Конфигурация размещения резервных токов

mv /etc/placement/placement.conf /etc/placement/placement.conf.orig

Создание нового конфигурационного файла для размещения Nova

vim /etc/placement/placement.conf

Настройте и вставьте конфигурации в файл.

[DEFAULT]
debug = false

[api]
auth_strategy = keystone

[keystone_authtoken]
www_authenticate_uri = https://openstack.kalyuzhnyy.ru:5000
auth_url = https:/openstack.kalyuzhnyy.ru:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false

[placement_database]
connection = mysql+pymysql://placement:StrongPassw0rd01@localhost/placement

Создание API для размещения

vim /etc/apache2/sites-available/placement-api.conf

Вот содержимое, которое нужно поместить в файл. Здесь ничего менять не нужно.

Listen 127.0.0.1:8778

<VirtualHost *:8778>
WSGIScriptAlias / /usr/bin/placement-api
WSGIDaemonProcess placement-api processes=5 threads=1 user=placement group=placement display-name=%{GROUP}
WSGIProcessGroup placement-api
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LimitRequestBody 114688

<IfVersion >= 2.4>
ErrorLogFormat "%{cu}t %M"
</IfVersion>

ErrorLog /var/log/apache2/placement_api_error.log
CustomLog /var/log/apache2/placement_api_access.log combined

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

Alias /placement /usr/bin/placement-api
<Location /placement>
SetHandler wsgi-script
Options +ExecCGI

WSGIProcessGroup placement-api
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>

Установите правильные права доступа к файлам

chgrp placement /etc/placement/placement.conf
chmod 640 /etc/placement/placement.conf

Обновите адрес привязки UWSGI на localhost.

sed -i -e "s/UWSGI_BIND_IP=.*/UWSGI_BIND_IP=\"127.0.0.1\"/" /etc/init.d/nova-api
sed -i -e "s/UWSGI_BIND_IP=.*/UWSGI_BIND_IP=\"127.0.0.1\"/" /etc/init.d/nova-api-metadata

Включите placement-api для веб-сайта apache.

a2ensite placement-api

Перезапустите службы после завершения.

systemctl disable --now placement-api && systemctl restart apache2

Откройте файл конфигурации Nginx.

vim /etc/nginx/nginx.conf

Обновите, добавив линии цветом. Замените 192.168.1.2 на IP-адрес вашего сервера.

stream {
upstream glance-api {
server 127.0.0.1:9292;
}
server {
listen 192.168.1.2:9292 ssl;
proxy_pass glance-api;
}
upstream nova-api {
server 127.0.0.1:8774;
}
server {
listen 192.168.1.2:8774 ssl;
proxy_pass nova-api;
}
upstream nova-metadata-api {
server 127.0.0.1:8775;
}
server {
listen 192.168.1.2:8775 ssl;
proxy_pass nova-metadata-api;
}
upstream placement-api {
server 127.0.0.1:8778;
}
server {
listen 192.168.1.2:8778 ssl;
proxy_pass placement-api;
}
upstream novncproxy {
server 127.0.0.1:6080;
}
server {
listen 192.168.1.2:6080 ssl;
proxy_pass novncproxy;
}
ssl_certificate "/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/privkey.pem";
}

Импортируйте все необходимые данные.

# Populate the placement database
su -s /bin/bash placement -c "placement-manage db sync"

# Populate the nova-api database
su -s /bin/bash nova -c "nova-manage api_db sync"

# Register the cell0 database
su -s /bin/bash nova -c "nova-manage cell_v2 map_cell0"

# Populate the nova database
su -s /bin/bash nova -c "nova-manage db sync"

# Create the cell1 cell
su -s /bin/sh nova -c "nova-manage cell_v2 create_cell --name cell1"

Остановите услуги, связанные с операциями Nova.

systemctl stop nova-api nova-api-metadata nova-conductor nova-scheduler nova-novncproxy

Перезапустите веб-сервер nginx

systemctl restart nginx

Затем запустите другие службы

systemctl enable --now nova-api nova-api-metadata nova-conductor nova-scheduler nova-novncproxy

Убедитесь, что nova cell0 и cell1 зарегистрированы правильно:

# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+-----------------------------------+------------------------------------------------+----------+
| Name | UUID | Transport URL | Database Connection | Disabled |
+-------+--------------------------------------+-----------------------------------+------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@localhost/nova_cell0 | False |
| cell1 | d3a70005-5861-427e-9bdf-984b15400d7e | rabbit://openstack:****@localhost | mysql+pymysql://nova:****@localhost/nova | False |
+-------+--------------------------------------+-----------------------------------+------------------------------------------------+----------+

Перечислите зарегистрированные вычислительные службы.

# openstack compute service list
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| 6f75eb27-9c66-41c0-b0fa-15f1a48cb25c | nova-conductor | osp01 | internal | enabled | up | 2024-02-02T07:21:04.000000 |
| 802d523d-1f92-427b-9f90-691bf54268af | nova-scheduler | osp01 | internal | enabled | up | 2024-02-02T07:21:05.000000 |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+

3) Установите Nova KVM Compute

Установка вычислительного пакета Nova KVM

apt install nova-compute nova-compute-kvm -y

Откройте файл конфигурации nova.

vim /etc/nova/nova.conf

Обновите настройки VNC следующим образом.

[vnc]
enabled = True
server_listen = 192.168.1.2
server_proxyclient_address = 192.168.1.2
novncproxy_host = 127.0.0.1
novncproxy_port = 6080
ovncproxy_host = 127.0.0.1
novncproxy_port = 6080
novncproxy_base_url = https://openstack.kalyuzhnyy.ru:6080/vnc_auto.html

Перезапустите nova-compute, когда закончите

systemctl restart nova-compute.service

Обнаружение ячеек и карты найденных хостов.

su -s /bin/bash nova -c "nova-manage cell_v2 discover_hosts"

Ознакомьтесь с новым списком услуг nova host.

# openstack compute service list
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| 6f75eb27-9c66-41c0-b0fa-15f1a48cb25c | nova-conductor | osp01 | internal | enabled | up | 2024-02-02T07:32:44.000000 |
| 802d523d-1f92-427b-9f90-691bf54268af | nova-scheduler | osp01 | internal | enabled | up | 2024-02-02T07:32:45.000000 |
| 83fd3604-7345-4258-a3a2-324900b04b8e | nova-compute | osp01 | nova | enabled | up | 2024-02-02T07:32:43.000000 |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+

6. Настройка сетевого сервиса (нейтрон)

OpenStack Networking (нейтрон) обеспечивает интеграцию для создания и подключения к сетям интерфейсных устройств, управляемых другими сервисами OpenStack.

Компоненты:

neutron-server: Принимает и направляет запросы API к соответствующему подключаемому модулю OpenStack Networking для выполнения действий.
Подключаемые модули и агенты OpenStack Networking: подключайте и отключайте порты, создавайте сети или подсети, а также предоставляйте IP-адресацию.
Очередь сообщений: используется большинством установок OpenStack Networking для маршрутизации информации между нейтронным сервером и различными агентами

1) Подготовьте среду

Создание базы данных и пользователя для сетевого сервиса Neutron.

# mysql
create database neutron_ml2;
grant all privileges on neutron_ml2.* to neutron@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit

Далее мы добавляем пользователя или сервис для Neutron на Keystone.

# openstack user create --domain default --project service --password StrongPassw0rd01 neutron
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 1067895d9b99452b8d1758eda755c7bc |
| domain_id | default |
| enabled | True |
| id | 71d4813059f5472f852a946bdaf272f4 |
| name | neutron |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+

# openstack role add --project service --user neutron admin

# openstack service create --name neutron --description "OpenStack Networking service" network
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Networking service |
| enabled | True |
| id | 7da12e4154ad4f97b8f449f01d6a56ec |
| name | neutron |
| type | network |
+-------------+----------------------------------+

Создание конечной точки обязательно.

# Save your server
export controller=$(hostname -f)

# openstack endpoint create --region RegionOne network public https://$controller:9696
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 3bc3eb0a234a46b68fa2190095f4cd53 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7da12e4154ad4f97b8f449f01d6a56ec |
| service_name | neutron |
| service_type | network |
| url | https://openstack.kalyuzhnyy.ru:9696 |
+--------------+----------------------------------------+

# openstack endpoint create --region RegionOne network internal https://$controller:9696
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 2bc933e3f8fc4238874adc2cf0b764f9 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7da12e4154ad4f97b8f449f01d6a56ec |
| service_name | neutron |
| service_type | network |
| url | https://openstack.kalyuzhnyy.ru:9696 |
+--------------+----------------------------------------+

# openstack endpoint create --region RegionOne network admin https://$controller:9696
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | fa110991eab34d4e9e1c639865ce2b14 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7da12e4154ad4f97b8f449f01d6a56ec |
| service_name | neutron |
| service_type | network |
| url | https://openstack.kalyuzhnyy.ru:9696 |
+--------------+----------------------------------------+

2) Установка и настройка Neutron

Установка пакетов Neutron для OpenStack

apt install neutron-server neutron-metadata-agent neutron-openvswitch-agent neutron-plugin-ml2 neutron-l3-agent neutron-metadata-agent openvswitch-switch python3-neutronclient neutron-dhcp-agent

Резервное копирование текущего файла конфигурации.

mv /etc/neutron/neutron.conf /etc/neutron/neutron.conf.orig

Создание нового файла конфигурации

vim /etc/neutron/neutron.conf

Измените во время вставки предоставленное здесь содержимое.

[DEFAULT]
bind_host = 127.0.0.1
bind_port = 9696
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
state_path = /var/lib/neutron
dhcp_agent_notification = True
allow_overlapping_ips = True
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True

# RabbitMQ connection info
transport_url = rabbit://openstack:StrongPassw0rd01@localhost

[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

# Keystone auth info
[keystone_authtoken]
www_authenticate_uri = https://openstack.kalyuzhnyy.ru:5000
auth_url = https://openstack.kalyuzhnyy.ru:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false

# MariaDB connection info
[database]
connection = mysql+pymysql://neutron:StrongPassw0rd01@localhost/neutron_ml2

# Nova auth info
[nova]
auth_url = https://openstack.kalyuzhnyy.ru:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false

[oslo_concurrency]
lock_path = $state_path/tmp

[oslo_policy]
enforce_new_defaults = true

Отредактируйте конфигурацию агента метаданных и установите хост, общий секрет прокси и адрес хоста memcache.

# vim /etc/neutron/metadata_agent.ini
nova_metadata_host = openstack.kalyuzhnyy.ru
nova_metadata_protocol = https
# specify any secret key you like
metadata_proxy_shared_secret = metadata_secret
# specify Memcache server
memcache_servers = localhost:11211

Сделайте резервную копию конфигурации ml2 и создайте новый.

mv /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugins/ml2/ml2_conf.ini.orig
vim /etc/neutron/plugins/ml2/ml2_conf.ini

Обновите новые настройки, как показано ниже.

[DEFAULT]

[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types =
mechanism_drivers = openvswitch
extension_drivers = port_security

[ml2_type_flat]

[ml2_type_vxlan]

[securitygroup]
enable_security_group = True
enable_ipset = True

Настройте агент уровня 3, установив драйвер интерфейса в openvswitch.

# vim /etc/neutron/l3_agent.ini
interface_driver = openvswitch

Также драйвер интерфейса DHCP для openvswitch и включения dnsmasq dhcp драйвера.

# vim /etc/neutron/dhcp_agent.ini
# Confirm in line 18
interface_driver = openvswitch

# uncomment line 37
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

Создайте новый файл конфигурации агента Open vSwitch.

mv /etc/neutron/plugins/ml2/openvswitch_agent.ini /etc/neutron/plugins/ml2/openvswitch_agent.ini.orig
vim /etc/neutron/plugins/ml2/openvswitch_agent.ini

Настройте следующим образом:

[DEFAULT]

[agent]

[ovs]

[securitygroup]
firewall_driver = openvswitch
enable_security_group = True
enable_ipset = True

Создание необходимых файлов и установка правильных прав доступа

touch /etc/neutron/fwaas_driver.ini
chmod 640 /etc/neutron/{neutron.conf,fwaas_driver.ini}
chmod 640 /etc/neutron/plugins/ml2/{ml2_conf.ini,openvswitch_agent.ini}
chgrp neutron /etc/neutron/{neutron.conf,fwaas_driver.ini}
chgrp neutron /etc/neutron/plugins/ml2/{ml2_conf.ini,openvswitch_agent.ini}

Откройте конфигурацию Nova и добавьте настройки нейтронной сети.

# vim /etc/nova/nova.conf
# add follows into the [DEFAULT] section
vif_plugging_is_fatal = True
vif_plugging_timeout = 300

# Add the following to the end : Neutron auth info
# the value of [metadata_proxy_shared_secret] is the same with the one in [metadata_agent.ini]
[neutron]
auth_url = https://openstack.kalyuzhnyy.ru:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = StrongPassw0rd01
service_metadata_proxy = True
metadata_proxy_shared_secret = metadata_secret
insecure = false

Обновите адрес привязки UWSGI_BIND_IP.

sed -i -e "s/UWSGI_BIND_IP=.*/UWSGI_BIND_IP=\"127.0.0.1\"/" /etc/init.d/neutron-api

Обновление потоков nginx

vim /etc/nginx/nginx.conf

Добавьте нейтронные восходящие и серверные параметры для проксирования.

stream {
upstream glance-api {
server 127.0.0.1:9292;
}
server {
listen 192.168.1.2:9292 ssl;
proxy_pass glance-api;
}
upstream nova-api {
server 127.0.0.1:8774;
}
server {
listen 192.168.1.2:8774 ssl;
proxy_pass nova-api;
}
upstream nova-metadata-api {
server 127.0.0.1:8775;
}
server {
listen 192.168.1.2:8775 ssl;
proxy_pass nova-metadata-api;
}
upstream placement-api {
server 127.0.0.1:8778;
}
server {
listen 192.168.1.2:8778 ssl;
proxy_pass placement-api;
}
upstream novncproxy {
server 127.0.0.1:6080;
}
server {
listen 192.168.1.2:6080 ssl;
proxy_pass novncproxy;
}
upstream neutron-api {
server 127.0.0.1:9696;
}
server {
listen 192.168.1.2:9696 ssl;
proxy_pass neutron-api;
}
ssl_certificate "/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/openstack.kalyuzhnyy.ru/privkey.pem";
}

Создать символическую ссылку для ml2_conf.ini

ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

Затем заполните базу данных нейтронов

su -s /bin/bash neutron -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini upgrade head"

Ожидаемый результат выполнения;

....
INFO [alembic.runtime.migration] Running upgrade 1e0744e4ffea -> 6135a7bd4425
INFO [alembic.runtime.migration] Running upgrade 6135a7bd4425 -> 8df53b0d2c0e
INFO [alembic.runtime.migration] Running upgrade 8df53b0d2c0e -> 1bb3393de75d, add qos policy rule Packet Rate Limit
INFO [alembic.runtime.migration] Running upgrade 1bb3393de75d -> c181bb1d89e4
INFO [alembic.runtime.migration] Running upgrade c181bb1d89e4 -> ba859d649675
INFO [alembic.runtime.migration] Running upgrade ba859d649675 -> e981acd076d3
INFO [alembic.runtime.migration] Running upgrade e981acd076d3 -> 76df7844a8c6, add Local IP tables
INFO [alembic.runtime.migration] Running upgrade 76df7844a8c6 -> 1ffef8d6f371, migrate RBAC registers from "target_tenant" to "target_project"
INFO [alembic.runtime.migration] Running upgrade 1ffef8d6f371 -> 8160f7a9cebb, drop portbindingports table
INFO [alembic.runtime.migration] Running upgrade 8160f7a9cebb -> cd9ef14ccf87
INFO [alembic.runtime.migration] Running upgrade cd9ef14ccf87 -> 34cf8b009713
INFO [alembic.runtime.migration] Running upgrade 34cf8b009713 -> I43e0b669096
INFO [alembic.runtime.migration] Running upgrade I43e0b669096 -> 4e6e655746f6
INFO [alembic.runtime.migration] Running upgrade 4e6e655746f6 -> 659cbedf30a1
INFO [alembic.runtime.migration] Running upgrade 659cbedf30a1 -> 21ff98fabab1
INFO [alembic.runtime.migration] Running upgrade 21ff98fabab1 -> 5881373af7f5
INFO [alembic.runtime.migration] Running upgrade 7d9d8eeec6ad -> a8b517cff8ab
INFO [alembic.runtime.migration] Running upgrade a8b517cff8ab -> 3b935b28e7a0
INFO [alembic.runtime.migration] Running upgrade 3b935b28e7a0 -> b12a3ef66e62
INFO [alembic.runtime.migration] Running upgrade b12a3ef66e62 -> 97c25b0d2353
INFO [alembic.runtime.migration] Running upgrade 97c25b0d2353 -> 2e0d7a8a1586
INFO [alembic.runtime.migration] Running upgrade 2e0d7a8a1586 -> 5c85685d616d
OK
root

Активируйте интерфейс OVS.

ip link set up ovs-system

Остановите нейтронное обслуживание.

systemctl stop neutron-api neutron-rpc-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent nova-api nova-compute nginx

Запуск нейтронного обслуживания.

systemctl start neutron-api neutron-rpc-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent nova-api nova-compute nginx

Включите запуск служб при загрузке системы.

systemctl enable neutron-api neutron-rpc-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent

Подтвердите список сетевых агентов.

# openstack network agent list
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| 2c802774-b93a-45fb-b23b-aa9994237e23 | Metadata agent | osp01 | None | :-) | UP | neutron-metadata-agent |
| 52e59a27-59c3-45a3-bca0-1c55dae3281e | L3 agent | osp01 | nova | :-) | UP | neutron-l3-agent |
| 96e812a7-fb0f-4099-a989-1b203843d8c8 | Open vSwitch agent | osp01 | None | :-) | UP | neutron-openvswitch-agent |
| e02cf121-ed3e-4a5e-9cf8-87dc28aa28be | DHCP agent | osp01 | nova | :-) | UP | neutron-dhcp-agent |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+

3) Настройка сети Neutron Flat

Подтвердите активацию интерфейсов на сервере.

$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 1c:69:7a:ab:be:de brd ff:ff:ff:ff:ff:ff
altname enp0s31f6
3: ovs-system: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 7e:b9:25:db:58:bd brd ff:ff:ff:ff:ff:ff
4: br-int: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 9e:91:4a:20:26:4f brd ff:ff:ff:ff:ff:ff

Откройте файл настроек сети и настройте их так, чтобы они выглядели так, как показано ниже.

# vim /etc/network/interfaces
auto eno1
iface eno1 inet manual

auto br-eno1
iface br-eno1 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1

auto ovs-system
iface ovs-system inet manual

Заменять

eno1 с именем вашего физического сетевого интерфейса
br–eno1 с мостом, который будет добавлен.
192.168.1.2 с IP-адресом вашей машины и 255.255.255.0 в качестве сетевой маски
192.168.1.1 также является шлюзом и DNS-сервером по адресу 192.168.1.1.

Введите имя интерфейса и имя моста в качестве переменных.

INT_NAME=eno1
BR_NAME=br-eno1

Добавьте в систему мост OVS.

ovs-vsctl add-br $BR_NAME
ip link set $INT_NAME up
ip link set $BR_NAME up

Добавление порта на мост

ovs-vsctl add-port $BR_NAME $INT_NAME

Модифицировать openvswitch_agent.ini и делать физические сопоставления мостов.

# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
# add a line undet [ovs] section
[ovs]
bridge_mappings = physnet1:br-eno1

Поскольку мы используем плоскую сеть, укажите сеть как отображенную на мост выше.

# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2_type_flat]
flat_networks = physnet1

Перезапуск нейтронного обслуживания.

systemctl restart neutron-api neutron-rpc-server neutron-openvswitch-agent

4) Создание виртуальной сети

Определение идентификатора проекта

projectID=$(openstack project list | grep service | awk '{print $2}')

Создание общей сети

# openstack network create --project $projectID \
--share --provider-network-type flat --provider-physical-network physnet1 private
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2024-02-02T08:45:27Z |
| description | |
| dns_domain | None |
| id | 36577b59-f6e1-4844-a0d8-a277c9ddc780 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| mtu | 1500 |
| name | private |
| port_security_enabled | True |
| project_id | 1067895d9b99452b8d1758eda755c7bc |
| provider:network_type | flat |
| provider:physical_network | physnet1 |
| provider:segmentation_id | None |
| qos_policy_id | None |
| revision_number | 1 |
| router:external | Internal |
| segments | None |
| shared | True |
| status | ACTIVE |
| subnets | |
| tags | |
| updated_at | 2024-02-02T08:45:27Z |
+---------------------------+--------------------------------------+

Создаем подсеть в сети, которую мы только что создали. Здесь мы используем;

Сеть: 192.168.1.0/24
Начало работы DHCP: 192.168.1.101
Конец DHCP: 192.168.1.149
Шлюз и DNS-сервер: 192.168.1.1

openstack subnet create subnet1 --network private \
--project $projectID --subnet-range 192.168.1.0/24 \
--allocation-pool start=192.168.1.101,end=192.168.1.149 \
--gateway 192.168.1.1 --dns-nameserver 192.168.1.1

Вывод списка сетей и подсетей, созданных на openstack.

# openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+--------------------------------------+
| 36577b59-f6e1-4844-a0d8-a277c9ddc780 | private | 6f216cd7-acd3-4c31-bc5e-67875c5dcc09 |
+--------------------------------------+---------+--------------------------------------+

# openstack subnet list
+--------------------------------------+---------+--------------------------------------+----------------+
| ID | Name | Network | Subnet |
+--------------------------------------+---------+--------------------------------------+----------------+
| 6f216cd7-acd3-4c31-bc5e-67875c5dcc09 | subnet1 | 36577b59-f6e1-4844-a0d8-a277c9ddc780 | 192.168.1.0/24 |
+--------------------------------------+---------+--------------------------------------+----------------+

7. Добавьте Compute Flavors и ключ SSH

В OpenStack разновидности используются для определения вычислительной мощности, памяти и емкости хранилища вычислительных экземпляров nova. Тонкая его конфигурация оборудования для сервера.

Образцы;

m1.tiny Flavor с: процессором 1, памятью 2048M, корневым диском 20G
m1.small Flavor с: процессором 2, памятью 4096, корневым диском 30 ГБ
m1.medium Flavor с: процессором 2, памятью 8192, корневым диском 40 ГБ

Ниже приведен пример создания ароматизаторов.

openstack flavor create --id 1 --vcpus 1 --ram 2048 --disk 20 m1.tiny
openstack flavor create --id 2 --vcpus 1 --ram 4096 --disk 30 m1.small
openstack flavor create --id 3 --vcpus 1 --ram 8192 --disk 40 m1.medium

Перечислите доступные разновидности в облаке OpenStack.

root@osp01 ~(keystone)$ openstack flavor list
+----+-----------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+------+------+-----------+-------+-----------+
| 1 | m1.tiny | 2048 | 20 | 0 | 1 | True |
| 2 | m1.small | 4096 | 30 | 0 | 1 | True |
| 3 | m1.medium | 8192 | 40 | 0 | 1 | True |
+----+-----------+------+------+-----------+-------+-----------+

Добавление ключа SSH

Вы можете сгенерировать пару ключей SSH, если она не существует.

ssh-keygen -q -N ""

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

# openstack keypair create --public-key ~/.ssh/id_rsa.pub default-pubkey
+-------------+-------------------------------------------------+
| Field | Value |
+-------------+-------------------------------------------------+
| created_at | None |
| fingerprint | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f |
| id | default-pubkey |
| is_deleted | None |
| name | default-pubkey |
| type | ssh |
| user_id | 61800deb7d664bbcb4f3eef188cc8dbc |
+-------------+-------------------------------------------------+

# openstack keypair list
+----------------+-------------------------------------------------+------+
| Name | Fingerprint | Type |
+----------------+-------------------------------------------------+------+
| default-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
| jmutai-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
+----------------+-------------------------------------------------+------+

8. Создание групп безопасности

Группа безопасности — это именованная коллекция правил доступа к сети, которые используются для ограничения типов трафика, имеющих доступ к экземплярам. При запуске экземпляра вы можете назначить ему одну или несколько групп безопасности. Если группы безопасности не создаются, новые экземпляры автоматически назначаются группе безопасности по умолчанию, если явно не указана другая группа безопасности.

Группа безопасности по умолчанию называется default.

# openstack security group list
+--------------------------------------+---------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+---------+------------------------+----------------------------------+------+
| c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | default | Default security group | 9a102dfdf9a54e8382fefdca727b2553 | [] |
+--------------------------------------+---------+------------------------+----------------------------------+------+

# openstack security group rule list default
+--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+
| ID | IP Protocol | Ethertype | IP Range | Port Range | Direction | Remote Security Group | Remote Address Group |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+
| 2a4aa470-935a-474a-a8bd-06623218a287 | None | IPv4 | 0.0.0.0/0 | | egress | None | None |
| 6cf36173-e187-4ed2-82f4-f5ead4ad3134 | None | IPv6 | ::/0 | | egress | None | None |
| 7d4af0e4-fb46-40b5-b447-8e7d22cbdb4d | None | IPv4 | 0.0.0.0/0 | | ingress | c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | None |
| a98b779a-f63a-44ff-834e-c3a557f2864d | None | IPv6 | ::/0 | | ingress | c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | None |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+

Давайте создадим группу безопасности, которая разрешает все входить и выходить.

openstack security group create allow_all --description "Allow all ports"
openstack security group rule create --protocol TCP --dst-port 1:65535 --remote-ip 0.0.0.0/0 allow_all
openstack security group rule create --protocol ICMP --remote-ip 0.0.0.0/0 allow_all

Перечислите группы безопасности, чтобы подтвердить, что он был создан.

# openstack security group list
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| 287e76b4-337a-4c08-9e3d-84efd9274edb | allow_all | Allow all ports | 9a102dfdf9a54e8382fefdca727b2553 | [] |
| c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | default | Default security group | 9a102dfdf9a54e8382fefdca727b2553 | [] |
+--------------------------------------+-----------+------------------------+----------------------------------+------+

Ниже представлена группа безопасности с ограниченным доступом. Разрешение доступа только к известным портам, например, 22, 80, 443, icmp

openstack security group create base --description "Allow common ports"
openstack security group rule create --protocol TCP --dst-port 22 --remote-ip 0.0.0.0/0 base
openstack security group rule create --protocol TCP --dst-port 80 --remote-ip 0.0.0.0/0 base
openstack security group rule create --protocol TCP --dst-port 443 --remote-ip 0.0.0.0/0 base
openstack security group rule create --protocol ICMP --remote-ip 0.0.0.0/0 base

9. Добавьте образы ОС и создайте тестовую виртуальную машину

У нас есть отдельная статья о том, как загрузить облачные образы ОС в сервис изображений OpenStack Glance.

Как загрузить образы облака виртуальных машин в OpenStack Glance

Подтвердите после загрузки, перечислив доступные изображения.

# openstack image list
+--------------------------------------+-----------------+--------+
| ID | Name | Status |
+--------------------------------------+-----------------+--------+
| 37c638d5-caa0-4570-a126-2c9d64b262b4 | AlmaLinux-9 | active |
| 3ae8095e-a774-468b-8376-c3d1b8a70bdf | CentOS-Stream-9 | active |
| 83bf7ac6-9248-415b-ac89-269f2b70fdb4 | Debian-12 | active |
| 02799133-06ed-483d-9121-e3791c12bb1c | Fedora-39 | active |
+--------------------------------------+-----------------+--------+

Подтвердите вкусы

# openstack flavor list
+----+-----------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+------+------+-----------+-------+-----------+
| 1 | m1.tiny | 2048 | 20 | 0 | 1 | True |
| 2 | m1.small | 4096 | 30 | 0 | 1 | True |
| 3 | m1.medium | 8192 | 40 | 0 | 1 | True |
+----+-----------+------+------+-----------+-------+-----------+

Список сетей

# openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+--------------------------------------+
| 36577b59-f6e1-4844-a0d8-a277c9ddc780 | private | 6f216cd7-acd3-4c31-bc5e-67875c5dcc09 |
+--------------------------------------+---------+--------------------------------------+

Подтвердите настроенные группы безопасности.

# openstack security group list
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| 287e76b4-337a-4c08-9e3d-84efd9274edb | allow_all | Allow all ports | 9a102dfdf9a54e8382fefdca727b2553 | [] |
| c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | default | Default security group | 9a102dfdf9a54e8382fefdca727b2553 | [] |
+--------------------------------------+-----------+------------------------+----------------------------------+------+

Перечислите настроенные пары ключей на вашем OpenStack.

# openstack keypair list
+----------------+-------------------------------------------------+------+
| Name | Fingerprint | Type |
+----------------+-------------------------------------------------+------+
| default-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
| jmutai-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
+----------------+-------------------------------------------------+------+

Создание экземпляра виртуальной машины в вычислительной среде Nova

openstack server create --flavor m1.small \
--image AlmaLinux-9 \
--security-group allow_all \
--network private \
--key-name default-pubkey \
AlmaLinux-9

10. Настройка Horizon — панель управления OpenStack

Horizon — это проект на основе Django, направленный на предоставление полной панели управления OpenStack вместе с расширяемой средой для создания новых панелей мониторинга из повторно используемых компонентов. Единственной основной службой, необходимой для работы панели управления, является служба идентификации.

Установите пакет openstack для панели управления.

apt install openstack-dashboard -y

Открытый local_settings.py файл для редактирования.

vim /etc/openstack-dashboard/local_settings.py

# In line 99 : change Memcache server
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
},
}

# In line 107 : add
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# line 120 : set Openstack Host
# line 121 : comment out and add a line to specify URL of Keystone Host
OPENSTACK_HOST = "openstack.kalyuzhnyy.ru"
#OPENSTACK_KEYSTONE_URL = "http://%s/identity/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_URL = "https://openstack.kalyuzhnyy.ru:5000/v3"
# line 125 : set your timezone
TIME_ZONE = "Africa/Nairobi"

# Add to the end of file
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'

# set [True] below if you are using self signed certificate
OPENSTACK_SSL_NO_VERIFY = False

Также отредактируйте стандартный ssl-файл Apache.

# vim /etc/apache2/sites-available/default-ssl.conf
# In line 31,32, configure path to your SSL certificate and key
SSLCertificateFile /etc/letsencrypt/live/openstack.kalyuzhnyy.ru/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/openstack.kalyuzhnyy.ru/privkey.pem

# In line 41 : uncomment and specify your chain file
SSLCertificateChainFile /etc/letsencrypt/live/openstack.kalyuzhnyy.ru/chain.pem

r
# change to your Memcache server

Укажите адрес Memcache

# vim /etc/openstack-dashboard/local_settings.d/_0006_debian_cache.py
CACHES = {
'default' : {
#'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}

Создайте новый конфигурационный файл Apache для панели управления OpenStack.

vim /etc/apache2/conf-available/openstack-dashboard.conf

Добавьте содержимое ниже.

WSGIScriptAlias / /usr/share/openstack-dashboard/wsgi.py process-group=horizon
WSGIDaemonProcess horizon user=horizon group=horizon processes=3 threads=10 display-name=%{GROUP}
WSGIProcessGroup horizon
WSGIApplicationGroup %{GLOBAL}

Alias /static /var/lib/openstack-dashboard/static/
Alias /horizon/static /var/lib/openstack-dashboard/static/

<Directory /usr/share/openstack-dashboard>
Require all granted
</Directory>

<Directory /var/lib/openstack-dashboard/static>
Require all granted
</Directory>

Включение сайтов

a2enconf openstack-dashboard
a2enmod ssl
a2ensite default-ssl

Скопируйте файл политики.

mv /etc/openstack-dashboard/policy /etc/openstack-dashboard/policy.org

Перезапустите веб-сервер Apache.

chown -R horizon /var/lib/openstack-dashboard/secret-key
systemctl restart apache2

Теперь вы можете получить доступ к панели управления Horizon по адресу https://(имя хоста сервера)/
openstack dashboard

Войдите в систему с помощью пользователя в Keystone и соответствующего пароля.