Поиск по сайту:

Как установить OpenStack на Debian 12 (книжный червь)


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

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

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

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

Давай начнем!.

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

В нашей среде есть следующие переменные;

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

Установите имя хоста сервера.

sudo hostnamectl set-hostname osp01.home.cloudlabske.io

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

$ sudo vim /etc/hosts
192.168.1.2 osp01.home.cloudlabske.io 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 Identity можно запускать на одном и том же порту для всех интерфейсов.

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 osp01.home.cloudlabske.io

Создайте конфигурацию Apache VirtualHost для keystone. Это позволит нам получить доступ к API, используя полное доменное имя, а не 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/osp01.home.cloudlabske.io/cert.pem
  • /etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem
  • /etc/letsencrypt/live/osp01.home.cloudlabske.io/chain.pem

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

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

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

# 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 home.cloudlabske.io  -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/osp01.home.cloudlabske.io/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/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

Создайте файл доступа к трапецеидальным искажениям для клиента 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 (glance) позволяет пользователям кластера обнаруживать, регистрировать и получать образы виртуальных машин с помощью REST API. С помощью API вы можете запрашивать метаданные образа виртуальной машины и получать реальный образ. Образы виртуальных машин доступны через службу образов в различных местах.

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

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

Добавьте пользователя Glick в сервисный проект 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                             |
+---------------------+----------------------------------+

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

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

Создайте объект службы просмотра:

# 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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io:9292 |
+--------------+----------------------------------------+

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

apt install glance -y

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

Настройка API Glance

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] настройте доступ к службе идентификации.
[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://osp01.home.cloudlabske.io:5000
auth_url = https://osp01.home.cloudlabske.io: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/osp01.home.cloudlabske.io/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem";
}

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

systemctl restart nginx

5. Установите и настройте Нову

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

Компоненты службы вычислений OpenStack.

  • Служба nova-api: принимает вызовы API вычислений конечных пользователей и отвечает на них.
  • Служба метаданных nova-api: принимает запросы метаданных от экземпляров.
  • служба nova-compute: рабочий демон, который создает и завершает экземпляры виртуальных машин через API гипервизора.
  • Служба nova-scheduler: берет запрос экземпляра виртуальной машины из очереди и определяет, на каком хосте вычислительного сервера он выполняется.
  • Модуль nova-conductor: обеспечивает взаимодействие между сервисом nova-compute и базой данных.
  • Демон nova-novncproxy: предоставляет прокси-сервер для доступа к работающим экземплярам через соединение VNC.
  • daemon nova-spicehtml5proxy: предоставляет прокси-сервер для доступа к работающим экземплярам через соединение 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                             |
+---------------------+----------------------------------+

Добавьте роль администратора пользователю 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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io:6080/vnc_auto.html

# Glance connection info
[glance]
api_servers = https://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io:5000
auth_url = https://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io:5000
auth_url = https:/osp01.home.cloudlabske.io: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

Включите веб-сайт Apache с API размещения.

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/osp01.home.cloudlabske.io/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/osp01.home.cloudlabske.io/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://osp01.home.cloudlabske.io:6080/vnc_auto.html

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

systemctl restart nova-compute.service

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

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

Проверьте новый список хостинговых услуг nova.

# 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 (neutron) обеспечивает интеграцию для создания и подключения к сетям интерфейсных устройств, управляемых другими службами OpenStack.

Компоненты:

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

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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io:9696 |
+--------------+----------------------------------------+

2) Установить и настроить Нейтрон

Установите пакеты 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://osp01.home.cloudlabske.io:5000
auth_url = https://osp01.home.cloudlabske.io: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://osp01.home.cloudlabske.io: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 = osp01.home.cloudlabske.io
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 для открытия vswitch и включения драйвера 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 и добавьте сетевые настройки Neutron.

# 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://osp01.home.cloudlabske.io: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/osp01.home.cloudlabske.io/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/osp01.home.cloudlabske.io/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 с именем вашего физического сетевого интерфейса
  • breno1 с добавляемым мостом.
  • 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. Добавьте варианты вычислений и ключ SSH.

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

Образцы;

  • m1.tiny Версия с: ЦП 1, память 2048 МБ, корневой диск 20 ГБ
  • m1.small Версия с: ЦП 2, память 4096, корневой диск 30 ГБ
  • m1.medium Версия с: ЦП 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 = "osp01.home.cloudlabske.io"
#OPENSTACK_KEYSTONE_URL = "http://%s/identity/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_URL = "https://osp01.home.cloudlabske.io: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/osp01.home.cloudlabske.io/cert.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem

# In line 41 : uncomment and specify your chain file
SSLCertificateChainFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/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://(имя хоста сервера)/.

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

Заключение

Установка OpenStack на Debian 12 (Bookworm) дает вам мощное, надежное и масштабируемое решение для облачной инфраструктуры. Если вы шаг за шагом выполнили шаги, описанные в этой статье, вы сможете уверенно настроить свою облачную систему OpenStack, которая будет использовать стабильность Debian. Мы надеемся, что эта статья вам очень помогла, и благодарим вас за посещение нашего сайта.

Статьи по данной тематике: