Меня зовут Тимофей, я руководитель отдела разработки Kkube. В прошлом fullstack разработчик и у меня даже есть публичный WakaTime. Также веду свою группу в ТГ.

Относительно недавно была задача — развернуть OpenStack на чистом сервере с целью организовать полноценный полигон для будущего ЦОД-а (дата центра). Я долго ходил вокруг да около, собирал информацию. Как и ожидал в РФ сегменте информации мало, поэтому пришлось быть первопроходцем во многих вопросах и работать с оригинальной документацией. Она довольно хорошая, но ее очень много и знакомство было непростым.

Что такое OpenStack

OpenStack — это Open Source платформа для построения частных и публичных облаков, позволяющая управлять вычислительными ресурсами, хранилищем и сетью через единый API. По сути, это ваш собственный «Self Hosted AWS». Он нужен компаниям, которым важен контроль над инфраструктурой и независимость от вендоров: банкам, провайдерам собственных телекоммуникационных услуг, хостинг/облачным провайдерам, государственным организациям. OpenStack был изначально создан совместными усилиями NASA и Rackspace в 2010 году и все модули опубликованы с исходным кодом.

Совсем простыми словами если вы добыли где-то серверное оборудование, вы можете купить пул IP адресов и стать конкурентом Yandex Cloud. Но чтобы раздавать пользователям те же самые VPS, вам потребуется платформа управления вашей физической инфраструктурой, это и позволяет OpenStack.

Из чего состоит

Сама по себе OpenStack это множество модулей, каждый из которых выполняет свою функцию. Модули работают независимо и взаимодействуют через API, что позволяет собирать облако как конструктор — устанавливая только то, что действительно нужно.

Ниже буду использовать термин — Bare Metal. В переводе с английского — голое железо, но это может создать искаженное понимание. На самом деле Bare Metal — это железо на котором вполне может быть ОС, но на нем нет никакой виртуализации, то есть мы имеем доступ напрямую к железу.

  • Nova — управление виртуальными машинами, ядро всей платформы.

  • Neutron — сетевая подсистема: виртуальные сети, маршрутизаторы, файрволы, балансировщики.

  • Cinder — позволяет создавать виртуальные диски, подключать их к Bare Metal или виртуальным машинам.

  • Swift — объектное хранилище, аналог Amazon S3 для хранения файлов, бэкапов, медиа.

  • Keystone — сервис аутентификации и авторизации, единая точка управления пользователями и правами.

  • Glance — хранение и управление образами ОС для развёртывания виртуальных машин.

  • Horizon — веб-панель управления, дашборд для администраторов и пользователей.

  • Heat — оркестрация, описание инфраструктуры как кода (аналог AWS CloudFormation).

  • Ceilometer / Gnocchi — телеметрия и мониторинг, сбор метрик потребления ресурсов.

  • Ironic — управление Bare Metal серверами. С помощью него мы можем накатить на определенную железке нужную ОС (образ ОС из Glance). Он включает в себя PXE-Загрузку — то есть нам не нужно физически подходить с флешкой к серверу.

  • Octavia — балансировка нагрузки (Load Balancer as a Service).

  • Barbican — управление секретами: ключи, сертификаты, пароли. По сути безопасное хранилище для них.

  • Manila — файловое хранилище (Shared Filesystem as a Service, аналог NFS/CIFS в облаке). Производный модуль от Cinder.

  • CloudKitty — модуль рейтинга и биллинга. Связан с Ceilometer / Gnocchi, но специализирован на привязку к выставлению счетов для коммерческих целей.

Системные требования

На данный момент минимально необходимая конфигурация:

  • 2 network interfaces

  • 8GB main memory

  • 40GB disk space

Почему именно два?

Один — сюда мы подключаемся для ручного управления (API, SSH, Horizon).

Второй — Neutron заберёт себе целиком для внешней сети виртуальных машин. Это интерфейс без IP-адреса — Neutron сам будет им управлять.

Установка open-stack через kolla-ansible

Перед началом рекомендую ознакомиться с Ansible и Docker.

Кратко про Ansible

Ansible — невероятно простой инструмент. По сути он позволяет написать список действий, которые нужно выполнить на целевой машине подключаясь к ней:

  • По SSH

  • WinRM для Windows

  • Можно даже локально на текущем хосте без подключения куда-то.

Суть работы с Ansible простая — описываете список инструкций, будто вы даете задачку коллеге DevOps'у. Эти инструкции называются плейбуки (Playbook) и имеют свой собственный синтаксис основанный на YAML. Вдобавок вы указываете одну или список "нод" — хостов/машин на которые надо подключиться чтобы что-то сделать. Мы будем использовать ниже самую простейшую конфигурацию установки OpenStack, где все будет устанавливаться в режим all-in-one. То есть все компоненты будут установлены на одну целевую машину.

В целом этот подход называется infrastructure as code. Такой же подход реализует Terraform но это уже отдельная тема.

И что важно, Ansible стремиться к идемпотентности — сколько раз не выполн��й, результат будет один и тот же. Если конечно вы ограничиваетесь стандартным набором правил и не запускаете какой-то кастомный bash скрипт в процессе плейбуков.

Kolla-ansible это надстройка над Ansible заточенная специально под установку OpenStack. То есть он имеет уже все необходимое для развертывания OpenStack, готовые плейбуки и минимально необходимые конфиги. Рекомендую именно такой подход если не хотите зависнуть на недели с этой задачей.

Настройка сети перед установкой

Одно из требований перед установкой: иметь 2 network интерфейса. Первый скорее всего имеется и настроен. Второй нужно настроить вручную. Для начала проверим доступные интерфейсы:

ip addr show

