Разработка приложений иногда достигает такого уровня, когда тестировать новые функции на статических окружениях становится неудобно. Окружений не хватает, разработчики мешают друг другу при запуске тестов. Такая проблема возникла у одного из наших клиентов.  Мы решили сделать гибридный кластер Kubernetes на базе существующего bare-metal-кластера, чтобы: на лету заказывать узлы у облачного провайдера, когда в основном кластере заканчиваются ресурсы; разворачивать на этих узлах нужные окружения для тестов; сворачивать окружения после выхода изменений в production и отключать узлы. Для этого мы воспользовались модулем cloud-provider-openstack, который входит в состав Kubernetes-платформы Deckhouse. Расскажу, как это работает. ☝️ В статье рассматривается вариант развертывания гибридного кластера в Selectel и OpenStack-облаке, которое предоставляет провайдер. Но сам подход универсален, его можно применять, к примеру, и на собственной инфраструктуре. У нас был bare-metal-кластер Kubernetes, расположенный в Selectel. Узлы в нем находились в разных зонах: SPB-3 и SPB-5. Также некоторые приложения использовали managed PostgreSQL, расположенный в облачной зоне ru-3. Чтобы была возможность дозаказывать узлы в OpenStack-облаке Selectel, нам пришлось настроить сетевое взаимодействие между уже существующими сетями и облачными. Так выглядит L3VPN-роутер от Selectel, который позволяет связать bare-metal-узлы в зонах SPB-3 (network_SPB-3) и SPB-5 (network_SPB-5) с PostgreSQL (network_ru-3): Четвёртую сеть — k8s_l3vpn — добавили инженеры Selectel, чтобы связать виртуальные машины (ВМ) в облаке с остальными сетями. Облачным ВМ нужен доступ не только к внутренним сетям, но и во внешнюю сеть. Поэтому пришлось сделать две сети в облаке и попросить коллег из Selectel настроить маршруты в них. Одна из сетей дает ВМ доступ во внешнюю сеть: Через вторую L3VPN-роутер связывает облачные ВМ с остальными сетями: Две этих сети объединены отдельным облачным роутером, который подключен к внешней сети: Затем мы попросили настроить маршрутизацию таким образом, чтобы ВМ, которые заказываются в сети k8s_l3vpn (192.168.200.0/24), получали маршруты вида: В результате получилась такая схема:  доступ во внешнюю сеть k8s-external-access реализован через основной шлюз 192.168.200.1; доступ к «серым» подсетям организован через шлюз 192.168.200.252. На этом подготовительные работы были закончены. Мы создали сервисного пользователя с доступом к проекту, в котором заказываются ВМ. Сделать это можно в личном кабинете Selectel: Профиль и настройки → Управление пользователями → Добавить пользователя → Сервисный пользователь. Там нужно указать имя, пароль и выдать права администратора необходимого проекта: Затем мы создали keypair, чтобы при необходимости подключаться к ВМ по ключу: Также можно загрузить свой образ, с которым будет бутстрапиться новая ВМ с помощью openstack image create. Чтобы настроить OpenStack CLI под созданного пользователя, скачали скрипт в разделе Облачная платформа → Доступ, выбрав там нужного пользователя: И выполнили: Для работы с OpenStack мы воспользовались модулем Deckhouse cloud-provider-openstack. Вот его конфигурация: Со всеми доступными параметрами модуля можно ознакомиться в разделе документации «OpenStack: настройки». Сначала создали flavor с нужными параметрами: Затем InstanceClass: И, наконец, NodeGroup: Через 2–3 минуты после создания NodeGroup узлы начинают заказываться с учетом параметра minPerZone и добавляться в кластер. За процессом можно следить в панели Selectel: И в кластере: Смотрим на узлы с точки зрения cloud instance manager'a: Если при создании возникают ошибки, связанные с недостаточностью прав или некорректным подключением к API, их можно наблюдать в логах контроллера: Когда временные окружения сворачиваются и ресурсы в кластере освобождаются, Cluster Autoscaler удаляет облачные ВМ. Если требуется удалить ненужную ВМ вручную, нужно выполнить два шага. Получаем список машин: Удаляем ненужную: С помощью модуля cloud-provider-openstack, который входит в состав платформы Deckhouse, мы превратили обычный bare-metal-кластер в гибридный. В нем можно создавать различные группы узлов под специфические цели с непостоянной нагрузкой и масштабировать узлы в зависимости от потребностей. Хотя в статье рассматривается вариант развертывания гибридного кластера в Selectel, связку «Deckhouse + модуль cloud-provider-openstack» можно использовать где угодно, в том числе и на собственной инфраструктуре. Читайте также в нашем блоге: «Автомасштабирование и управление ресурсами в Kubernetes (обзор и видео доклада)»; «Используем mcrouter для горизонтального масштабирования memcached»; «Вертикальное автомасштабирование pod'ов в Kubernetes: полное руководство».