Files
K3S/remove-node.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

126 lines
4.9 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.

---
# ─────────────────────────────────────────────────────────────────────────────
# Безопасное удаление ноды из кластера
#
# Использование:
# make remove-node NODE=worker04
# make remove-node NODE=master04 (ВНИМАНИЕ: теряется один etcd участник)
#
# Порядок:
# 1. Cordon — запрещает планирование новых подов
# 2. Drain — вытесняет все поды на другие ноды
# 3. Delete — удаляет ноду из k8s API
# 4. Uninstall — удаляет k3s с ноды
#
# После удаления мастера рекомендуется добавить новый: make add-node NODE=...
# ─────────────────────────────────────────────────────────────────────────────
- name: Validate and prepare
hosts: "{{ groups['k3s_master'][0] }}"
gather_facts: false
become: true
tags: [always]
tasks:
- name: Validate NODE is specified
ansible.builtin.assert:
that: node_to_remove is defined and node_to_remove | length > 0
fail_msg: "Укажи ноду: make remove-node NODE=<nodename>"
- name: Prevent removing the only/first master
ansible.builtin.assert:
that:
- node_to_remove != groups['k3s_master'][0]
fail_msg: >
Нельзя удалить первый мастер ({{ groups['k3s_master'][0] }}) —
он является точкой инициализации кластера.
Перенести роль первого мастера: поменяй порядок нод в inventory и выполни restore.
- name: Warn if removing etcd member
ansible.builtin.debug:
msg: >
ВНИМАНИЕ: {{ node_to_remove }} является мастером (etcd участником).
После удаления в кластере останется {{ groups['k3s_master'] | length - 1 }} мастер(а).
Кворум: {{ (groups['k3s_master'] | length - 1) > (groups['k3s_master'] | length - 1) // 2 }}
when: node_to_remove in groups['k3s_master']
- name: Check node exists in cluster
ansible.builtin.command: k3s kubectl get node {{ node_to_remove }}
register: node_exists
changed_when: false
failed_when: false
- name: Cordon node
ansible.builtin.command: k3s kubectl cordon {{ node_to_remove }}
changed_when: true
when: node_exists.rc == 0
- name: Drain node (evict pods)
ansible.builtin.command: >
k3s kubectl drain {{ node_to_remove }}
--ignore-daemonsets
--delete-emptydir-data
--timeout=180s
--force
changed_when: true
when: node_exists.rc == 0
register: drain_result
failed_when: drain_result.rc != 0 and 'not found' not in drain_result.stderr
- name: Delete node from Kubernetes
ansible.builtin.command: k3s kubectl delete node {{ node_to_remove }}
changed_when: true
when: node_exists.rc == 0
- name: Uninstall K3S from removed node
hosts: "{{ node_to_remove | default('') }}"
gather_facts: false
become: true
tags: [k3s]
tasks:
- name: Run K3S server uninstall script
ansible.builtin.command: /usr/local/bin/k3s-uninstall.sh
failed_when: false
changed_when: true
when: node_to_remove in groups['k3s_master']
- name: Run K3S agent uninstall script
ansible.builtin.command: /usr/local/bin/k3s-agent-uninstall.sh
failed_when: false
changed_when: true
when:
- groups['k3s_workers'] is defined
- node_to_remove in groups['k3s_workers']
- name: Clean up k3s data directory
ansible.builtin.file:
path: "{{ item }}"
state: absent
loop:
- "{{ k3s_config_dir }}"
- "{{ k3s_data_dir }}"
failed_when: false
- name: Post-removal verification
hosts: "{{ groups['k3s_master'][0] }}"
gather_facts: false
become: true
tags: [verify]
tasks:
- name: Show remaining nodes
ansible.builtin.command: k3s kubectl get nodes -o wide
register: remaining_nodes
changed_when: false
- name: Display cluster nodes
ansible.builtin.debug:
msg: "{{ remaining_nodes.stdout_lines }}"
- name: Summary
ansible.builtin.debug:
msg: >
Нода {{ node_to_remove }} успешно удалена из кластера.
Удали её из inventory/hosts.ini.
{% if node_to_remove in groups['k3s_master'] %}
Рекомендуется добавить новую мастер-ноду: make add-node NODE=<новая-нода>
{% endif %}