- Мы развернули платформу Deckhouse на узле с Astra Linux. Рассказываем, как (и зачем)
- Запускаем ВМ на Astra Linux
- Добавляем ВМ в кластер
- Вывод
- P.S.
- Как создать cloud-init шаблон ОС Astra Linux в Proxmox
- План работы
- Качаем cloud образ Astra Linux 1.7
- Создаем VM в Proxmox используя скачанный образ
- Конвертируем собранную VM в шаблон (template)
- Клонируем из шаблона полноценную VM
- Инициализируем VM через cloud-init
- Расширяем диск
- Настраиваем cloud-init
- Запускаем и проверяем VM
- cloud-init
- Использование с qemu
Мы развернули платформу Deckhouse на узле с Astra Linux. Рассказываем, как (и зачем)
Astra Linux — российская операционная система специального назначения, актуальная версия которой основана на Debian 10.0 (Buster). В частности, эту ОС используют органы государственной власти, госслужбы и госкорпорации. Astra Linux включена в единый реестр российского ПО, сертифицирована ФСТЭК, а версия Astra Linux Special Edition еще и отвечает требованиям по защите любой информации ограниченного доступа: персональных данных, конфиденциальной информации, а также гостайны до уровня особой важности.
Наши заказчики все чаще спрашивают, подходит ли платформа Deckhouse для импортозамещения. Это побудило нас связаться с командой Astra Linux, чтобы обсудить сотрудничество.
Сначала нужно было понять, какие ограничения могут возникнуть при запуске Deckhouse на ВМ с Astra Linux. Мы взяли достаточно старую и широко распространенную версию Astra Linux Common Edition 2.12.43, которая основана еще на Debian 9.
Запускаем ВМ на Astra Linux
Для внутренних экспериментов в качестве облака мы используем OpenStack. У Astra Linux есть специальный образ — cloud-init orel-vanilla-2.12.43-cloud-mg6.0.0, — который доступен в формате qcow. Мы залили его в OpenStack и все заработало:
openstack image create --public --disk-format qcow2 --file ~/Downloads/orel-vanilla-2.12.43-cloud-mg6.0.0.qcow2 orel-vanilla-2.12.43-cloud
Далее решили добавить ВМ на Astra Linux в существующий кластер как worker-узел.
Добавляем ВМ в кластер
Сразу скажу, что Orel взлетел, однако для этого пришлось решить три проблемы.
Отсутствие поддержки Debian в Deckhouse. Astra Linux базируется на Debian, но Deckhouse пока официально работает только с Ubuntu и CentOS. Мы сразу вспомнили соответствующий issue — и решили обязательно добавить поддержку Debian в рамках будущей интеграции с Astra Linux.
На сей раз мы добавили ВМ как статичный узел и запустили в расчете на то, что всё заработает на Ubuntu (в основе которой — Debian). И всё заработало… хотя пришлось немного попинать по колесам и постучать молотком — об этом ниже.
Отсутствие пакета conntrack. У Kubernetes есть инструкция, как поставить kubelet на Debian-дистрибутив. Но в зависимостях требуется пакет conntrack, которого не было в дистрибутиве Astra Linux. Пришлось устанавливать kubelet как бинарник (см. раздел инструкции Without a package manager).
Старая версия nginx. Для проксирования запросов с узлов к kube-api-server мы используем nginx. В репозитории пакетов Astra Linux на момент эксперимента был только nginx версии 1.14, в котором нет модуля ngx_stream_module. Поэтому пришлось поправить автоматически сгенерированный конфиг для proxy и подключить модуль динамически через load_module /usr/lib/nginx/modules/ngx_stream_module.so .
При этом в новом релизе Astra Linux Special Edition все необходимые пакеты и компоненты уже есть — и conntrack, и новый nginx.
По результатам нагрузочного и функционального тестирования проблем не выявлено.
Вывод
Благодаря эксперименту мы убедились, что для полноценной поддержки даже старых версий Astra Linux никаких серьезных ограничений у Deckhouse нет. Потребуется небольшая доработка только со стороны платформы.
Вместе с коллегами из ГК Astra Linux мы продолжим работать над совместимостью Deckhouse и ОС.
P.S.
Читайте также в нашем блоге:
Как создать cloud-init шаблон ОС Astra Linux в Proxmox
Вы когда-нибудь задумывались над тем, как вы создаете виртуальные машины?
Классический и самый банальный способ создания виртуальной машины (VM):
- Создать VM в гипервизоре
- Сконфигурировать параметры VM
- Примонтировать ISO-образ ОС, которую нужно установить на VM
- Запустить VM и установить ОС с ISO-образа
- Для упрощения будущей жизни, можно создать из данной VM шаблон (template)
Как правило, это долгий и скучный процесс, богатый ручной работой. Конечно, можно использовать Packer, но время установки это сократит лишь чуть-чуть.
При таком подходе, создание кластера из нескольких одинаковых VM может затянуться на долгое время, только из-за установки хостовой ОС.
Сейчас нас окружает мир облачных технологий, когда вы покупаете VM у одного из клауд-провайдеров, где все происходит быстро:
- Ввели имя пользователя, которого необходимо создать при инициализации VM
- Пароль или публичный ключ от создаваемого пользователя
- Нажали на кнопку «Создать»
- Вуаля! VM готова к работе! Без какой-либо установки и ручной конфигурации пользователя!
Вот для этого и были придуманы cloud-init образы. Сloud-init это программа для инициализации виртуальных машин, обычно применяющаяся в облачных платформах. Но использовать cloud-init можно и локально, например в Proxmox, который успешно поддерживает данную технологию.
Все что нам надо — cloud-init образ нужной ОС. Данная статья применима для любого cloud-init образа. Я покажу, как это делать на примере Astra Linux 1.7
План работы
- Качаем cloud образ Astra Linux 1.7 (можно создать самому, с использованием cloud-init, но это тема другой статьи)
- Создаем VM в Proxmox используя скачанный образ
- Конвертируем собранную VM в шаблон (template)
- Клонируем из шаблона полноценную VM
- Инициализируем VM через cloud-init
Качаем cloud образ Astra Linux 1.7
Интересующие нас образы я брал отсюда.
Заходим по ssh на наш Proxmox и качаем нужный нам образ, в моем случае — alse-vanilla-1.7.3-cloud-max-mg8.2.1.qcow2
wget alse-vanilla-1.7.3-cloud-max-mg8.2.1.qcow2
Создаем VM в Proxmox используя скачанный образ
qm create 700 --name "alse-vanilla-1-7-3-cloudinit-max-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0 qm importdisk 700 alse-vanilla-1.7.3-cloud-max-mg8.2.1.qcow2 local-lvm qm set 700 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-700-disk-0 qm set 700 --boot c --bootdisk scsi0 qm set 700 --ide2 local-lvm:cloudinit qm set 700 --serial0 socket --vga serial0 qm set 700 --agent enabled=1
Знакомых с синтаксисом управления Proxmox данные строчки удивить не должны.
Для начинающих поясню. В примере создается виртуальная машина с VMID=700 (можно указать любой, это просто идентификатор вашей VM), 2Gb RAM, 2 ядрами CPU, соответствующим сетевым интерфейсом.
Затем мы импортируем скачанный нами cloud образ Астры в локальное хранилище Proxmox и подключаем как диск к созданной VM. После этого подключаем cloud-init хранилище, для последующей инициализации.
Вы можете использовать любые нужные вам настройки или настраивать все в GUI. Все что надо — подключить диск со скачанным образом и cloud-init хранилище.
Конвертируем собранную VM в шаблон (template)
После всех подготовительных мероприятий создаем шаблон нашей ОС.
Клонируем из шаблона полноценную VM
Шаблоны нужны нам для клонирования VM, поэтому нажимаем ПКМ на созданном темплейте и выставляем мод «Full Clone».
Назвал я свою VM astra-test , вы можете как угодно обозвать.
Нажимаем «Clone» и дожидаемся окончания клонирования.
Инициализируем VM через cloud-init
После завершения клонирования VM, можно поправить настройки «железа» и увеличить размер диска.
Расширяем диск
Для этого в разделе Hardware нажимаем на Hard Disk -> Disk Action -> Resize.
Указываем нужный вам размер диска и нажимаем «Resize disk». Самое главное, что система сама займет и разметит нужное пространство при загрузке.
Теперь самое главное — переходим в раздел Cloud-init
Настраиваем cloud-init
В соответствующих полях задаем нужные нам параметры, которые мы хотим создать в системе во время запуска:
- логин пользователя
- пароль пользователя
- настройки DNS
- открытый SSH ключ пользователя
- настройка сети (можно оставить DHCP, но я укажу IP-вручную)
Далее жмем «Regenerate Image».
Подготовительные мероприятия завершены, можно запускать VM для проверки!
Запускаем и проверяем VM
После запуска VM astra-test в статистике мы видим 2 IP-адреса: один получен от моего DHCP-сервера, второй мы задали сами.
Такое бывает, можно отключить DHCP уже в самой ОС.
Пробуем подключиться по SSH к нашей VM, используя адрес и креды, которые мы указывали при настройке cloud-init в Proxmox
Готово, даже hostname настроился сам, по имени виртуальной машины в Proxmox. И да, если переименовать VM, hostname изменится за вас сам.
Теперь можно натравливать свой Terraform с Ansible на данный шаблон и создавать кластеры из большого количества виртуальных машин за считанные минуты!
Надеюсь, что данная статья будет кому-то полезна, для упрощения и экономии времени на создание стендов, кластеров и т.д.
cloud-init
cloud-init это программа для инициализации виртуальных машин, обычно применяющаяся в облачных платформах. Но использовать cloud-init можно и локально. Примеры конфигурационных файлов — https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
Использование с qemu
Для начала создадим каталог, в котором будем работать, и зайдем в него.
$ mkdir cloud-init-example $ cd cloud-init-example
Затем потребуется образ виртуальной машины с поддержкой cloud-init. Например, можно взять cloud образ ALT.
Данные для cloud-init описываются в конфигурационном файле в формате yaml. Пример минимальной конфигурации, задающей только ключ для пользователя root. Вместо нужно подставить ваш публичный ключ.
$ cat user-data.yaml #cloud-config users: — name: root ssh_authorized_keys: —
Для преобразования конфигурационного файла в метаданные потребуется программа cloud-localds из пакета cloud-utils.
# apt-get install cloud-utils $ cloud-localds my-seed.img user-data.yaml
Для использования kvm пользователь должен быть в группе vmusers .
Осталось только запустить виртуальную машину.
$ qemu -machine accel=kvm -m 2G -cpu host -smp 2 -drive file=alt-sisyphus-cloud-x86_64.qcow2,if=virtio -drive file=my-seed.img,if=virtio,format=raw,force-share=on,read-only=on -daemonize -display none -nic user,hostfwd=tcp::22222-:22
И зайти по ssh. Может потребоваться подождать некоторое время, пока машина будет загружена и инициализирована.
$ ssh root@localhost -p 22222