Ожидаемый вывод примерно такой:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:25:90:86:9e:e0 brd ff:ff:ff:ff:ff:ff
    altname enp7s0f0
    inet 192.168.0.129/24 metric 100 brd 192.168.0.255 scope global dynamic eno1
       valid_lft 313sec preferred_lft 313sec
    inet6 fe80::225:90ff:fe86:9ee0/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:25:90:86:9e:e1 brd ff:ff:ff:ff:ff:ff

Настраиваем eth1, который будет использоваться для внешней сети. Находим файл конфигурации в /etc/netplan и дописываем в него конфигурацию, итоговый вид файла:

network:
  version: 2
  ethernets:
    eno1:
      dhcp4: true
    eth1:
      dhcp4: false
      dhcp6: false

Проверяем конфигурацию и применяем ее:

sudo netplan try
sudo netplan apply

Теперь можно посмотреть что изменилось

 ip link show eth1

В угловых скобках появилось NO-CARRIER

3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000

Подготовка к установке

Для начала создадим пользователя kolla от имени которого будем осуществлять установку.

sudo useradd -m -s /bin/bash kolla

Назначим пароль

sudo passwd kolla

Добавим в группу sudo

sudo usermod -aG sudo kolla

Настроим возможность выполнения sudo команд без пароля.

Создаем sudoers для пользователя.

sudo tee /etc/sudoers.d/kolla << EOF
kolla ALL=(ALL) NOPASSWD:ALL
EOF

Установим правильные права.

sudo chmod 440 /etc/sudoers.d/kolla

Теперь нужно созданному пользователю сгенерировать SSH ключ.

Переключаемся на пользователя.

sudo su - kolla

Создаем ключ.

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

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

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

На всякий случай ставим правильный права на .ssh директорию и ее файлы.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa

Проверим что подготовка прошла успешно.

Проверяем возможность подключение к localhost без пароля.

ssh kolla@localhost

Проверяем sudo без пароля

sudo whoami

Действуем по инструкции kolla-ansible

Официальная инструкция по установке

Все действия проделываем от имени пользователя "kolla"

Создаем виртуальное окружение.

python3 -m venv ~/kolla-venv

Активируем окружение.

source ~/kolla-venv/bin/activate

Обновляем pip

pip install -U pip

Установка kolla-ansible

Необходимо выяснить актуальную стабильную версию kolla-ansible (смотреть в официальном репозитории).
На данный момент возьмем ветку stable/2024.2

pip install git+https://opendev.org/openstack/kolla-ansible@stable/2024.2

Создаем директорию kolla

sudo mkdir -p /etc/kolla

Назначаем текущего пользователя владельцем директории

sudo chown $USER:$USER /etc/kolla

Копируем файлы с globals.yml и passwords.yml в /etc/kolla дирекорию.

cp -r ~/kolla-venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla

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

mkdir ~/kolla-deployment

Переходим в рабочую директорию.

cd ~/kolla-deployment

Копируем файл all-in-one файл в текущую директорию.

cp ~/kolla-venv/share/kolla-ansible/ansible/inventory/all-in-one .

Установка зависимостей.

kolla-ansible install-deps

Генерируем пароли, которые появятся в файле /etc/kolla/passwords.yml.

kolla-genpwd

Настройка globals.yml

Файл с основной конфигурацией находится в /etc/kolla/globals.yml.

Открываем его через nano и редактируем выставляя нужные параметры.

kolla_base_distro: "ubuntu"

Для сетевых настроек нужно смотреть

ip addr show

В нашем случае выставляем:

# Основной интерфейс для management трафика
network_interface: "eno1"

# Интерфейс для внешних сетей Neutron
neutron_external_interface: "eth1"

# VIP адрес для HA (из вашей подсети, но свободный)
kolla_internal_vip_address: "192.168.0.250"

Deploy

kolla-ansible bootstrap-servers -i ./all-in-one
kolla-ansible prechecks -i ./all-in-one
kolla-ansible deploy -i ./all-in-one

Проверка работоспособности и использование

Через докер смотрим что все контейнеры поднялись

docker ps

Накатываем openstackclient. Но тут внимательно проверьте что там сейчас в релизе и совместимо ли с вашей версией OpenStack (в гайде мы накатывали stable 2024.2).

pip install python-openstackclient

Завершаем настройку

kolla-ansible post-deploy

Файл с конфигурацией подключения клиента clouds.yaml будет сгенерирован по пути /etc/kolla/clouds.yaml. Вы можете использовать его, скопировав в /etc/openstack или ~/.config/openstack, либо задав переменную окружения OS_CLIENT_CONFIG_FILE. В этом файле текущая действующая конфигурации OpenStack, доступ к horizon.

Пробуем вывести сервисы OpenStack

openstack service list

Если по каким-то причинам client openstack CLI не подтянул переменные и не хочет работать, можно загрузить их командой

source /etc/kolla/admin-openrc.sh

Доступ к Horizon

URL по которому можно зайти на Horizon (Дашборд в браузере) указывался в /etc/kolla/globals.yml на этапе установке. Параметр kolla_internal_vip_address.

  • Логин: admin

  • Пароль можно найти в файле /etc/kolla/passwords.yml в параметре keystone_admin_password

Решение проблем

Может потребоваться установка python SDK для docker

pip install docker

И

pip install dbus-python

Еще поможет глянуть состояние докер контейнеров

docker ps

Если что-то лежит — смотрим логи проблемного контейнера. Также поможет заглянуть в


Официальная страничка посвященная решению проблем.


Надеюсь помог

С вами был Тимофей, надеюсь гайд был полезен. Спасибо всем кто подписывается в телеге — это очень мотивирует делиться своим опытом.