LINUX.ORG.RU

Me DevOps: пусть разработка будет комфортной

 , , ,


3

2

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

Требования к 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-разделе

Ссылки

Лицензии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

★★★★★

Проверено: hobbit ()

Как то с одним разговаривали, так он считает DevOps это не возможность оркестрации контейнеров а юзание систем непрерывной интеграции (ну типа Jenkins и т.д.)

mx__ ★★★★★ ()
Ответ на: комментарий от mx__

Девопс это очень широкое определение, в том числе и об организации архитектуры системы и об организации процесса разработки и много многое.

https://roadmap.sh/devops

Логично, разделять самих devops-специалистов на инженеров по направлениям.

Название в заголовке, оно ироничное, типа «я мамкин инженер».

vvn_black ★★★★★ ()
Последнее исправление: vvn_black (всего исправлений: 1 )
Ответ на: комментарий от vvn_black

Согласен. И из статьи там все проходит в пределах локальной машины, так вроде для этого как и делали мини-кубе.

mx__ ★★★★★ ()
Ответ на: комментарий от mx__

так вроде для этого как и делали мини-кубе

А ещё microk8s, k3s, наверное и ещё что-то есть, работающее в пределах одного узла.

vvn_black ★★★★★ ()
Ответ на: комментарий от vvn_black

Ну microk8s, k3s не только в пределах узла пашуть.

mx__ ★★★★★ ()
Ответ на: комментарий от turbognida

Жёстко

Любой материал, размещённый в сети без указания лицензии, он ещё жёстче по ограничениям.

vvn_black ★★★★★ ()
Ответ на: комментарий от vvn_black

Сейчас инет глянул, там в пределах узла только мини-кубе и k0s.

mx__ ★★★★★ ()
Ответ на: комментарий от LINUX-ORG-RU

юзайте chroot

это тролинг такой? если да то я попался. сколько раз уже можно повторять… chroot не маштабируется никак! для того чтобы локально поковыряться чисто для себя - пойдет. а чтобы делать что-то серьезное, да и еще в компании других людей chroot работать не будет. это слишком low-level решение.

писать bash скрипты и чинить их проблемы никто не будет. ради чего? не проще будет уже взять docker или minicube? стабильное, готовое, с документацией, с поддержкой, с комьюнити! упаси господи. да или даже взять сабж. понятное дело что с поддержкой будет туго, но это куда лучше чем писать с нуля какие-то рандомные скрипты на баше.

но так-то да, я смузихлеб и ничего не понимаю.

проще же на коленке дендрофекальным методом сварганить кучу chroot скриптов под разные нужды, а потом вместо того чтобы работать - кушать кактус. вот вам и местная культура разработки на лоре. взять low-level кал чтобы с абстракциями не парится, а потом писать эти же самые абстракции. рука-лицо.

сори за флейм, но уже просто сил нет объяснять зачем нужны эти технологии и что их придумали не просто так. #небомбит

Unixson ()
Последнее исправление: Unixson (всего исправлений: 2 )
Ответ на: комментарий от ugoday

а есть еще it just works. Благодяря ему у нас есть такие штуки как apple и компьютеры которые просто берут работают) Я за то чтобы колупаться и настраивать все по минимуму. Лучше когда программа вообще не требует настройки от пользователя.

Unixson ()
Ответ на: комментарий от thesis

деда, выйди из кибер-сна, какой LAMP? он давно умер деда, отпусти его наконец. твой друг php тоже умер, деда… сейчас 2077 2022 год, мы уже давно всей семьей деплоим лямбда функции в AWS EKS.

Unixson ()
Ответ на: комментарий от Unixson

Я за то чтобы колупаться и настраивать все по минимуму.

Прекрасный подход для простых пользователей.

ugoday ★★★★★ ()
Ответ на: комментарий от thesis

задачи были другие, сайты были проще, а сейчас делают не сайты а приложения. нагрузка больше, пользователей стало больше

Unixson ()
Ответ на: комментарий от Unixson

Задачи остались прежними, сайты были проще, а сейчас делают не сайты, а говно.

thesis ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)