Files
K3S/site.yml
Sergey Antropoff 24846d2e52 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 под все новые команды
2026-04-23 06:32:14 +03:00

139 lines
5.2 KiB
YAML

---
# ─────────────────────────────────────────────────────────────────────────────
# K3S Full Stack Playbook
# Порядок установки:
# 1. K3S cluster (master → workers)
# 2. kube-vip (VIP для control plane + LoadBalancer)
# 3. NFS Server (на master или отдельном хосте)
# 4. CSI NFS Driver (StorageClass для PVC)
# 5. ingress-nginx (Ingress controller через Helm)
#
# Запуск: ansible-playbook site.yml --ask-vault-pass
# Только отдельный компонент: ansible-playbook site.yml --tags kube_vip
# ─────────────────────────────────────────────────────────────────────────────
# ── 1. K3S Cluster ────────────────────────────────────────────────────────────
# serial: 1 — master01 запускается первым (cluster-init), остальные присоединяются
- name: Install K3S cluster (HA embedded etcd)
hosts: k3s_cluster
gather_facts: true
become: true
serial: 1
tags: [k3s]
roles:
- role: k3s
# ── 2. CNI (calico/cilium; при flannel — пропускается) ───────────────────────
- name: Deploy CNI plugin
hosts: "{{ groups['k3s_master'][0] }}"
gather_facts: false
become: true
tags: [cni]
roles:
- role: cni
# ── 3. kube-vip ───────────────────────────────────────────────────────────────
- name: Deploy kube-vip (VIP + LoadBalancer)
hosts: k3s_master
gather_facts: true
become: true
tags: [kube_vip]
roles:
- role: kube-vip
# ── 4. NFS Server ─────────────────────────────────────────────────────────────
- name: Configure NFS server
hosts: nfs_server
gather_facts: true
become: true
tags: [nfs, nfs_server]
roles:
- role: nfs-server
# ── 5. NFS client on all K3S nodes + CSI Driver ───────────────────────────────
- name: Deploy CSI NFS Driver
hosts: k3s_cluster
gather_facts: true
become: true
tags: [nfs, csi_nfs]
roles:
- role: csi-nfs
# ── 6. ingress-nginx ──────────────────────────────────────────────────────────
- name: Deploy ingress-nginx
hosts: k3s_cluster
gather_facts: true
become: true
tags: [ingress, ingress_nginx]
roles:
- role: ingress-nginx
# ── 7. cert-manager (опционально: cert_manager_enabled: true) ────────────────
- name: Deploy cert-manager
hosts: "{{ groups['k3s_master'][0] }}"
gather_facts: false
become: true
tags: [cert_manager, certmanager]
roles:
- role: cert-manager
# ── 8. Istio (опционально: istio_enabled: true) ───────────────────────────────
- name: Deploy Istio service mesh
hosts: "{{ groups['k3s_master'][0] }}"
gather_facts: false
become: true
tags: [istio]
roles:
- role: istio
# ── 9. kube-prometheus-stack (опционально: prometheus_stack_enabled: true) ─────
- name: Deploy kube-prometheus-stack
hosts: "{{ groups['k3s_master'][0] }}"
gather_facts: false
become: true
tags: [monitoring, prometheus]
roles:
- role: prometheus-stack
# ── Verify full stack ─────────────────────────────────────────────────────────
- name: Verify full stack
hosts: k3s_master
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 }}"
- name: Services with External IPs
ansible.builtin.command: k3s kubectl get svc -A
register: svcs
changed_when: false
- ansible.builtin.debug:
msg: "{{ svcs.stdout_lines }}"
- name: StorageClasses
ansible.builtin.command: k3s kubectl get storageclass
register: sc
changed_when: false
- ansible.builtin.debug:
msg: "{{ sc.stdout_lines }}"
- name: IngressClasses
ansible.builtin.command: k3s kubectl get ingressclass
register: ic
changed_when: false
- ansible.builtin.debug:
msg: "{{ ic.stdout_lines }}"