oakazanin/content/posts/k3s-part1-architecture/index.md

19 KiB
Raw Permalink Blame History

title date draft description tags categories series series_order
K3s HA для homelab: архитектура без боли 2025-10-14 false K3s HA кластер для homelab: архитектура с 3 master нодами и embedded etcd. 50MB бинарник вместо 1.5GB зависимостей — почему это работает.
kubernetes
k3s
homelab
proxmox
architecture
ha
devops
Kubernetes
Homelab
K3s HA кластер для homelab
1

Kubernetes слишком тяжёлый, Docker Swarm мёртв, а хочется нормальный кластер для экспериментов. Знакомо? K3s решает эту проблему - полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Но без правильного планирования вы получите нестабильную конструкцию, которая падает в самый неподходящий момент.

В этой статье разберём архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать. В конце - готовый план для установки.

Результат: понимание архитектуры + таблица ресурсов + сетевая схема. Всё, что нужно перед тем, как создавать VM.


Для кого это

Подходит:

  • Знаком с базовыми концепциями Kubernetes (pod, service, deployment)
  • Есть Proxmox с 14+ vCPU и 56GB+ RAM
  • Хочешь понять что устанавливать, прежде чем устанавливать

Не подходит:

  • Нужна одна нода для экспериментов - достаточно docker-compose или K3s single-node
  • Ищешь managed Kubernetes для бизнеса - смотри в сторону Yandex Cloud или VK Cloud
  • Хочешь сразу команды без теории - переходи к статье 2

K3s vs Kubernetes: в чём разница

Kubernetes (K8s) - оркестратор контейнеров, стандарт индустрии. Добро пожаловать в enterprise, где для запуска трёх контейнеров нужно поддерживать шесть виртуальных машин.

K3s - тот же Kubernetes, но кто-то в Rancher (теперь SUSE) задумался: "А что если выкинуть всё, что нужно только Сберу и Yandex Cloud?"

Kubernetes K3s

Что выкинули:

  • Интеграции с облачными провайдерами (вы же не в VK Cloud)
  • Legacy API (вы же не мигрируете кластер 2016 года)
  • Встроенные драйверы хранилищ на все случаи жизни (вы же не используете 47 типов СХД)
  • Альфа/бета-функции (нестабильные эксперименты)

Что осталось: полноценный Kubernetes, сертифицированный CNCF (Cloud Native Computing Foundation - организация, которая решает, что считать "настоящим" Kubernetes). Все манифесты работают. Helm работает. kubectl работает. Ответы со StackOverflow работают.

Сравнение в цифрах

Характеристика Kubernetes K3s
Размер ~1.5GB образы 50MB бинарник
RAM на control plane ~2GB на ноду ~500MB на ноду
Установка kubeadm, 10+ шагов один curl-скрипт
etcd Отдельный кластер (3+ VM) Встроенный
CNI Нужно устанавливать Flannel из коробки
Совместимость 100% 100%

"Но я потеряю гибкость!" - скажете вы. Да, вы не сможете заменить сетевой плагин Flannel без пересборки. Это критично примерно для одного проекта из тысячи, и ваш homelab в их число не входит.

Вердикт: для homelab K3s - очевидный выбор. Теряем 5% гибкости, получаем 90% простоты.


Что такое High Availability и зачем оно вам

HA (High Availability) - способность системы продолжать работу при отказе компонентов. Звучит как enterprise-термин для больших компаний? На практике это разница между "кластер упал в субботу, но я починил в понедельник" и "кластер сам пережил падение ноды, пока я спал".

Без HA (single node)

┌─────────────────┐
│   K3s Master    │  ← Единственная точка отказа
│   + Worker      │
└─────────────────┘

Нода упала → кластер мёртв → ваши сервисы недоступны

С HA (3+ master nodes)

┌──────────┐  ┌──────────┐  ┌──────────┐
│ Master 1 │  │ Master 2 │  │ Master 3 │
│  + etcd  │  │  + etcd  │  │  + etcd  │
└──────────┘  └──────────┘  └──────────┘
     ↓              ↓              ↓
┌──────────┐  ┌──────────┐
│ Worker 1 │  │ Worker 2 │
└──────────┘  └──────────┘

Одна master упала → кластер работает
Один worker упал → поды переехали на другой

Сколько master нод нужно

Вот тут начинается интересное. Интуиция подсказывает: одна нода - плохо, две - уже лучше. Логично? Логично. И неправильно.

Master нод Выдержит отказов Кворум Вердикт
1 0 1/1 Нет HA, но честно
2 0 Ловушка! Хуже, чем 1
3 1 2/3 Минимум для HA
5 2 3/5 Для критичных систем

