Files
K3S/playbooks/site.yml
Sergey Antropoff a94039e0f1 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
2026-04-25 06:34:48 +03:00

116 lines
4.6 KiB
YAML
Raw 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.

---
# ─────────────────────────────────────────────────────────────────────────────
# K3S Core Stack — разворачивает кластер без аддонов.
#
# Порядок:
# 0. Chrony — синхронизация времени (обязательно до k3s)
# 1. K3S — кластер (master → workers)
# 2. Helm — устанавливается на мастер-ноды (нужен аддонам)
# 3. CNI — сетевой плагин (calico/cilium; flannel встроен)
# 4. kube-vip — VIP для control plane + LoadBalancer
# 5. k3s-certs — systemd таймер авторотации сертификатов
#
# Аддоны устанавливаются отдельно: make addon-<name>
# Полный стек с аддонами: make install-full
# ─────────────────────────────────────────────────────────────────────────────
# ── 0. External etcd (если k3s_etcd_type: external) ──────────────────────────
- name: Deploy external etcd cluster
hosts: etcd_nodes
gather_facts: true
become: true
tags: [etcd]
when: k3s_etcd_type | default('embedded') == 'external'
roles:
- role: etcd
# ── 0. Chrony — синхронизация времени ────────────────────────────────────────
- name: Configure time synchronization (chrony)
hosts: k3s_cluster
gather_facts: true
become: true
tags: [chrony, time, prereqs]
roles:
- role: chrony
# ── 1. K3S Cluster ────────────────────────────────────────────────────────────
- name: Install K3S cluster (HA embedded etcd)
hosts: k3s_cluster
gather_facts: true
become: true
serial: 1
tags: [k3s]
roles:
- role: k3s
# ── 2. Helm на мастер-нодах ──────────────────────────────────────────────────
- name: Install Helm on master nodes
hosts: k3s_master
gather_facts: false
become: true
tags: [helm]
tasks:
- name: Check if Helm is installed
ansible.builtin.command: helm version --short
register: helm_check
failed_when: false
changed_when: false
- name: Download and install Helm
ansible.builtin.shell: |
set -o pipefail
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
args:
executable: /bin/bash
when: helm_check.rc != 0
retries: 3
delay: 5
# ── 3. CNI (calico/cilium; при flannel — пропускается) ──────────────────────
- name: Deploy CNI plugin
hosts: k3s_master[0]
gather_facts: false
become: true
tags: [cni]
roles:
- role: cni
# ── 4. kube-vip ───────────────────────────────────────────────────────────────
- name: Deploy kube-vip (VIP + LoadBalancer)
hosts: k3s_master
gather_facts: true
become: true
tags: [kube_vip]
roles:
- role: kube-vip
# ── 5. Certificate Auto-Rotation ─────────────────────────────────────────────
- name: Setup K3S certificate auto-rotation
hosts: k3s_cluster
gather_facts: true
become: true
tags: [certs, k3s_certs]
roles:
- role: k3s-certs
# ── Verify core stack ─────────────────────────────────────────────────────────
- name: Verify core stack
hosts: k3s_master[0]
gather_facts: false
become: true
tags: [verify]
tasks:
- name: Nodes
ansible.builtin.command: k3s kubectl get nodes -o wide
register: nodes
changed_when: false
- ansible.builtin.debug:
msg: "{{ nodes.stdout_lines }}"
- name: All pods
ansible.builtin.command: k3s kubectl get pods -A
register: pods
changed_when: false
- ansible.builtin.debug:
msg: "{{ pods.stdout_lines }}"