Перейти к содержанию

0001. k3s вместо полного кластера Kubernetes

Дата: август 2026. Состояние: принято.

Контекст

В распоряжении один виртуальный сервер: 4 ядра, 3,8 ГБ доступной оперативной памяти. На нём должны работать кластер, приложение с базой, стек наблюдаемости и контроллер релизов.

Управляющий слой полноценного кластера — сервер API, планировщик, менеджер контроллеров, отдельный etcd — забирает около 1,5 ГБ памяти. От трёх восьмых всей памяти узла остаётся то, во что нужно уложить и наблюдаемость, и приложение.

Решение

Использовать k3s: один процесс вместо четырёх, встроенное хранилище состояния вместо отдельного etcd, встроенный Traefik и локальный поставщик томов. Управляющий слой занимает около 400 МБ.

Kubelet настроен отдельным файлом конфигурации: разрешена работа при включённой подкачке, заданы резервы под системные и служебные процессы, чтобы вытеснение начиналось предсказуемо, а не в случайном порядке.

Последствия

Что получили. Настоящий Kubernetes: те же объекты, тот же интерфейс, те же контроллеры. Манифесты, написанные для k3s, применяются в промышленном кластере без изменений — и наоборот. Освободившийся гигабайт памяти ушёл на Prometheus, Loki и Tempo, то есть на то, ради чего стенд и сделан.

Чем заплатили. Управляющий слой не резервирован: потеря узла — потеря кластера. Для стенда это приемлемо и записано в инструкции дежурного как порядок полного восстановления: Ansible, Terraform, выкладка — примерно двадцать минут.

Встроенное хранилище состояния — SQLite вместо etcd. Разница проявляется на сотнях узлов; на одном её нет.

Что рассматривалось

Полный кластер через kubeadm — честнее по составу, но на этом узле в него не поместилось бы ничего, кроме самого кластера. Стенд, где нечего показать, кроме кластера, не имеет смысла.

Docker Compose — уложился бы в память с запасом, но тогда исчезает всё, ради чего стенд существует: контроллеры, автомасштабирование, канареечные релизы, бюджеты допускающего сбои развёртывания.

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