## Переименование путей (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 под все новые команды
100 lines
4.2 KiB
YAML
100 lines
4.2 KiB
YAML
---
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# Добавить новую ноду в кластер
|
|
#
|
|
# Использование:
|
|
# make add-node NODE=master04 — новый мастер (etcd участник)
|
|
# make add-node NODE=worker04 — новый воркер (только agent)
|
|
#
|
|
# Перед запуском:
|
|
# 1. Добавь ноду в inventory/hosts.ini в нужную группу
|
|
# 2. Убедись что SSH доступ настроен
|
|
# 3. Запусти make ping NODE=<nodename> для проверки
|
|
#
|
|
# Новые мастера: подключаются через VIP (kube-vip должен быть запущен)
|
|
# Новые воркеры: подключаются через VIP как agents (без etcd)
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
# ── Читаем token и факты первого мастера ─────────────────────────────────────
|
|
- name: Gather cluster info from first master
|
|
hosts: "{{ groups['k3s_master'][0] }}"
|
|
gather_facts: true
|
|
become: true
|
|
tags: [always]
|
|
tasks:
|
|
- name: Read node-token from first master
|
|
ansible.builtin.slurp:
|
|
src: "{{ k3s_data_dir }}/server/node-token"
|
|
register: _node_token_raw
|
|
|
|
- name: Set shared token fact
|
|
ansible.builtin.set_fact:
|
|
k3s_node_token: "{{ _node_token_raw.content | b64decode | trim }}"
|
|
|
|
# ── Устанавливаем K3S на новую ноду ──────────────────────────────────────────
|
|
- name: Add new master node
|
|
hosts: "{{ node_to_add | default('') }}"
|
|
gather_facts: true
|
|
become: true
|
|
tags: [k3s]
|
|
serial: 1
|
|
|
|
vars:
|
|
# Новые мастера используют VIP (kube-vip уже работает)
|
|
k3s_join_address: "{{ kube_vip_address }}"
|
|
k3s_fetch_kubeconfig: true
|
|
|
|
pre_tasks:
|
|
- name: Verify node is in k3s_master or k3s_workers group
|
|
ansible.builtin.assert:
|
|
that:
|
|
- inventory_hostname in groups['k3s_master'] or
|
|
(groups['k3s_workers'] is defined and inventory_hostname in groups['k3s_workers'])
|
|
fail_msg: >
|
|
Нода '{{ inventory_hostname }}' не найдена в группах k3s_master или k3s_workers.
|
|
Добавь её в inventory/hosts.ini и повтори запуск.
|
|
|
|
- name: Check if K3S already installed
|
|
ansible.builtin.stat:
|
|
path: /usr/local/bin/k3s
|
|
register: k3s_installed
|
|
|
|
- name: Abort if K3S already running
|
|
ansible.builtin.assert:
|
|
that: not k3s_installed.stat.exists
|
|
fail_msg: >
|
|
K3S уже установлен на {{ inventory_hostname }}.
|
|
Используй make upgrade для обновления или make remove-node для удаления.
|
|
|
|
roles:
|
|
- role: k3s
|
|
|
|
post_tasks:
|
|
- name: Verify new node in cluster
|
|
ansible.builtin.command: >
|
|
k3s kubectl get node {{ inventory_hostname }} -o wide
|
|
delegate_to: "{{ groups['k3s_master'][0] }}"
|
|
become: true
|
|
register: new_node_status
|
|
changed_when: false
|
|
retries: 10
|
|
delay: 10
|
|
until: "'Ready' in new_node_status.stdout"
|
|
|
|
- name: Show node status
|
|
ansible.builtin.debug:
|
|
msg: "{{ new_node_status.stdout_lines }}"
|
|
|
|
- name: Install NFS client on new node (if CSI NFS enabled)
|
|
ansible.builtin.apt:
|
|
name: nfs-common
|
|
state: present
|
|
update_cache: true
|
|
when: csi_nfs_enabled | default(true) | bool
|
|
|
|
- name: Summary
|
|
ansible.builtin.debug:
|
|
msg: >
|
|
Нода {{ inventory_hostname }} успешно добавлена в кластер.
|
|
Тип: {{ 'master (etcd participant)' if inventory_hostname in groups['k3s_master'] else 'worker (agent)' }}
|