Files
K3S/docs/architecture.md
Sergey Antropoff eccc1c2a01 docs: полная документация проекта — docs/ и README.md для каждого аддона
- 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 уже существовали)
2026-04-26 00:22:06 +03:00

130 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Архитектура
## Топология кластера
Кластер работает в **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 плагин
```yaml
# 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 отключается автоматически.
```bash
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 на отдельном хосте:
```ini
[nfs_server]
nfshost ansible_host=192.168.1.20
```
```yaml
csi_nfs_server: "192.168.1.20"
```
## ingress-nginx
LoadBalancer сервис → IP от kube-vip. Отключает Traefik K3S. Поддерживает кастомную страницу ошибок.
## Raspberry Pi
Роль автоматически определяет ARM-архитектуру и:
1. Включает `memory cgroup` в `/boot/firmware/cmdline.txt` + перезагрузка
2. Пониженные kubelet-резервы (`cpu=50m, memory=128Mi`)
3. Taint `node-type=raspberry-pi:NoSchedule`
Рекомендуемая ОС: **Raspberry Pi OS Lite 64-bit (Bookworm)** для RPi 4/5.
Для деплоя на RPi добавь toleration:
```yaml
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
```