feat: крупное обновление стека — пути, bootstrap, etcd, cert-manager, custom errors, ноды

## Переименование путей (rancher → kubernetes)

- Все пути /var/lib/rancher/k3s → /var/lib/kubernetes/k3s
- Все пути /etc/rancher/k3s   → /etc/kubernetes/k3s
- Добавлены переменные k3s_config_dir, k3s_data_dir, k3s_kubeconfig_path
- K3S install получил --data-dir и K3S_CONFIG_FILE флаги
- k3s-server-config.yaml.j2: добавлены write-kubeconfig и data-dir ключи
- Все роли (csi-nfs, ingress-nginx, cert-manager, prometheus, istio, cni)
  переведены на {{ k3s_kubeconfig_path }} вместо хардкода

## Bootstrap (новое)

- bootstrap.yml — playbook для первоначальной настройки нод
- roles/bootstrap/ — создаёт пользователя ansible, настраивает sudoers,
  деплоит SSH публичный ключ по паролю из vault
- host_vars/*/vault.yml.example — шаблоны с bootstrap_user/bootstrap_password
- make bootstrap, make vault-bootstrap-create NODE=..., make vault-bootstrap-edit NODE=...

## Добавление/удаление нод (новое)

- add-node.yml — добавляет мастер или воркер в существующий кластер через VIP
- remove-node.yml — cordon → drain → delete → uninstall → cleanup
- inventory/hosts.ini: добавлена группа [k3s_workers], обновлён [k3s_cluster:children]
- roles/k3s/tasks/main.yml: install_agent.yml для воркеров

## etcd backup/restore (новое)

- etcd-backup.yml / etcd-restore.yml — top-level playbooks
- roles/etcd/tasks/backup.yml — k3s etcd-snapshot save + retention cleanup
- roles/etcd/tasks/restore.yml — cluster-reset + перезапуск всех нод
- make etcd-backup, make etcd-restore SNAPSHOT=..., make etcd-list-snapshots

## cert-manager addon (новое)

- roles/cert-manager/ — установка через Helm + опциональный ClusterIssuer
- Поддержка: none | selfsigned | letsencrypt
- Шаблоны ClusterIssuer для selfsigned CA и ACME HTTP-01
- Управляется флагом cert_manager_enabled: false

## Custom error backend для ingress-nginx (новое)

- custom-error-page.html.j2 — тёмная Kubernetes-styled страница ошибок
- custom-error-backend.yaml.j2 — ConfigMap + Deployment (nginx) + Service
- nginx использует sub_filter для динамической подстановки X-Code/X-Message
- ingress-nginx Helm values: custom-http-errors, default-backend-service
- Управляется флагом ingress_nginx_custom_errors_enabled: true

## Hostname и пакеты (новое)

- prereqs.yml: установка hostname из inventory_hostname (пропускается в Molecule)
- prereqs.yml: установка k3s_common_packages (nfs-common, mc, htop, vim, wget, и др.)
- molecule_test: true в converge.yml исключает hostname из тестов

## Molecule improvements

- 3 платформы: master01 (Ubuntu 22.04) + worker01 (Ubuntu 22.04) + rpi01 (Debian 12)
- Molecule запускается из Docker контейнера через /var/run/docker.sock (DinD)
- Все пути в converge.yml и verify.yml обновлены под /etc/kubernetes/k3s

## Флаги включения компонентов

- kube_vip_enabled, nfs_server_enabled, csi_nfs_enabled, ingress_nginx_enabled
- cert_manager_enabled, istio_enabled, kiali_enabled, prometheus_stack_enabled
- Каждая роль пропускает установку через meta: end_play при disabled

## Документация

- README полностью переработан: все новые возможности с примерами
- Новые разделы: Управление нодами, etcd backup/restore, cert-manager, bootstrap
- Обновлены Makefile, docker/entrypoint.sh под все новые команды
This commit is contained in:
Sergey Antropoff
2026-04-23 06:32:14 +03:00
parent d9a35478a6
commit 24846d2e52
46 changed files with 1860 additions and 67 deletions

View File

@@ -1,4 +1,17 @@
---
# ═══════════════════════════════════════════════════════════════════════════════
# Включение/отключение компонентов стека
# Поменяй на true/false чтобы установить или пропустить компонент
# ═══════════════════════════════════════════════════════════════════════════════
kube_vip_enabled: true # VIP для control plane + LoadBalancer
nfs_server_enabled: true # NFS сервер на nfs_server хосте
csi_nfs_enabled: true # CSI NFS Driver + StorageClass
ingress_nginx_enabled: true # ingress-nginx (HTTP/S Ingress controller)
cert_manager_enabled: false # cert-manager (TLS сертификаты)
istio_enabled: false # Istio service mesh
kiali_enabled: false # Kiali UI (требует istio_enabled: true)
prometheus_stack_enabled: false # Prometheus + Grafana + Alertmanager
# ─── K3S ──────────────────────────────────────────────────────────────────────
k3s_version: "v1.29.3+k3s1"
@@ -6,8 +19,9 @@ k3s_version: "v1.29.3+k3s1"
k3s_token: "{{ vault_k3s_token }}"
k3s_install_dir: /usr/local/bin
k3s_config_dir: /etc/rancher/k3s
k3s_data_dir: /var/lib/rancher/k3s
k3s_config_dir: /etc/kubernetes/k3s
k3s_data_dir: /var/lib/kubernetes/k3s
k3s_kubeconfig_path: "{{ k3s_config_dir }}/k3s.yaml"
k3s_cluster_cidr: "10.42.0.0/16"
k3s_service_cidr: "10.43.0.0/16"
@@ -30,6 +44,37 @@ k3s_extra_server_args: ""
k3s_extra_agent_args: ""
k3s_become: true
# Дополнительные пакеты устанавливаемые на все ноды
k3s_common_packages:
- nfs-common
- mc
- htop
- vim
- wget
- open-iscsi
- bash-completion
- net-tools
- dnsutils
- lsof
- tcpdump
- traceroute
# ─── Bootstrap (первичная настройка нод) ──────────────────────────────────────
# Пользователь, который создаётся при make bootstrap и используется для деплоя
k3s_admin_user: ansible
k3s_admin_shell: /bin/bash
# Файл SSH публичного ключа внутри контейнера (из примонтированного ~/.ssh)
k3s_admin_ssh_public_key_files:
- /root/.ssh/id_ed25519.pub
# Отключить пароль SSH после деплоя ключа
k3s_admin_disable_password_auth: false
# Адрес для подключения новых нод — по умолчанию первый мастер (для initial install).
# При add-node.yml автоматически используется kube_vip_address.
k3s_join_address: "{{ hostvars[groups['k3s_master'][0]]['ansible_host'] }}"
# ─── kube-vip ─────────────────────────────────────────────────────────────────
# ОБЯЗАТЕЛЬНО: задай свободный IP из твоей подсети, не занятый DHCP!
kube_vip_address: "192.168.1.100"
@@ -86,6 +131,11 @@ ingress_nginx_metrics_enabled: false
ingress_nginx_class_name: "nginx"
ingress_nginx_set_default_class: true
# Кастомная страница ошибок — название кластера для отображения на странице ошибки
ingress_nginx_custom_errors_enabled: true
ingress_nginx_error_cluster_name: "K3S Cluster"
ingress_nginx_error_cluster_domain: "" # например: cluster.example.com
ingress_nginx_resources:
requests:
cpu: 100m
@@ -96,9 +146,29 @@ ingress_nginx_resources:
ingress_nginx_extra_args: {}
# ─── cert-manager ─────────────────────────────────────────────────────────────
# cert_manager_enabled: false (задаётся выше)
cert_manager_version: "v1.15.3"
cert_manager_namespace: "cert-manager"
# Автоматически создать ClusterIssuer после установки:
# none — не создавать (настрой вручную)
# selfsigned — самоподписанный CA (для внутреннего использования)
# letsencrypt — Let's Encrypt (требует публичный домен)
cert_manager_issuer: "selfsigned" # none | selfsigned | letsencrypt
# Let's Encrypt (нужен только если cert_manager_issuer: letsencrypt)
cert_manager_acme_email: "admin@example.com"
cert_manager_acme_server: "prod" # prod | staging
# ─── etcd backup ──────────────────────────────────────────────────────────────
etcd_backup_dir: "{{ k3s_data_dir }}/server/db/snapshots"
etcd_backup_retention: 5 # сколько снимков хранить локально
etcd_backup_copy_to_local: false # скопировать снимок на Ansible-хост
etcd_backup_local_dir: "./etcd-backups"
# ─── Istio (Service Mesh) ──────────────────────────────────────────────────────
# Установка по желанию: поменяй на true чтобы включить
istio_enabled: false
# istio_enabled: false (задаётся выше)
# istio_version: "1.22.2"
# istio_mtls_mode: "STRICT" # STRICT | PERMISSIVE | DISABLE
# istio_install_gateway: true
@@ -106,11 +176,10 @@ istio_enabled: false
# Kiali (UI для Istio) — требует istio_enabled: true
# Токен задаётся в vault.yml:
# vault_kiali_token: "" # заполни после первой установки (токен выведет Ansible)
kiali_enabled: false
# kiali_enabled: false (задаётся выше)
# ─── kube-prometheus-stack (Prometheus + Grafana + Alertmanager) ───────────────
# Установка по желанию: поменяй на true чтобы включить
prometheus_stack_enabled: false
# prometheus_stack_enabled: false (задаётся выше)
# prometheus_stack_version: "60.3.0"
# prometheus_retention_days: 7
# prometheus_storage_size: "10Gi"