## Аддоны (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
116 lines
4.6 KiB
YAML
116 lines
4.6 KiB
YAML
---
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 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 }}"
|