Июн 13 2024

Речь в этой статье пойдёт о варианте быстрой и удобной организации изолированного окружения для разработки. Не любой разработки и не любого окружения, но вполне типового — сетевые сервисы и необходимые им очевидные базы данных, очереди и т.п.

Требования к dev-окружению: полнота, изолированность и простота развёртывания на рабочем месте.

Сейчас вместо локальной разработки намного проще, быстрее и удобнее развернуть полноценное dev-окружение на 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-разделе

Ссылки

Лицензии

Disclaimer, он же отказ от ответственности или предугаданные вопросы и ответы

Для кого всё это?

С одной стороны, опытный разработчик в подобном не нуждается, на то он и опытный, что сам способен организовать себе окружение. А не совсем опытный, может, даже и не поймёт о чём речь. Считайте, что это просто описание одного из подходов к организации локального окружения для разработки с рабочим примером.

И в названии проекта заложена изрядная доля иронии.

Какой дистрибутив в основе контейнера? Он оптимальный, минимальный, безопасный и т.п.?

Образ контейнера построен на Funtoo, выбор дистрибутива основан на удобстве сборки образа и не имеет цели сделать что-то ещё, кроме локального узла Kubernetes для разработки, тем более решать вопросы безопасности. Первоначальный размер образа контейнера около 2.7 Гб.

Кроме того, образ контейнера является полноценной Funtoo, синхронизировав meta-repo через ego sync можно пользоваться emerge для установки приложений в rootfs контейнера. Но, очевидно, что в описанном ключе смысла в этом немного.

Возможно ли подключиться к контейнеру не через консоль lxc exec, а по ssh?

Да, для этого установите пароль пользователю dev или добавьте свои ключи.

Хочу поменять доступ к postgresql, да и админка раббита просит пароль, как их узнать?

Всё есть в файлах-манифестах по пути /home/dev/k3s/configs. При желании, отредактируйте манифесты и инициализируйте контейнерные сервисы заново.

А что там с телеметрией?

Кроме дистрибутивных приложений, k3s и Helm никаких дополнительных трекеров при сборке образа добавлено не было.

Какие гарантии, что это всё заработает и ничего не сломает?

Никаких гарантий, все действия вы выполняете осознанно и самостоятельно, на свой страх и риск. Автор ничем вам не обязан и не несёт ответственности за возможные последствия. Если вы в чём-то не уверены или сомневаетесь, остановитесь и не продолжайте.

Источник

Автор: Johnny Тэги: , , , , , , , , ,

Блог саратовского админа

При использовании материалов сайта на других ресурсах прошу оставлять прямую ссылку на оригинал статьи.