Речь пойдёт о варианте быстрой и удобной организации изолированного окружения для разработки. Не любой разработки и не любого окружения, но вполне типового — сетевые сервисы и прилагающиеся к ним очевидные базы данных, очереди и т.п.
Требования к dev-окружению — полнота, изолированность и простота разворачивания на рабочем месте.
Пройдя путь от полностью локальной разработки, через организацию контейнерного окружения (привет Docker с композером), автор в итоге пришёл к dev-окружению в рамках экосистемы Kubernetes. Началось всё с изучения k8s и экспериментов и развилось в конфигурацию Kubernetes, которую легко развернуть на локальной машине разработчика.
Итак, что же скрывается под условным названием Me DevOps (github):
- LXC/LXD контейнер основанный на Funtoo Linux;
- k3s — облегчённый вариант Kubernetes, заявленный на использование с ограниченными вычислительными ресурсами.
Особенности:
После установки будет развёрнут в lxd-контейнере предварительно настроенный локальный узел Kubernetes и со стороны хоста доступны следующие сервисы:
devops.me:32000
— container registry;http://portainer.devops.me
— админкаPortainer CE
;postgresql://postgres:postgres@devops.me:32432/postgres
— PostgreSql 14;devops.me:32672
— Bitnami RabbitMQ;http://hasura.devops.me
— консоль Hasura;http://amqp.devops.me
— админка RabbitMQ.
В самом контейнере доступны:
- kubectl;
- Helm 3;
- k9s.
Установка
Что необходимо на хосте для установки и использования Me DevOps
:
- установленный менеджер контейнеров LXC/LXD;
- опционально, установленный Docker;
- доступное дисковое пространство 5+ Gb;
- права пользователя на управление контейнерами;
- желательно, минимальные познания в администрировании и небольшое представление о k8s.
Скачиваем образ контейнера
wget https://github.com/unreg/me-devops/releases/download/2022.10.19/k3s-lxd-x86_64-me-devops.tar.xz
Устанавливаем образ:
lxc import k3s-lxd-x86_64-me-devops.tar.xz --alias me-devops
Инициализируем контейнер:
lxc init me-devops me-devops
Для работы k3s необходимо расшарить контейнеру /dev/kmsg
, для дистрибутива с cgroup2 это можно сделать так:
lxc config device add "me-devops" "kmsg" unix-char source="/dev/kmsg" path="/dev/kmsg"
Запускаем контейнер:
lxc start me-devops
Смотрим состояние и IP-адрес контейнера:
lxc list
+-----------------------------+---------+-----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-----------------------------+---------+-----------------------+------+-----------+-----------+
| me-devops | RUNNING | 10.147.36.92 (eth0) | | CONTAINER | 0 |
+-----------------------------+---------+-----------------------+------+-----------+-----------+
Первоначальная настройка контейнера с узлом Kubernetes
Заходим в контейнер:
lxc exec me-devops -- su --login dev
Устанавливаем Container registry и Portainer:
cd ~/k3s
~/k3s $ ./environment.sh
namespace/container-registry created
persistentvolumeclaim/registry-pvc created
persistentvolume/registry-pv created
service/registry created
deployment.apps/registry created
namespace/portainer created
serviceaccount/portainer-sa-clusteradmin created
persistentvolumeclaim/portainer created
clusterrolebinding.rbac.authorization.k8s.io/portainer created
service/portainer created
deployment.apps/portainer created
ingress.networking.k8s.io/portainer created
Опционально устанавливаем набор приложений - PostgreSql, Hasura, RabbitMQ:
~/k3s $ ./db.sh
namespace/db created
persistentvolumeclaim/postgresql-pvc created
persistentvolume/postgresql-pv created
configmap/postgresql created
statefulset.apps/postgresql created
service/postgresql created
service/postgresql-default created
deployment.apps/hasura created
service/hasura created
service/hasura-default created
persistentvolumeclaim/rabbitmq-pvc created
persistentvolume/rabbitmq-pv created
configmap/rabbitmq created
statefulset.apps/rabbitmq created
service/rabbitmq created
service/rabbitmq-default created
ingress.networking.k8s.io/hasura created
ingress.networking.k8s.io/rabbitmq created
Первоначальная настройка хоста
Добавляем локальный домен devops.me
в /etc/hosts
:
...
10.147.36.31 devops.me portainer.devops.me hasura.devops.me amqp.devops.me
...
Разрешаем хостовому докеру несекьюрный локальный реестр /etc/docker/daemon.js
:
{
"insecure-registries" : [ "devops.me:32000" ]
}
Что дальше?
Исходя из того, что у вас есть полноценный локальный узел Kubernetes:
- используя helm, kubectl или даже Portainer управляйте приложениями и сервисами;
- добавляйте свои образы и разработанные приложения через локальный container registry.
Для удобства консольного администрирования в контейнере предустановлен tmux
, войти в преднастроенную сессию можно следующим образом:
lxc exec me-devops -- su --login dev /home/dev/mpx.sh
tmux
по старой привычке перенастроен на управление через Ctrl^a
, в сессии по умолчанию два экрана, на нулевом несколько консолек, на первом запущен CLI менеджер k9s
(на КДПВ).
Файлы настроек tmux
:
/home/dev/.tmux.conf
/home/dev/mpx.sh
На что стоит обратить внимание в контейнере:
/home/dev/k3s
- каталог манифестов предустановленных приложений и сервисов;/var/data
- каталог persistent-хранилища, при желании сохранения результатов работы его можно смонтировать на хранилище хоста средствами LXC/LXD.
Удаление Me Devops
Если, всё выше написанное оказалось ненужным, не заработало или пришло в состояние «проще переустановить, чем разобраться», то просто удалите контейнер и образ:
lxc stop me-devops
lxc rm me-devops
lxc image rm me-devops
Возможные проблемы
- кубер отказывался работать в контейнере, если rootfs располагалась на btrfs-разделе
Ссылки
Лицензии
- MeDevOps - MIT
- Статья - CC BY-NC-ND
Disclaimer, он же отказ от ответственности или предугаданные вопросы и ответы
Для кого всё это?
С одной стороны, опытный разработчик в подобном не нуждается, на то он и опытный, что сам способен организовать себе окружение. А не совсем опытный, может, даже и не поймёт о чём речь. Считайте, что это просто описание одного из подходов к организации локального окружения для разработки с рабочим примером.
И в названии проекта заложена изрядная доля иронии.
Какой дистрибутив в основе контейнера? Он оптимальный, минимальный, безопасный и т.п.?
Образ контейнера построен на Funtoo
, выбор дистрибутива основан на удобстве сборки образа и не имеет цели сделать что-то ещё, кроме локального узла Kubernetes для разработки, тем более решать вопросы безопасности. Первоначальный размер образа контейнера около 2.7 Гб.
Кроме того, образ контейнера является полноценной Funtoo, синхронизировав meta-repo через ego sync
можно пользоваться emerge
для установки приложений в rootfs контейнера. Но, очевидно, что в описанном ключе смысла в этом немного.
Возможно ли подключиться к контейнеру не через консоль
lxc exec
, а по ssh?
Да, для этого установите пароль пользователю dev
или добавьте свои ключи.
Хочу поменять доступ к postgresql, да и админка раббита просит пароль, как их узнать?
Всё есть в файлах-манифестах по пути /home/dev/k3s/configs
. При желании, отредактируйте манифесты и инициализируйте контейнерные сервисы заново.
А что там с телеметрией?
Кроме дистрибутивных приложений, k3s и Helm никаких дополнительных трекеров при сборке образа добавлено не было.
Какие гарантии, что это всё заработает и ничего не сломает?
Никаких гарантий, все действия вы выполняете осознанно и самостоятельно, на свой страх и риск. Автор ничем вам не обязан и не несёт ответственности за возможные последствия. Если вы в чём-то не уверены или сомневаетесь, остановитесь и не продолжайте.