Почему 2 master ноды хуже, чем 1

etcd (база данных кластера, где хранится вообще всё) работает по принципу голосования. Чтобы записать данные, нужно согласие большинства нод. Не "хотя бы одной" - именно большинства.

Считаем:

  • 1 нода: большинство = 1. Упала - кластер мёртв. Честная игра, вы знали на что шли.
  • 2 ноды: большинство = 2. Упала одна - кворума нет, кластер мёртв. Сюрприз!
  • 3 ноды: большинство = 2. Одна упала - две оставшиеся продолжают работать.

Это как договор, требующий подписи обоих директоров - заболел один, и компания парализована.

С двумя нодами вы не получили отказоустойчивость. Вы удвоили количество точек отказа и назвали это "высокой доступностью".

High Availability

Правило: или 1 нода (и честное понимание рисков), или 3+ (и настоящий HA). Двойка - ловушка для тех, кто не дочитал документацию.


Embedded etcd vs External etcd

etcd - распределённое key-value хранилище. Единственный источник истины для всего состояния Kubernetes: все объекты (поды, сервисы, секреты), конфигурации, сетевые политики. Без etcd кластер не работает. Точка.

Есть два варианта архитектуры:

External etcd (классический Kubernetes)

Control Plane (3 VM)              etcd кластер (3 VM)
┌────────────────┐                ┌──────────────┐
│ API Server     │                │ etcd-1       │
│ Scheduler      │ ──────────────>│ (только etcd)│
│ Controller     │                └──────────────┘
└────────────────┘                ┌──────────────┐
┌────────────────┐                │ etcd-2       │
│ API Server     │ ──────────────>│ (только etcd)│
│ Scheduler      │                └──────────────┘
│ Controller     │                ┌──────────────┐
└────────────────┘                │ etcd-3       │
┌────────────────┐                │ (только etcd)│
│ API Server     │ ──────────────>└──────────────┘
│ Scheduler      │
│ Controller     │
└────────────────┘

Итого: 6 виртуальных машин

Embedded etcd (K3s)

┌─────────────────────────┐
│ K3s Master 1            │
│  ┌───────────────────┐  │
│  │ API + Scheduler   │  │
│  │ + Controller      │  │
│  └───────────────────┘  │
│  ┌───────────────────┐  │
│  │ etcd (встроенный) │◄─┼──┐
│  └───────────────────┘  │  │
└─────────────────────────┘  │ Raft protocol
┌─────────────────────────┐  │ (синхронизация)
│ K3s Master 2            │  │
│  etcd ◄────────────────────┤
└─────────────────────────┘  │
┌─────────────────────────┐  │
│ K3s Master 3            │  │
│  etcd ◄────────────────────┘
└─────────────────────────┘

Итого: 3 виртуальные машины

etcd

Сравнение подходов

Критерий External etcd Embedded etcd
Количество VM 6 (3 master + 3 etcd) 3 (всё вместе)
Сложность настройки Высокая Один флаг --cluster-init
Сложность обновления Отдельно etcd и K8s Одна команда
Производительность Чуть лучше Достаточно для homelab
Масштаб >500 нод До 100-200 нод

Для homelab embedded etcd - очевидный выбор. Теряем 5-10% производительности etcd, экономим 3 VM и часы настройки.

"А если мне понадобится масштаб?" - официально embedded etcd поддерживает до 100 нод и 5000 подов. Для homelab это как ограничение скорости 300 км/ч на велосипеде.


Зачем отдельные worker ноды

Worker ноды - машины для запуска ваших приложений (подов). На них не запускаются компоненты control plane.

"А можно запускать приложения прямо на master нодах?"

Технически - да. K3s не ставит ограничений на master ноды (в отличие от обычного Kubernetes). Но это плохая идея:

  • Control plane должен быть стабильным. Ваше приложение съело всю память → API server упал → кластер недоступен.
  • etcd чувствителен к диску. База данных на той же ноде создаёт I/O нагрузку → etcd тормозит → весь кластер тормозит.
  • Изоляция отказов. Проблема с приложением не должна убивать control plane.

2 worker ноды - минимум для HA приложений:

  • Можно запускать 2 реплики (на разных нодах)
  • При падении одного worker'а второй держит нагрузку
  • Легко добавить третью, четвёртую ноду потом

Архитектура нашего кластера

Вот что мы будем строить:

Архитектура нашего кластера

Ключевые моменты:

  1. Все master ноды равны - нет "главной", kubectl подключается к любой.
  2. etcd синхронизируется через Raft - алгоритм консенсуса, гарантирует согласованность данных.
  3. Workers знают только про API - они не подключаются к etcd напрямую.
  4. Flannel создаёт overlay-сеть - все поды получают IP из 10.42.0.0/16, видят друг друга.

