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 под все новые команды
This commit is contained in:
108
Makefile
108
Makefile
@@ -47,12 +47,16 @@ DOCKER_RUN := docker run --rm -it \
|
||||
$(IMAGE_NAME)
|
||||
|
||||
.PHONY: help setup build rebuild \
|
||||
bootstrap \
|
||||
install install-k3s install-cni install-kubevip install-nfs install-ingress \
|
||||
install-istio install-monitoring \
|
||||
install-cert-manager install-istio install-monitoring \
|
||||
add-node remove-node \
|
||||
etcd-backup etcd-restore etcd-list-snapshots \
|
||||
upgrade uninstall health verify ping \
|
||||
shell lint check \
|
||||
molecule-k3s molecule-prometheus molecule-istio molecule-all molecule-lint \
|
||||
vault-create vault-edit vault-view vault-encrypt-string \
|
||||
vault-bootstrap-create vault-bootstrap-edit \
|
||||
clean clean-all \
|
||||
_check_env _check_image
|
||||
|
||||
@@ -65,12 +69,14 @@ help: ## Показать эту справку
|
||||
@printf "$(CYAN)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$(NC)\n"
|
||||
@echo ""
|
||||
@printf "$(BOLD)Первый запуск:$(NC)\n"
|
||||
@echo " 1. make setup — создать .env из шаблона"
|
||||
@echo " 1. make setup — создать .env из шаблона"
|
||||
@echo " 2. Отредактируй .env и inventory/hosts.ini"
|
||||
@echo " 3. make build — собрать Docker образ"
|
||||
@echo " 4. make vault-create — создать vault с токеном"
|
||||
@echo " 5. make ping — проверить SSH"
|
||||
@echo " 6. make install — развернуть полный стек"
|
||||
@echo " 3. make build — собрать Docker образ"
|
||||
@echo " 4. make vault-create — создать vault с K3S токеном"
|
||||
@echo " 5. make vault-bootstrap-create NODE=... — создать vault с паролями нод"
|
||||
@echo " 6. make bootstrap — создать пользователя + задеплоить SSH ключ"
|
||||
@echo " 7. make ping — проверить SSH"
|
||||
@echo " 8. make install — развернуть полный стек"
|
||||
@echo ""
|
||||
@printf "$(BOLD)Все команды:$(NC)\n"
|
||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
|
||||
@@ -79,6 +85,9 @@ help: ## Показать эту справку
|
||||
@echo ""
|
||||
@printf "$(BOLD)Переменные (передаются в командной строке):$(NC)\n"
|
||||
@printf " $(CYAN)VERSION$(NC)=v1.30.0+k3s1 версия K3S для upgrade\n"
|
||||
@printf " $(CYAN)NODE$(NC)=master04 нода для add-node/remove-node\n"
|
||||
@printf " $(CYAN)SNAPSHOT$(NC)=k3s-etcd-...db снимок для etcd-restore\n"
|
||||
@printf " $(CYAN)ETCD_COPY$(NC)=true скопировать backup локально\n"
|
||||
@printf " $(CYAN)ANSIBLE_VERBOSITY$(NC)=2 уровень debug вывода (0-4)\n"
|
||||
@printf " $(CYAN)ANSIBLE_TAGS$(NC)=k3s,kube_vip запустить только теги\n"
|
||||
@echo ""
|
||||
@@ -147,6 +156,44 @@ lint: _check_image ## Проверить синтаксис всех плейб
|
||||
# УСТАНОВКА
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# BOOTSTRAP — первичная настройка нод (создание пользователя + SSH ключ)
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
bootstrap: _check_env _check_image ## Первый запуск: создать пользователя и задеплоить SSH ключ на все ноды
|
||||
@printf "$(CYAN)$(BOLD)Bootstrap нод (пользователь + SSH ключ)...$(NC)\n"
|
||||
@printf "$(YELLOW)Нужны: host_vars/<node>/vault.yml с bootstrap_user и bootstrap_password$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook bootstrap.yml \
|
||||
$(if $(NODE),-e "node_to_bootstrap=$(NODE)",)
|
||||
|
||||
vault-bootstrap-create: _check_image ## Создать vault с bootstrap credentials для ноды (NODE=master01)
|
||||
@if [ -z "$(NODE)" ]; then \
|
||||
printf "$(RED)✗ Укажи ноду: make vault-bootstrap-create NODE=master01$(NC)\n"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@if [ ! -f "host_vars/$(NODE)/vault.yml.example" ]; then \
|
||||
printf "$(RED)✗ Не найден host_vars/$(NODE)/vault.yml.example$(NC)\n"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@cp host_vars/$(NODE)/vault.yml.example host_vars/$(NODE)/vault.yml
|
||||
docker run --rm -it \
|
||||
-v $(PWD):/ansible \
|
||||
-e VAULT_PASSWORD="$(VAULT_PASSWORD)" \
|
||||
$(IMAGE_NAME) \
|
||||
ansible vault encrypt host_vars/$(NODE)/vault.yml
|
||||
@printf "$(GREEN)✓ Vault host_vars/$(NODE)/vault.yml создан$(NC)\n"
|
||||
|
||||
vault-bootstrap-edit: _check_image ## Редактировать bootstrap vault ноды (NODE=master01)
|
||||
@if [ -z "$(NODE)" ]; then \
|
||||
printf "$(RED)✗ Укажи ноду: make vault-bootstrap-edit NODE=master01$(NC)\n"; \
|
||||
exit 1; \
|
||||
fi
|
||||
docker run --rm -it \
|
||||
-v $(PWD):/ansible \
|
||||
-e VAULT_PASSWORD="$(VAULT_PASSWORD)" \
|
||||
$(IMAGE_NAME) \
|
||||
ansible vault edit host_vars/$(NODE)/vault.yml
|
||||
|
||||
install: _check_env _check_image ## Развернуть полный стек (K3S + kube-vip + NFS + ingress)
|
||||
@printf "$(CYAN)$(BOLD)Разворачиваю полный K3S стек...$(NC)\n"
|
||||
$(DOCKER_RUN) install
|
||||
@@ -171,6 +218,10 @@ install-ingress: _check_env _check_image ## Установить ingress-nginx
|
||||
@printf "$(CYAN)Устанавливаю ingress-nginx...$(NC)\n"
|
||||
$(DOCKER_RUN) install-ingress
|
||||
|
||||
install-cert-manager: _check_env _check_image ## Установить cert-manager + ClusterIssuer
|
||||
@printf "$(CYAN)Устанавливаю cert-manager...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook site.yml --tags cert_manager -e cert_manager_enabled=true
|
||||
|
||||
install-istio: _check_env _check_image ## Установить Istio + Kiali (нужен istio_enabled: true в vars)
|
||||
@printf "$(CYAN)Устанавливаю Istio + Kiali...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook site.yml --tags istio -e istio_enabled=true
|
||||
@@ -179,6 +230,51 @@ install-monitoring: _check_env _check_image ## Установить Prometheus +
|
||||
@printf "$(CYAN)Устанавливаю kube-prometheus-stack...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook site.yml --tags monitoring -e prometheus_stack_enabled=true
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# МАСШТАБИРОВАНИЕ КЛАСТЕРА
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
add-node: _check_env _check_image ## Добавить ноду: make add-node NODE=master04
|
||||
@if [ -z "$(NODE)" ]; then \
|
||||
printf "$(RED)✗ Укажи ноду: make add-node NODE=<nodename>$(NC)\n"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@printf "$(CYAN)Добавляю ноду $(NODE) в кластер...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook add-node.yml -e "node_to_add=$(NODE)"
|
||||
|
||||
remove-node: _check_env _check_image ## Удалить ноду: make remove-node NODE=worker04
|
||||
@if [ -z "$(NODE)" ]; then \
|
||||
printf "$(RED)✗ Укажи ноду: make remove-node NODE=<nodename>$(NC)\n"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@printf "$(RED)$(BOLD)Удаление ноды $(NODE) из кластера...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook remove-node.yml -e "node_to_remove=$(NODE)"
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# РЕЗЕРВНОЕ КОПИРОВАНИЕ ETCD
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
etcd-backup: _check_env _check_image ## Создать снимок etcd (make etcd-backup [SNAPSHOT=name] [ETCD_COPY=true])
|
||||
@printf "$(CYAN)Создаю снимок etcd...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook etcd-backup.yml \
|
||||
$(if $(SNAPSHOT),-e etcd_backup_name=$(SNAPSHOT),) \
|
||||
$(if $(ETCD_COPY),-e etcd_backup_copy_to_local=$(ETCD_COPY),)
|
||||
|
||||
etcd-restore: _check_env _check_image ## Восстановить etcd: make etcd-restore SNAPSHOT=k3s-etcd-20250101.db
|
||||
@if [ -z "$(SNAPSHOT)" ]; then \
|
||||
printf "$(RED)✗ Укажи снимок: make etcd-restore SNAPSHOT=<filename>$(NC)\n"; \
|
||||
printf "$(YELLOW) Список снимков: make etcd-list-snapshots$(NC)\n"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@printf "$(RED)$(BOLD)ВНИМАНИЕ: восстановление etcd перезапишет данные кластера!$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook etcd-restore.yml \
|
||||
-e "etcd_restore_snapshot=$(SNAPSHOT)" \
|
||||
$(if $(FORCE),-e etcd_restore_force=true,)
|
||||
|
||||
etcd-list-snapshots: _check_env _check_image ## Показать доступные снимки etcd
|
||||
@printf "$(CYAN)Список снимков etcd...$(NC)\n"
|
||||
$(DOCKER_RUN) ansible-playbook etcd-restore.yml --tags list
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# ОБНОВЛЕНИЕ
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user