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-кластер у облачного провайдера — правильный выбор для рабочей системы и неправильный для стенда: за него нужно платить ежемесячно, а показать умение настроить узел с нуля он не даёт.