- README.md: перепиcан как компактный обзор (98 строк) с навигацией по docs/ - docs/: 13 файлов — getting-started, architecture, configuration, addons, storage, security, cicd, observability, networking, operations, make-reference, molecule-testing, troubleshooting - addons/*/README.md: 31 новый файл — описание, параметры, примеры кода для каждого из 34 аддонов (vault и external-secrets уже существовали)
5.3 KiB
Архитектура
Топология кластера
Кластер работает в HA-режиме с embedded etcd: все три ноды являются полноценными мастерами. При отказе любой одной ноды кластер продолжает работать (кворум 2 из 3).
┌──────────────────────────────────────────────────────────────┐
│ Локальная сеть 192.168.1.0/24 │
│ VIP: 192.168.1.100 (kube-vip) │
│ ├── :6443 K3S API Server (HA) │
│ └── :80/:443 ingress-nginx → приложения │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
│ │ master01 │ │ worker01 │ │ rpi01 │ │
│ │ 192.168.1.10 │ │ 192.168.1.11 │ │ .1.12 │ │
│ │ x86_64 │ │ x86_64 │ │ aarch64 │ │
│ │ K3S server │ │ K3S server │ │ K3S server │ │
│ │ etcd #1 │ │ etcd #2 │ │ etcd #3 │ │
│ │ cluster-init │ │ kube-vip │ │ NoSchedule │ │
│ │ NFS server │ │ workloads ✓ │ │ workloads ✗│ │
│ │ workloads ✓ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
│ StorageClass: nfs-master01 (default) │
└──────────────────────────────────────────────────────────────┘
Роли нод
| Нода | etcd | Workloads | Описание |
|---|---|---|---|
| master01 | #1 (leader) | ✓ | cluster-init, NFS server |
| worker01 | #2 | ✓ | Рабочие нагрузки |
| rpi01 | #3 | ✗ | Только quorum, taint NoSchedule |
CNI плагин
# group_vars/all/main.yml
k3s_cni: "flannel" # flannel | calico | cilium
| CNI | Особенности |
|---|---|
flannel |
Встроен в K3S, VXLAN overlay, минимальная настройка |
calico |
Network Policy, IPAM, BGP, VXLAN/IPIP |
cilium |
eBPF dataplane, Hubble observability, L7 policy |
При calico/cilium Flannel отключается автоматически.
make install-cni K3S_CNI=calico
make install-cni K3S_CNI=cilium
Порядок инициализации K3S
master01 (cluster-init: true)
↓ API готов на :6443
worker01 (join → master01)
↓ etcd = 2/3
rpi01 (join → master01, NoSchedule taint)
↓ etcd = 3/3, кворум достигнут
kube-vip
VIP через ARP (L2). При отказе мастера VIP мигрирует за несколько секунд.
Требования к VIP:
- В той же подсети что серверы
- Не занят другим устройством
- Не в пуле DHCP
Автоопределение интерфейса через ansible_default_ipv4.interface — работает для Ubuntu (enp3s0), RPi (end0), VM (eth0). Принудительно: kube_vip_interface: "eth0".
kube-vip также обрабатывает LoadBalancer сервисы — все аддоны получают IP из подсети.
NFS + CSI
NFS сервер на master01, StorageClass именуется nfs-<hostname> (например nfs-master01). Каждый PVC → отдельная папка в /storage/nfs/:
/storage/nfs/
├── default/my-pvc/pvc-xxx-yyy/данные/
NFS на отдельном хосте:
[nfs_server]
nfshost ansible_host=192.168.1.20
csi_nfs_server: "192.168.1.20"
ingress-nginx
LoadBalancer сервис → IP от kube-vip. Отключает Traefik K3S. Поддерживает кастомную страницу ошибок.
Raspberry Pi
Роль автоматически определяет ARM-архитектуру и:
- Включает
memory cgroupв/boot/firmware/cmdline.txt+ перезагрузка - Пониженные kubelet-резервы (
cpu=50m, memory=128Mi) - Taint
node-type=raspberry-pi:NoSchedule
Рекомендуемая ОС: Raspberry Pi OS Lite 64-bit (Bookworm) для RPi 4/5.
Для деплоя на RPi добавь toleration:
tolerations:
- key: "node-type"
operator: "Equal"
value: "raspberry-pi"
effect: "NoSchedule"
Docker образ
FROM python:3.12-slim-bookworm
├── ansible-core 2.16, ansible 9.x
├── Helm 3.14.4, kubectl v1.29.3
├── molecule >= 6.0 + molecule-plugins[docker]
├── yamllint, ansible-lint
└── Collections: community.general, ansible.posix, kubernetes.core