Kubernetes на домашнем сервере: есть ли смысл
Признаюсь честно: я поддался хайпу. Год назад сидел я, смотрел на свой Proxmox с десятком LXC-контейнеров и думал — всё несерьёзно. Настоящие админы используют Kubernetes. У меня же — просто Docker на одной VM, пара компоузов, и всё это какое-то… игрушечное.
Ну и понеслось.
Я развернул K3s на трёх VPS в DigitalOcean. Потом ещё один кластер — на Raspberry Pi. Потом ещё — на старом ноутбуке. Три кластера, Карл! Потому что «надо уметь», «это стандарт индустрии», «без K8s ты не сисадмин».
Спойлер: я их все снёс через месяц. А дома оставил… обычный Docker.
Но давай по порядку.
Я начал с того, что установил K3s на два узла — мастер и воркер. Мастер на VM с 2GB RAM, воркер на отдельной VM с 4GB. По документации — легковесный Kubernetes, оптимизированный для edge, IoT, всего такого. Установка — одна команда:
curl -sfL https://get.k3s.io | sh —
Вжух — и у тебя кластер. Прям магия. Я чувствовал себя богом автоматизации. Серьёзно, первые полчаса я просто смотрел на `kubectl get nodes` и улыбался как идиот.
А потом началось.
Во-первых, память. K3s жрёт около 500MB на мастере и 300MB на воркере. Это в простое. На голой VM без полезной нагрузки. Для сравнения — Docker Compose на той же VM жрёт… практически ничего, потому что контейнеры запускаются только когда нужны. Тут же у тебя постоянно висит kubelet, containerd, kube-proxy, coredns, traefik — и это только системные поды.
Я запустил свой первый полезный под — Nextcloud. Хотел посмотреть, как оно в оркестрации. Развернул через Helm-чарт. Получил 8 подов вместо одного контейнера. База отдельно, редис отдельно, cronjob отдельно, веб-отдельно… Каждый под жрёт по 100-200MB. Nextcloud, который в Docker Compose укладывался в 1GB памяти, в K8s занял 3GB.
Тут я впервые задумался: а оно мне надо?
Дальше — обслуживание. Обновлять кластер — это ритуал с бубном. K3s обновляется легко, но если у тебя helm-релизы, PV-шные тома, ingress-контроллеры… Наступает момент, когда ты перестаёшь что-то обновлять, потому что «работает же». А потом «работает же» ломается, и ты вспоминаешь, что полгода назад ставил cert-manager, но уже забыл как.
У меня сломался Traefik после обновления K3s. Не стартовал — и всё. Я потратил вечер на дебаг (проблема была в CRD-версиях), починил, но осадочек остался.
А знаешь, что меня добило? Хранение данных. В Kubernetes StatefulSet-ы с PersistentVolumeClaim — это боль. У тебя всё хорошо, пока ты не решишь перенести под на другой узел. Или пока у тебя не сломается диск. Я использовал Longhorn для распределённого хранилища — ещё один слой сложности. И ещё 500MB памяти сверху.
Longhorn реплицирует данные между узлами. Круто, да? Только вот на домашнем сервере у меня нет 10Gbps-сети. Репликация жрёт CPU и диски, и в итоге твоя MariaDB тормозит так, что phpMyAdmin грузится 10 секунд.
Так для чего вообще K8s? Горизонтальное масштабирование. Если у тебя 10 миллионов пользователей — да, без него никуда. Если у тебя сайт, который читают 100 человек в день — не надо.
Да, я знаю, что кто-то скажет про reproducible deployments, про GitOps, про то, что всё описывается в YAML и воспроизводится на любом кластере. Аргумент рабочий. Но знаешь что ещё отлично воспроизводится? Docker Compose. Один файл. Пять минут. И ты уже развернул всё приложение.
Я не говорю, что Kubernetes — зло. Это потрясающая технология. Для дата-центров, для продакшна с сотнями микросервисов, для команд из 20+ человек. Но для домашнего сервера, где ты один, у тебя 4-8GB RAM и один IP — это оверкиллум.
Сейчас я держу K3s только на одном VPS, где крутятся тестовые проекты, которые удобно деплоить через ArgoCD. Просто чтобы навык не терять. А дома — Proxmox LXC с Docker, где каждый сервис живёт в своём Compose-файле. Всё просто, всё предсказуемо, и если что-то сломалось — я чининю это за 5 минут, а не за вечер.
Хочешь попробовать K8s ради обучения — попробуй. Разверни K3s на VPS с 4GB, поиграйся с Helm, с Ingress, с ConfigMap. Это полезный опыт. Но не ставь его дома, если у тебя нет отдельного сервера с 16GB RAM и запасом терпения. Серьёзно, не надо.
Я свой кластер снёс и не жалею.