Миграция домашнего сервера с docker-compose на k3s
Зачем мне понадобился k3s дома, как я перевозил compose-стек и что из этого вышло.
Год назад у меня дома крутился один сервер с 12 сервисами в docker-compose. Всё работало, я был счастлив. Потом появилась вторая машина, захотелось HA, и я понял, что «поднять тот же compose на двух нодах и синхронизировать руками» — это путь в никуда.
Почему k3s, а не «настоящий» Kubernetes
Для домашнего кластера на 3 ноды полный k8s — это лишний вес. k3s — это легковесный дистрибутив: один бинарь, SQLite вместо etcd по умолчанию, Traefik из коробки. Для self-hosted — оптимально.
Что было в compose до
PostgreSQL, Redis, Gitea, Nextcloud, MinIO, Jellyfin, Mosquitto, Prometheus+Grafana, Loki, пара ботов. Всё на одной машине, 32 ГБ RAM, 8 ядер.
План
- Поднять k3s на master-ноде (бывший сервер).
- Добавить две worker-ноды (второй компьютер и старый ноутбук).
- Перевести каждый сервис в Deployment + Service + PVC.
- Traefik как ingress, cert-manager для TLS.
- Longhorn для persistent storage поверх существующих дисков.
С какими проблемами столкнулся
- Local Path Provisioner vs Longhorn. Сначала взял встроенный Local Path, но это убивает мобильность — PVC привязан к ноде. Переехал на Longhorn, репликация 2, потерял примерно 8% дискового пространства на метаданные.
- Ingress и несколько доменов. Traefik хорошо, но пришлось повозиться с middleware для rate-limit и базовой аутентификации на внутренние сервисы.
- Резервное копирование stateful-нагрузок. Velero отлично работает, но дампы PostgreSQL всё равно делаю отдельно — Velero восстанавливает PVC, а не согласованное состояние базы.
- Обновления. k3s обновляется одной командой, но я раз в месяц проверяю, что после обновления всё поднялось. Иначе — привет, ночное дежурство.
Что в итоге
Кластер работает уже 10 месяцев. Один раз умерла worker-нода — pod'ы переехали на оставшиеся, ничего не отвалилось. Из compose-стиля пришлось переписать конфиги всех 12 сервисов, но теперь катить обновления — это одна команда kubectl rollout restart deploy/..., а не заход по SSH и docker restart.
Стоило ли? Да, но только если у вас уже больше 5 сервисов и/или две+ ноды. Для одного сервера compose всё ещё проще.