feat: аддоны через addons.yml, внешний etcd, управление etcd нодами

## Аддоны (group_vars/all/addons.yml)

- Создан group_vars/all/addons.yml — единое место для включения/отключения
  аддонов (addon_ingress_nginx: true/false и т.д.) и их основных настроек
- Из group_vars/all/main.yml убраны все секции аддонов (NFS, CSI, ingress,
  cert-manager, etcd backup, Istio, Prometheus) — остался только core кластер
- Создан playbooks/addons.yml — комбинированный плейбук с 10 плеями,
  каждый с `when: addon_X | default(false) | bool`; запускает только включённые
- make install-full: core (site.yml) + аддоны по addons.yml
- make install-addons: только аддоны без переустановки core
- Убраны все *_enabled флаги из аддонов (cert_manager_enabled, istio_enabled,
  prometheus_stack_enabled и др.) — аддон ставится явным вызовом
- kube-vip: убран skip guard и kube_vip_enabled флаг (core, всегда ставится)
- TLS defaults в argocd/longhorn/kubernetes-dashboard: убрана зависимость
  от cert_manager_enabled, теперь просто false (задаётся явно)
- Kiali: убрана зависимость от prometheus_stack_enabled, добавлены переменные
  kiali_prometheus_enabled/url и kiali_grafana_enabled/url

## Внешний etcd кластер

- Новая переменная k3s_etcd_type: embedded|external в main.yml
- inventory/hosts.ini: добавлена группа [etcd_nodes] — любые серверы,
  не обязательно мастера
- roles/etcd/: полная роль для установки внешнего etcd кластера:
  - install.yml — скачивает бинарник, создаёт пользователя и директории
  - pki.yml — генерирует CA + server/peer/client сертификаты через openssl
    на Ansible-контроллере; раскладывает на etcd ноды и k3s мастера
  - service.yml — разворачивает etcd.env и systemd сервис, проверяет здоровье
  - etcd.env.j2 и etcd.service.j2 — шаблоны конфигурации
  - etcd_pki_local_dir: persistent путь (<project>/etcd-pki/) вместо /tmp,
    etcd-pki/ добавлен в .gitignore
- roles/k3s/templates/k3s-server-config.yaml.j2: при external режиме
  подставляет datastore-endpoint со всеми etcd нодами + пути к клиентским
  сертификатам; при embedded — прежняя логика cluster-init
- playbooks/site.yml: условный плей для etcd перед k3s (тег etcd)
- make install-etcd: отдельная команда для развёртывания etcd кластера

## Управление etcd нодами

- playbooks/add-etcd-node.yml: добавить ноду в работающий etcd кластер
  (PKI генерация → install → etcdctl member add → start с state=existing → verify)
- playbooks/remove-etcd-node.yml: безопасно удалить ноду из etcd кластера
  (проверка кворума → member remove → stop → clean up PKI)
- playbooks/add-node.yml: при k3s_etcd_type=external и наличии ноды в
  [etcd_nodes] автоматически добавляет её в etcd кластер после k3s
- playbooks/remove-node.yml: при k3s_etcd_type=external сначала удаляет
  ноду из etcd (member remove + stop), затем из k3s
- make add-etcd-node NODE=etcd04 / make remove-etcd-node NODE=etcd04
- Команды add-etcd-node / remove-etcd-node в docker/entrypoint.sh
This commit is contained in:
Sergey Antropoff
2026-04-25 06:34:48 +03:00
parent 8aa55a694c
commit a94039e0f1
30 changed files with 1301 additions and 169 deletions

View File