Планирование ресурсов

Таблица VM

Hostname VM ID IP vCPU RAM Disk Роль
k3s-master-1 201 192.168.11.201 2 8GB 32GB Control Plane + etcd
k3s-master-2 202 192.168.11.202 2 8GB 32GB Control Plane + etcd
k3s-master-3 203 192.168.11.203 2 8GB 32GB Control Plane + etcd
k3s-worker-1 210 192.168.11.210 4 16GB 50GB Workloads
k3s-worker-2 211 192.168.11.211 4 16GB 50GB Workloads
Итого - - 14 56GB 196GB -

Почему именно такие ресурсы

Master ноды (2 vCPU / 8GB RAM / 32GB Disk):

Реальное потребление в idle:

  • API server: ~200-300MB RAM
  • etcd: ~100-200MB RAM (растёт со временем)
  • Scheduler + Controller: ~150MB RAM
  • Системные поды: ~100-200MB RAM
  • Итого: ~600-900MB используется

"Зачем тогда 8GB?" - запас для burst-нагрузки. Когда вы деплоите 50 подов одновременно, API server временно съедает больше. etcd при большом кластере может вырасти до 1-2GB. Golang GC работает лучше с запасом памяти.

Worker ноды (4 vCPU / 16GB RAM / 50GB Disk):

Здесь будут ваши приложения. При 16GB можно запустить:

  • 5-10 средних приложений (256MB-2GB каждое)
  • Или 2-3 базы данных (PostgreSQL любит память)
  • Или комбинацию

50GB диска - под образы контейнеров (10-20GB), логи (5-10GB), временные данные.

Можно ли меньше?

Минимальная конфигурация (для экспериментов):

  • Master: 1 vCPU / 4GB RAM / 20GB Disk
  • Worker: 2 vCPU / 8GB RAM / 30GB Disk
  • Итого: 9 vCPU / 36GB RAM

Риски:

  • Медленная работа API server
  • OOM killer при нагрузке
  • Нет запаса для burst

Для production-like homelab рекомендую таблицу выше. Комфортный запас стоит дешевле, чем отладка странных падений.


Сетевая схема

IP-адреса (адаптируй под свою сеть)

192.168.11.0/24       - Локальная сеть
  192.168.11.1        - Gateway (роутер)
  192.168.11.201-203  - Master ноды
  192.168.11.210-211  - Worker ноды
  192.168.11.220-230  - Резерв для MetalLB (статья 2)

Kubernetes внутренние сети (создаются автоматически)

10.42.0.0/16  - Pod network (Flannel VXLAN overlay)
10.43.0.0/16  - Service network (ClusterIP)
10.43.0.10    - CoreDNS

Сети

Порты между нодами

Порт Протокол Направление Назначение
6443 TCP Master ← Worker Kubernetes API
2379-2380 TCP Master ↔ Master etcd (client + peer)
10250 TCP Master ↔ All Kubelet API
8472 UDP All ↔ All Flannel VXLAN

Требования к железу и софту

Железо (Proxmox хост)

Минимум:

  • CPU: 14 vCPU свободных
  • RAM: 56GB свободных
  • Disk: 200GB на SSD
  • Network: 1 Gbit

Рекомендуется:

  • CPU: 18+ vCPU (запас для приложений)
  • RAM: 64GB+ (базы данных прожорливые)
  • Disk: NVMe для etcd
  • Network: 2.5 Gbit (для NFS, если будете использовать)

Софт

Компонент Версия
Proxmox VE 7.x или 8.x
K3s v1.31+ (stable)
ОС на нодах Debian 12 или Ubuntu 22.04+
Kernel 5.15+ (для cgroup v2)

Итог

Что мы спроектировали:

  • 5 VM: 3 master + 2 worker
  • K3s с embedded etcd (HA без лишних VM)
  • Отказоустойчивость: выдерживает падение 1 master и любого worker
  • Ресурсы: 14 vCPU / 56GB RAM / 196GB Disk

Что НЕ входит в эту серию (отдельные статьи):

  • LoadBalancer (MetalLB)
  • Ingress (Traefik)
  • SSL (cert-manager)
  • Мониторинг (Prometheus/Grafana)

Что дальше

👉 "Подготовить инфраструктуру для K3s в Proxmox"

Там мы:

  • Создадим template VM с Debian 12
  • Склонируем 5 VM с правильными ресурсами
  • Настроим статические IP
  • Подготовим ОС (swap, cgroup v2, firewall)