## Переименование путей (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 под все новые команды
126 lines
4.9 KiB
YAML
126 lines
4.9 KiB
YAML
---
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# Безопасное удаление ноды из кластера
|
||
#
|
||
# Использование:
|
||
# 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 %}
|