# Операции с кластером ## Управление нодами ### Добавить ноду 1. Добавь ноду в `inventory/hosts.ini`: ```ini [k3s_master] master01 ansible_host=192.168.1.10 ansible_user=ubuntu worker01 ansible_host=192.168.1.11 ansible_user=ubuntu rpi01 ansible_host=192.168.1.12 ansible_user=pi [k3s_workers] worker04 ansible_host=192.168.1.14 ansible_user=ubuntu ``` 2. Добавить: ```bash make add-node NODE=worker04 ``` Новые ноды подключаются через VIP (kube_vip_address). После добавления нода появляется в кластере автоматически. ### Удалить ноду ```bash make remove-node NODE=worker04 ``` Порядок: 1. `cordon` — запретить новые поды 2. `drain` — вытеснить поды (таймаут 180 сек) 3. `delete` — удалить из Kubernetes API 4. Запуск K3S uninstall на удалённом хосте 5. Очистка директорий K3S После удаления убери ноду из `inventory/hosts.ini`. **Ограничения:** - Нельзя удалить первый мастер (`groups['k3s_master'][0]`) — точка инициализации кластера - При удалении мастера etcd-кворум уменьшается: 3→2 нод — рекомендуется добавить замену --- ## etcd резервное копирование etcd хранит **всё состояние кластера**. Снимки хранятся на `{{ k3s_data_dir }}/server/db/snapshots`. ### Создать снимок ```bash make etcd-backup ``` Создаёт снимок `k3s-etcd-.db`, удаляет старые сверх `etcd_backup_retention` (умолч. 5). Копировать снимок на локальную машину: ```yaml etcd_backup_copy_to_local: true etcd_backup_local_dir: "./etcd-backups" ``` ### Список снимков ```bash make etcd-list-snapshots ``` ### Восстановление ```bash make etcd-restore SNAPSHOT=k3s-etcd-20250101T120000.db # Без подтверждения: FORCE=true make etcd-restore SNAPSHOT=k3s-etcd-20250101T120000.db ``` Что происходит: 1. K3S останавливается на **всех** нодах 2. `k3s server --cluster-reset --cluster-reset-restore-path=` на первом мастере 3. K3S запускается на первом мастере → ждёт API 4. K3S запускается на остальных мастерах 5. K3S-agent на воркерах ### Параметры | Переменная | Умолч. | Описание | |---|---|---| | `etcd_backup_dir` | `{{ k3s_data_dir }}/server/db/snapshots` | Директория снимков | | `etcd_backup_retention` | `5` | Количество хранимых снимков | | `etcd_backup_copy_to_local` | `false` | Копировать на Ansible-хост | | `etcd_backup_local_dir` | `./etcd-backups` | Локальная директория | --- ## Обновление K3S ```bash make upgrade VERSION=v1.30.0+k3s1 ``` Обновление происходит по очереди (`serial: 1` в `upgrade.yml`): 1. Drain ноды → вытеснить поды 2. Обновить K3S бинарник 3. Перезапустить сервис 4. Дождаться `Ready` 5. Uncordon → восстановить планирование 6. Перейти к следующей ноде HA-режим гарантирует доступность кластера: пока одна нода обновляется, остальные обслуживают трафик. --- ## Диагностика ```bash make health # Статус сервисов, поды, диск, память make verify # Nodes, pods, services, storageclass, ingress # Открыть shell в ansible-контейнере: make shell ``` Внутри контейнера: ```bash ansible all -m shell -a "systemctl status k3s" ansible k3s_master -m shell -a "k3s kubectl get nodes -o wide" ansible k3s_master -m shell -a "k3s kubectl get pods -A | grep -v Running" ansible k3s_master -m shell -a "k3s etcd-snapshot ls" ``` Локально с kubectl: ```bash export KUBECONFIG=$(pwd)/kubeconfig kubectl top nodes kubectl top pods -A kubectl get events -A --sort-by='.lastTimestamp' | tail -20 kubectl get nodes -o wide kubectl get pods -A | grep -v Running ``` ### Проверка etcd ```bash kubectl -n kube-system exec -it \ $(kubectl -n kube-system get pods -l component=etcd -o name | head -1) \ -- etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/var/lib/kubernetes/k3s/server/tls/etcd/server-ca.crt \ --cert=/var/lib/kubernetes/k3s/server/tls/etcd/server-client.crt \ --key=/var/lib/kubernetes/k3s/server/tls/etcd/server-client.key \ member list ``` --- ## Сброс и переустановка ```bash # Удалить весь стек (с подтверждением) make uninstall # Переустановить базовый стек make install ``` --- ## Ротация сертификатов K3S Systemd-таймер автоматически проверяет срок истечения сертификатов: ```yaml k3s_cert_auto_rotate: true k3s_cert_validity_years: 5 k3s_cert_rotate_before_days: 90 k3s_cert_check_schedule: "monthly" ``` Ручная ротация: ```bash make shell ansible k3s_master -m shell -a "k3s certificate rotate" ansible k3s_master -m shell -a "systemctl restart k3s" ``` --- ## Ansible Vault операции ```bash make vault-create # Создать новый vault файл make vault-edit # Редактировать зашифрованные секреты make vault-view # Просмотреть содержимое # Зашифровать одну строку: make vault-encrypt-string STR="my-secret" NAME="vault_my_secret" ```