@@ -53,6 +53,7 @@ DOCKER_RUN := docker run --rm -it \
addon-istio addon-prometheus-stack addon-metrics-server \
addon-argocd addon-longhorn addon-kubernetes-dashboard \
add-node remove-node \
add-etcd-node remove-etcd-node \
etcd-backup etcd-restore etcd-list-snapshots \
upgrade uninstall health verify ping \
shell lint check \
@@ -222,12 +223,10 @@ install: _check_env _check_image ## Развернуть core кластер (K3
@printf "$(CYAN)$(BOLD)Разворачиваю K3S core кластер...$(NC)\n"
$(DOCKER_RUN) install
install-full: _check_env _check_image ## Полный стек: core + NFS + ingress-nginx (install + addon-nfs + addon-ingress-nginx)
@printf "$(CYAN)$(BOLD)Полный стек: core + NFS + ingress-nginx...$(NC)\n"
install-full: _check_env _check_image ## Полный стек: core + аддоны по флагам из group_vars/all/addons.yml
@printf "$(CYAN)$(BOLD)Полный стек: core + аддоны из addons.yml...$(NC)\n"
$(DOCKER_RUN) install
$(DOCKER_RUN) addon nfs-server
$(DOCKER_RUN) addon csi-nfs
$(DOCKER_RUN) addon ingress-nginx
$(DOCKER_RUN) install-addons
install-k3s: _check_env _check_image ## Установить только K3S кластер
@printf "$(CYAN)Устанавливаю K3S...$(NC)\n"
@@ -241,6 +240,14 @@ install-kubevip: _check_env _check_image ## Установить только ku
@printf "$(CYAN)Устанавливаю kube-vip...$(NC)\n"
$(DOCKER_RUN) install-kubevip
install-addons: _check_env _check_image ## Установить аддоны по флагам из group_vars/all/addons.yml
@printf "$(CYAN)Устанавливаю аддоны по addons.yml...$(NC)\n"
$(DOCKER_RUN) install-addons
install-etcd: _check_env _check_image ## Развернуть внешний etcd кластер (k3s_etcd_type: external)
@printf "$(CYAN)Развёртываю внешний etcd кластер...$(NC)\n"
$(DOCKER_RUN) ansible-playbook playbooks/site.yml --tags etcd $(ARGS)
# ═══════════════════════════════════════════════════════════════════════════════
# АДДОНЫ — дополнительные компоненты кластера (addons/<name>/playbook.yml)
# Кастомизация: make addon-<name> ARGS="-e var=value"
@@ -328,6 +335,23 @@ remove-node: _check_env _check_image ## Удалить ноду: make remove-nod
@printf "$(RED)$(BOLD)Удаление ноды $(NODE) из кластера...$(NC)\n"
$(DOCKER_RUN) ansible-playbook playbooks/remove-node.yml -e "node_to_remove=$(NODE)"
add-etcd-node: _check_env _check_image ## Добавить etcd ноду: make add-etcd-node NODE=etcd04
@if [ -z "$(NODE)" ]; then \
printf "$(RED)✗ Укажи ноду: make add-etcd-node NODE=<nodename>$(NC)\n"; \
printf "$(YELLOW) Нода должна быть в [etcd_nodes] в inventory$(NC)\n"; \
exit 1; \
fi
@printf "$(CYAN)Добавляю etcd ноду $(NODE)...$(NC)\n"
$(DOCKER_RUN) ansible-playbook playbooks/add-etcd-node.yml -e "node_to_add=$(NODE)" $(ARGS)
remove-etcd-node: _check_env _check_image ## Удалить etcd ноду: make remove-etcd-node NODE=etcd04
@if [ -z "$(NODE)" ]; then \
printf "$(RED)✗ Укажи ноду: make remove-etcd-node NODE=<nodename>$(NC)\n"; \
exit 1; \
fi
@printf "$(RED)$(BOLD)Удаление etcd ноды $(NODE) из кластера...$(NC)\n"
$(DOCKER_RUN) ansible-playbook playbooks/remove-etcd-node.yml -e "node_to_remove=$(NODE)" $(ARGS)
# ═══════════════════════════════════════════════════════════════════════════════
# РЕЗЕРВНОЕ КОПИРОВАНИЕ ETCD
# ═══════════════════════════════════════════════════════════════════════════════