Меня зовут Тимофей, я руководитель отдела разработки 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
Если что-то лежит — смотрим логи проблемного контейнера. Также поможет заглянуть в
Официальная страничка посвященная решению проблем.
Надеюсь помог
С вами был Тимофей, надеюсь гайд был полезен. Спасибо всем кто подписывается в телеге — это очень мотивирует делиться своим опытом.
