Обновлена документация под новые аддоны (gitlab, redis, mongodb, kafka, kafka-ui, rabbitmq) и новую модель явного выбора зависимостей. Добавлены и унифицированы описания переключателей *_database_mode и *_redis_mode, обновлена таблица зависимостей аддонов, примеры конфигурации и список vault-секретов.
424 lines
22 KiB
Markdown
424 lines
22 KiB
Markdown
# Аддоны
|
||
|
||
Все аддоны управляются через флаги в `group_vars/all/addons.yml`. Порядок установки в `playbooks/addons.yml` фиксирован (NFS → CSI → Ingress → cert-manager → остальные).
|
||
|
||
**Свой аддон (структура каталога, плейбук, `group_vars`, `Makefile`, Molecule):** подробно в отдельном руководстве — [Свои аддоны для k3s-ansible](custom-addons.md).
|
||
|
||
## Установка аддонов
|
||
|
||
```bash
|
||
# Установить все включённые аддоны:
|
||
make install-addons
|
||
|
||
# Конкретный аддон (флаг из addons.yml игнорируется):
|
||
make addon-<name>
|
||
|
||
# Примеры:
|
||
make addon-prometheus-stack
|
||
make addon-argocd
|
||
make addon-jenkins
|
||
make addon-netbird
|
||
```
|
||
|
||
### Проверка аддонов перед деплоем
|
||
|
||
```bash
|
||
# Проверка конкретного аддона:
|
||
make molecule-addon-argocd
|
||
|
||
# Полный прогон всех addon-сценариев:
|
||
make molecule-addon-all
|
||
|
||
# Пройти дальше даже если часть аддонов падает:
|
||
make -k molecule-addon-all
|
||
```
|
||
|
||
Практический цикл исправления:
|
||
1. `make molecule-addon-all` — получить первый упавший аддон.
|
||
2. Исправить сценарий/шаблон.
|
||
3. Прогнать `make molecule-addon-<name>`.
|
||
4. Снова `make molecule-addon-all`.
|
||
|
||
## Каталог аддонов
|
||
|
||
| Аддон | Флаг | Описание | README |
|
||
|---|---|---|---|
|
||
| **Сеть** | | | |
|
||
| ingress-nginx | `addon_ingress_nginx` | HTTP/S Ingress controller | [→](../addons/ingress-nginx/README.md) |
|
||
| cert-manager | `addon_cert_manager` | TLS сертификаты (Let's Encrypt / self-signed) | [→](../addons/cert-manager/README.md) |
|
||
| istio | `addon_istio` | Service mesh + Kiali UI | [→](../addons/istio/README.md) |
|
||
| netbird | `addon_netbird` | Self-hosted WireGuard VPN | [→](../addons/netbird/README.md) |
|
||
| crowdsec | `addon_crowdsec` | IDS/IPS, nginx bouncer | [→](../addons/crowdsec/README.md) |
|
||
| **Хранилище** | | | |
|
||
| nfs-server | `addon_nfs_server` | NFS сервер | [→](../addons/nfs-server/README.md) |
|
||
| csi-nfs | `addon_csi_nfs` | CSI NFS Driver + StorageClass | [→](../addons/csi-nfs/README.md) |
|
||
| longhorn | `addon_longhorn` | Distributed block storage | [→](../addons/longhorn/README.md) |
|
||
| minio | `addon_minio` | S3-совместимое объектное хранилище | [→](../addons/minio/README.md) |
|
||
| csi-s3 | `addon_csi_s3` | S3/MinIO как PVC | [→](../addons/csi-s3/README.md) |
|
||
| csi-ceph | `addon_csi_ceph` | Kubernetes CSI Ceph (Rook-Ceph, PVC на Ceph) | [→](../addons/csi-ceph/README.md) |
|
||
| ceph-rock | `addon_ceph_rock` | Rook-Ceph distributed storage | [→](../addons/ceph-rock/README.md) |
|
||
| csi-glusterfs | `addon_csi_glusterfs` | GlusterFS CSI driver | [→](../addons/csi-glusterfs/README.md) |
|
||
| **Базы данных** | | | |
|
||
| postgresql | `addon_postgresql` | PostgreSQL (shared для аддонов) | [→](../addons/postgresql/README.md) |
|
||
| mysql | `addon_mysql` | MySQL (Bitnami) | [→](../addons/mysql/README.md) |
|
||
| redis | `addon_redis` | Redis (standalone/replication) | [→](../addons/redis/README.md) |
|
||
| mongodb | `addon_mongodb` | MongoDB (standalone/replicaset) | [→](../addons/mongodb/README.md) |
|
||
| kafka | `addon_kafka` | Apache Kafka (KRaft, standalone/cluster) | [→](../addons/kafka/README.md) |
|
||
| kafka-ui | `addon_kafka_ui` | Kafka UI с авторизацией (логин/пароль) | [→](../addons/kafka-ui/README.md) |
|
||
| rabbitmq | `addon_rabbitmq` | RabbitMQ (standalone/cluster) | [→](../addons/rabbitmq/README.md) |
|
||
| databasus | `addon_databasus` | Web UI для бэкапов БД | [→](../addons/databasus/README.md) |
|
||
| **Observability** | | | |
|
||
| metrics-server | `addon_metrics_server` | kubectl top + HPA | [→](../addons/metrics-server/README.md) |
|
||
| prometheus-stack | `addon_prometheus_stack` | Prometheus + Grafana + Alertmanager | [→](../addons/prometheus-stack/README.md) |
|
||
| loki | `addon_loki` | Агрегация логов | [→](../addons/loki/README.md) |
|
||
| promtail | `addon_promtail` | Агент сбора логов → Loki | [→](../addons/promtail/README.md) |
|
||
| tempo | `addon_tempo` | Distributed tracing | [→](../addons/tempo/README.md) |
|
||
| pushgateway | `addon_pushgateway` | Метрики batch-задач | [→](../addons/pushgateway/README.md) |
|
||
| **CI/CD** | | | |
|
||
| jenkins | `addon_jenkins` | Jenkins CI/CD + k8s agents | [→](../addons/jenkins/README.md) |
|
||
| gitea | `addon_gitea` | Git hosting + Gitea Actions | [→](../addons/gitea/README.md) |
|
||
| gitlab | `addon_gitlab` | GitLab + GitLab Runner в pod-режиме | [→](../addons/gitlab/README.md) |
|
||
| argocd | `addon_argocd` | GitOps (ArgoCD) | [→](../addons/argocd/README.md) |
|
||
| **Безопасность** | | | |
|
||
| vault | `addon_vault` | HashiCorp Vault | [→](../addons/vault/README.md) |
|
||
| external-secrets | `addon_external_secrets` | External Secrets Operator → Vault | [→](../addons/external-secrets/README.md) |
|
||
| vaultwarden | `addon_vaultwarden` | Self-hosted Bitwarden | [→](../addons/vaultwarden/README.md) |
|
||
| **Инфраструктура** | | | |
|
||
| harbor | `addon_harbor` | Container registry + proxy cache | [→](../addons/harbor/README.md) |
|
||
| kubernetes-dashboard | `addon_kubernetes_dashboard` | K8S Web UI | [→](../addons/kubernetes-dashboard/README.md) |
|
||
| velero | `addon_velero` | Бэкап кластера + PVC в S3 | [→](../addons/velero/README.md) |
|
||
| smtp-relay | `addon_smtp_relay` | Postfix relay для email из подов | [→](../addons/smtp-relay/README.md) |
|
||
| **Файловые хранилища** | | | |
|
||
| nextcloud | `addon_nextcloud` | Nextcloud облачное хранилище | [→](../addons/nextcloud/README.md) |
|
||
| owncloud | `addon_owncloud` | ownCloud OCIS | [→](../addons/owncloud/README.md) |
|
||
| **Медиасервер** | | | |
|
||
| mediaserver | `addon_mediaserver` | Plex, Sonarr, Radarr, Lidarr, Bazarr, Prowlarr + Hysteria2 sidecar, Overseerr, Transmission, Samba | [→](../addons/mediaserver/README.md) |
|
||
| **Сеть / VPN** | | | |
|
||
| hysteria2-server | `addon_hysteria2_server` | Hysteria2 сервер для прокси-клиентов и split-туннеля | [→](../addons/hysteria2-server/README.md) |
|
||
| splitgw | `addon_splitgw` | Прозрачный split-tunnel gateway: sing-box + Hysteria2 TPROXY, YouTube→прокси, RU→прямой | [→](../addons/splitgw/README.md) |
|
||
| ingress-proxypass | `addon_ingress_proxypass` | Проксировать внешние сервисы (IP:PORT) через ingress-nginx по домену — Service + Endpoints + Ingress | [→](../addons/ingress-proxypass/README.md) |
|
||
| ingress-add-domains | `addon_ingress_add_domains` | Добавить домены к существующим K8s сервисам — только Ingress, без Service/Endpoints | [→](../addons/ingress-add-domains/README.md) |
|
||
| yandex-dns-controller | `addon_yandex_dns_controller` | CronJob-контроллер Yandex 360 DNS — ConfigMap → DNS, safe mode (managed:true only) | [→](../addons/yandex-dns-controller/README.md) |
|
||
| technitium-dns | `addon_technitium_dns` | HA DNS: Primary + Secondary с kube-vip LB, авто-sync зон, ExternalDNS (RFC 2136) | [→](../addons/technitium-dns/README.md) |
|
||
| **SSO / Auth** | | | |
|
||
| authelia | `addon_authelia` | SSO Forward-auth + OIDC provider: Gitea, Grafana, ArgoCD, MinIO, Vault, Nextcloud | [→](../addons/authelia/README.md) |
|
||
|
||
## Конфигурация addons.yml
|
||
|
||
```yaml
|
||
# group_vars/all/addons.yml — включи нужные аддоны:
|
||
|
||
# ── Core ──────────────────────────────────────────────────────────────────────
|
||
addon_ingress_nginx: true # обязателен для большинства аддонов
|
||
addon_cert_manager: true # TLS сертификаты
|
||
addon_metrics_server: true # kubectl top + HPA
|
||
|
||
# ── Observability ─────────────────────────────────────────────────────────────
|
||
addon_prometheus_stack: true # Prometheus + Grafana + Alertmanager
|
||
addon_loki: true # логи
|
||
addon_promtail: true # агент сбора логов
|
||
addon_tempo: false # distributed tracing
|
||
addon_pushgateway: false # batch метрики
|
||
|
||
# ── Хранилище ─────────────────────────────────────────────────────────────────
|
||
addon_longhorn: false # distributed block storage
|
||
addon_minio: false # S3 объектное хранилище
|
||
addon_csi_s3: false # S3 как PVC
|
||
|
||
# ── Базы данных ───────────────────────────────────────────────────────────────
|
||
addon_postgresql: false # shared PostgreSQL
|
||
addon_mysql: false
|
||
addon_redis: false
|
||
addon_mongodb: false
|
||
addon_kafka: false
|
||
addon_kafka_ui: false
|
||
addon_rabbitmq: false
|
||
|
||
# ── CI/CD ─────────────────────────────────────────────────────────────────────
|
||
addon_gitea: false
|
||
addon_gitlab: false
|
||
addon_jenkins: false
|
||
addon_argocd: false
|
||
|
||
# ── Безопасность ──────────────────────────────────────────────────────────────
|
||
addon_vault: false
|
||
addon_external_secrets: false
|
||
addon_vaultwarden: false
|
||
addon_crowdsec: false
|
||
|
||
# ── Инфраструктура ────────────────────────────────────────────────────────────
|
||
addon_harbor: false
|
||
addon_velero: false
|
||
addon_netbird: false
|
||
addon_smtp_relay: false
|
||
|
||
# ── Медиасервер ───────────────────────────────────────────────────────────────
|
||
addon_mediaserver: false # Plex + *arr + Transmission + Prowlarr/Hysteria2 + Samba
|
||
|
||
# ── Split Gateway ─────────────────────────────────────────────────────────────
|
||
addon_splitgw: false # sing-box + Hysteria2 TPROXY (host или k8s DaemonSet)
|
||
|
||
# ── External Services Ingress Proxy ───────────────────────────────────────────
|
||
addon_ingress_proxypass: false # проксировать внешние сервисы через ingress-nginx
|
||
addon_ingress_add_domains: false # добавить домены к существующим K8s сервисам (только Ingress)
|
||
|
||
# ── DNS ───────────────────────────────────────────────────────────────────────
|
||
addon_yandex_dns_controller: false # Yandex 360 DNS controller (managed records)
|
||
addon_technitium_dns: false # HA DNS сервер (Primary+Secondary, kube-vip)
|
||
|
||
# ── SSO ───────────────────────────────────────────────────────────────────────
|
||
addon_authelia: false # SSO Forward-auth + OIDC (Gitea/Grafana/ArgoCD/...)
|
||
```
|
||
|
||
## Зависимости между аддонами
|
||
|
||
| Аддон | Зависит от | Автоинтеграция |
|
||
|---|---|---|
|
||
| `promtail` | `loki` | URL Loki берётся автоматически |
|
||
| `loki` | `minio` (опционально) | S3 backend при addon_minio: true |
|
||
| `velero` | `minio` | S3 backend для бэкапов |
|
||
| `csi-s3` | `minio` (опционально) | Endpoint берётся автоматически |
|
||
| `gitea` | `postgresql` (опционально) | `gitea_database_mode`: `auto`/`internal`/`external_postgresql` |
|
||
| `gitlab` | `postgresql` (опционально) | `gitlab_database_mode`: `auto`/`internal`/`external_postgresql` |
|
||
| `harbor` | `postgresql` (опционально) | `harbor_database_mode`: `auto`/`internal`/`external_postgresql` |
|
||
| `nextcloud` | `postgresql` | `nextcloud_database_mode`: `external_postgresql` по умолчанию |
|
||
| `kafka-ui` | `kafka` (рекомендуется) | `kafka_ui_bootstrap_servers` указывает на кластер Kafka |
|
||
| `databasus` | `postgresql`, `mysql`, `minio` | Все подключения автоматические |
|
||
| `jenkins` | `vault` (опционально) | JCasC Vault URL при addon_vault: true |
|
||
| `external-secrets` | `vault` | ClusterSecretStore к Vault |
|
||
| `istio` | `prometheus-stack` (опционально) | Kiali ↔ Prometheus/Grafana авто |
|
||
| `crowdsec` | `ingress-nginx` | Bouncer интеграция при addon_crowdsec |
|
||
| `mediaserver` | `csi-nfs` (рекомендуется) | Shared PVC требует RWX StorageClass |
|
||
| `splitgw` | Hysteria2 сервер (vault_hysteria2_url) | URL из Shadowrocket / NekoBox |
|
||
| `ingress-proxypass` | `ingress-nginx` | Требует работающий Ingress controller |
|
||
| `ingress-add-domains` | `ingress-nginx` | Требует работающий Ingress controller |
|
||
| `technitium-dns` | kube-vip | LoadBalancer IP через kube-vip аннотацию |
|
||
| `authelia` | `ingress-nginx`, `redis` (опционально) | `authelia_redis_mode`: `auto`/`internal`/`external_redis`/`disabled` |
|
||
| `argocd` | `redis` (опционально) | `argocd_redis_mode`: `auto`/`internal`/`external_redis` |
|
||
|
||
## Явные переключатели встроенных/внешних сервисов
|
||
|
||
Новые аддоны и интеграции поддерживают явный выбор: использовать нативный компонент чарта или внешний addon-сервис.
|
||
|
||
```yaml
|
||
# PostgreSQL для приложений
|
||
gitea_database_mode: "auto" # auto | internal | external_postgresql
|
||
gitlab_database_mode: "auto" # auto | internal | external_postgresql
|
||
harbor_database_mode: "auto" # auto | internal | external_postgresql
|
||
nextcloud_database_mode: "external_postgresql" # auto | sqlite | external_postgresql
|
||
|
||
# Redis для auth/CI
|
||
authelia_redis_mode: "auto" # auto | internal | external_redis | disabled
|
||
argocd_redis_mode: "auto" # auto | internal | external_redis
|
||
```
|
||
|
||
## MediaServer
|
||
|
||
Полный self-hosted медиасервер: Plex, *arr стек, Transmission, Prowlarr с Hysteria2 SOCKS5 прокси и Samba для LAN-доступа.
|
||
|
||
```bash
|
||
make addon-mediaserver
|
||
|
||
# Без Hysteria2 прокси:
|
||
make addon-mediaserver ARGS="-e mediaserver_hysteria2_enabled=false"
|
||
```
|
||
|
||
Минимальная конфигурация в vault.yml:
|
||
|
||
```yaml
|
||
vault_plex_claim_token: "claim-xxxxxxxxx" # https://plex.tv/claim (4 мин)
|
||
|
||
# URL из Shadowrocket / NekoBox / Hiddify — автоматически разберётся:
|
||
vault_hysteria2_url: "hysteria2://password@vps.example.com:443?obfs=salamander&obfs-password=secret"
|
||
|
||
vault_samba_password: "my-samba-password"
|
||
vault_transmission_password: "my-torrent-password"
|
||
```
|
||
|
||
Hysteria2 работает только как **sidecar в Prowlarr поде** — не cluster-wide VPN. Init-контейнер автоматически прописывает SOCKS5 `127.0.0.1:1080` в `config.xml` Prowlarr.
|
||
|
||
Все 9 сервисов используют **один shared PVC** (RWX NFS):
|
||
|
||
```
|
||
/data/config/<service>/ ← конфиг каждого сервиса
|
||
/data/data/downloads/ ← Transmission
|
||
/data/data/movies/ ← Radarr
|
||
/data/data/series/ ← Sonarr
|
||
/data/data/music/ ← Lidarr
|
||
```
|
||
|
||
Samba получает IP от kube-vip (`LoadBalancer`) — подключение из LAN: `\\<ip>\media`.
|
||
|
||
Подробнее: [addons/mediaserver/README.md](../addons/mediaserver/README.md)
|
||
|
||
## External Services Ingress Proxy
|
||
|
||
Проксирует внешние сервисы (вне кластера) через ingress-nginx по доменному имени. Для каждого сервиса автоматически создаёт `Service (ClusterIP, no selector)` + `Endpoints` + `Ingress`. Поддерживает TLS, basic auth, WebSocket, несколько хостов и несколько backend IP.
|
||
|
||
```bash
|
||
make addon-ingress-proxypass
|
||
```
|
||
|
||
Конфигурация в `group_vars/all/addons.yml`:
|
||
|
||
```yaml
|
||
ingress_proxypass_proxies:
|
||
- name: plex
|
||
hosts: [plex.home.ru]
|
||
ips: [192.168.1.50]
|
||
port: 32400
|
||
|
||
- name: grafana
|
||
hosts: [grafana.home.ru]
|
||
ips: [192.168.1.60]
|
||
port: 3000
|
||
tls:
|
||
enabled: true
|
||
secretName: wildcard-cert
|
||
```
|
||
|
||
Подробнее: [addons/ingress-proxypass/README.md](../addons/ingress-proxypass/README.md)
|
||
|
||
---
|
||
|
||
## Ingress Add Domains
|
||
|
||
Добавляет дополнительные домены к уже существующим K8s сервисам. Создаёт **только Ingress** в namespace целевого сервиса — Service и Endpoints не трогает. Поддерживает TLS с cert-manager, basic auth (автохэш пароля), WebSocket.
|
||
|
||
```bash
|
||
make addon-ingress-add-domains
|
||
```
|
||
|
||
Конфигурация в `group_vars/all/addons.yml`:
|
||
|
||
```yaml
|
||
ingress_add_domains_entries:
|
||
- name: gitea-local
|
||
hosts: [gitea.local]
|
||
service:
|
||
name: gitea-http
|
||
namespace: gitea
|
||
port: 3000
|
||
|
||
- name: gitea-home
|
||
hosts: [gitea.home.ru]
|
||
service:
|
||
name: gitea-http
|
||
namespace: gitea
|
||
port: 3000
|
||
tls:
|
||
enabled: true
|
||
certManager:
|
||
enabled: true
|
||
issuer: letsencrypt-prod
|
||
auth:
|
||
enabled: true
|
||
username: admin
|
||
password: "{{ vault_gitea_password }}"
|
||
```
|
||
|
||
Подробнее: [addons/ingress-add-domains/README.md](../addons/ingress-add-domains/README.md)
|
||
|
||
---
|
||
|
||
## Split Gateway
|
||
|
||
Прозрачный split-tunnel proxy на базе sing-box с Hysteria2 как outbound. Перехватывает трафик с TV/устройств через TPROXY и маршрутизирует по правилам: YouTube → Hysteria2, RU-сервисы и частные сети → прямой маршрут.
|
||
|
||
```bash
|
||
# Режим systemd (установка на хост из группы [splitgw]):
|
||
make addon-splitgw
|
||
|
||
# Режим K8s DaemonSet:
|
||
make addon-splitgw ARGS="-e splitgw_deploy_mode=k8s"
|
||
```
|
||
|
||
Настройки в `group_vars/all/addons.yml`:
|
||
|
||
```yaml
|
||
# IP-адреса устройств, трафик которых перехватывается:
|
||
splitgw_tv_sources:
|
||
- "192.168.1.100/32" # Smart TV
|
||
|
||
# IP роутера (для разворота DNS):
|
||
splitgw_router_ip: "192.168.1.1"
|
||
|
||
# URL из Shadowrocket / NekoBox (разбирается автоматически):
|
||
# vault_hysteria2_url задаётся в vault.yml
|
||
```
|
||
|
||
Vault секрет (тот же что для mediaserver):
|
||
|
||
```yaml
|
||
vault_hysteria2_url: "hysteria2://password@vps.example.com:443?obfs=salamander&obfs-password=secret"
|
||
```
|
||
|
||
Keenetic: создай политику маршрутизации для TV с шлюзом на ноду splitgw.
|
||
|
||
Подробнее: [addons/splitgw/README.md](../addons/splitgw/README.md)
|
||
|
||
---
|
||
|
||
## Prometheus метрики
|
||
|
||
Все аддоны создают ServiceMonitor автоматически при `addon_prometheus_stack: true`:
|
||
- ingress-nginx, cert-manager, ArgoCD, Gitea, Harbor, Jenkins
|
||
- PostgreSQL, MySQL, MinIO, Loki, Tempo, Pushgateway
|
||
- Longhorn, Velero, CrowdSec, Vaultwarden, Nextcloud, ownCloud
|
||
|
||
## Vault секреты
|
||
|
||
Полный список vault.yml переменных — `group_vars/all/vault.yml.example`:
|
||
|
||
```yaml
|
||
vault_k3s_token: ""
|
||
vault_grafana_user: "admin"
|
||
vault_grafana_password: ""
|
||
vault_kiali_token: ""
|
||
vault_gitea_admin_password: ""
|
||
vault_gitea_db_password: ""
|
||
vault_gitlab_admin_password: ""
|
||
vault_gitlab_db_password: ""
|
||
vault_harbor_admin_password: "Harbor12345"
|
||
vault_harbor_db_password: ""
|
||
vault_postgresql_postgres_password: ""
|
||
vault_postgresql_password: ""
|
||
vault_mysql_root_password: ""
|
||
vault_mysql_password: ""
|
||
vault_redis_password: ""
|
||
vault_mongodb_root_password: ""
|
||
vault_mongodb_password: ""
|
||
vault_kafka_client_password: ""
|
||
vault_kafka_ui_password: ""
|
||
vault_rabbitmq_password: ""
|
||
vault_rabbitmq_erlang_cookie: ""
|
||
vault_minio_root_user: "admin"
|
||
vault_minio_root_password: ""
|
||
vault_velero_s3_access_key: ""
|
||
vault_velero_s3_secret_key: ""
|
||
vault_crowdsec_enroll_key: ""
|
||
vault_nextcloud_admin_password: ""
|
||
vault_nextcloud_db_password: ""
|
||
vault_owncloud_admin_password: ""
|
||
vault_jenkins_admin_password: ""
|
||
vault_netbird_coturn_password: ""
|
||
vault_netbird_router_setup_key: ""
|
||
vault_netbird_exit_node_setup_key: ""
|
||
vault_plex_claim_token: ""
|
||
vault_hysteria2_url: "" # URL целиком из Shadowrocket/NekoBox — для mediaserver и splitgw
|
||
vault_hysteria2_server: ""
|
||
vault_hysteria2_auth: ""
|
||
vault_samba_password: ""
|
||
vault_transmission_password: ""
|
||
vault_vaultwarden_admin_token: ""
|
||
vault_vaultwarden_smtp_password: ""
|
||
vault_smtp_relay_password: ""
|
||
vault_glusterfs_heketi_secret: ""
|
||
vault_databasus_db_password: ""
|
||
vault_aws_kms_access_key: ""
|
||
vault_aws_kms_secret_key: ""
|
||
vault_transit_seal_token: ""
|
||
vault_azure_kv_client_secret: ""
|
||
vault_eso_approle_secret_id: ""
|
||
```
|