Веб-UI FastAPI, REST API v1, интерактивный setup без env.example
- Дашборд (Jinja2 + static), управление кластерами kind, задания и kubeconfig. - API: health, stats, clusters CRUD, versions, jobs; документация app/docs/api_routes.md. - Docker Compose: том app, uvicorn reload, KIND_K8S_PATCH_KUBECONFIG по умолчанию 1. - setup_env_interactive.py: список переменных в скрипте, удалён env.example. - Makefile: явный префикс docker/podman; прочие правки CLI и ядра кластеров.
This commit is contained in:
@@ -1,81 +1,75 @@
|
||||
# Локальные кластеры Kubernetes через kind.
|
||||
# Основной сценарий: только Docker (+ make) на хосте — скрипты и kind внутри образа kind-k8s-tools.
|
||||
# kind-k8s-develop — веб-интерфейс (FastAPI) для kind.
|
||||
# Создание кластеров — в браузере: http://127.0.0.1:6000 (порт: KIND_K8S_WEB_PORT).
|
||||
#
|
||||
# Все операции с Compose только с явным выбором среды:
|
||||
# make docker up | make docker down | make docker logs | …
|
||||
# make podman up | make podman down | …
|
||||
# Без префикса docker/podman цели up/down/logs/compose-build/check-docker завершатся с подсказкой.
|
||||
#
|
||||
# Автор: Сергей Антропов — https://devops.org.ru
|
||||
# https://kind.sigs.k8s.io/docs/user/quick-start/
|
||||
|
||||
.PHONY: help setup clusters-dir check-docker compose-build create delete list status \
|
||||
create-host delete-host status-host check-host kubeconfig create-compose delete-compose
|
||||
ifneq (,$(filter podman,$(MAKECMDGOALS)))
|
||||
COMPOSE := podman compose
|
||||
else ifneq (,$(filter docker,$(MAKECMDGOALS)))
|
||||
COMPOSE := docker compose
|
||||
endif
|
||||
|
||||
.PHONY: help docker podman _require_runtime up down logs setup clusters-dir check-docker compose-build
|
||||
|
||||
KIND_K8S_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
|
||||
SETUP_ENV_SCRIPT := $(KIND_K8S_DIR)/scripts/setup_env_interactive.py
|
||||
PYTHON ?= python3
|
||||
COMPOSE ?= docker compose
|
||||
# При ошибке «exec format error» у kind в контейнере: make compose-build COMPOSE_BUILD_FLAGS=--platform linux/arm64
|
||||
# При «exec format error» у kind: make docker compose-build COMPOSE_BUILD_FLAGS=--platform linux/arm64
|
||||
COMPOSE_BUILD_FLAGS ?=
|
||||
K8S_APP := /opt/kind-k8s/app
|
||||
|
||||
help: ## Показать справку
|
||||
@echo "Команды (из каталога kind-k8s-develop или: make -C kind-k8s-develop <цель>):"
|
||||
@echo " Основной путь — Docker: make create / delete / list / status (kind и Python не нужны на хосте)."
|
||||
@grep -E '^[a-zA-Z0-9_-]+:.*?##' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?##"} {printf " \033[36m%-22s\033[0m %s\n", $$1, $$2}'
|
||||
help: ## Справка по целям
|
||||
@echo "Веб-UI kind — только с выбором Docker или Podman в одной команде с целью:"
|
||||
@echo " make docker up или make podman up → http://127.0.0.1:\$${KIND_K8S_WEB_PORT:-6000}"
|
||||
@echo " make docker down / make podman down"
|
||||
@echo " make docker logs / make podman logs"
|
||||
@echo " make docker compose-build / make podman compose-build"
|
||||
@echo " make docker check-docker / make podman check-docker"
|
||||
@echo "Без установки Compose: make setup, make clusters-dir (python3 для setup)."
|
||||
@grep -E '^[a-zA-Z0-9_-]+:.*?##' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?##"} {printf " \033[36m%-28s\033[0m %s\n", $$1, $$2}'
|
||||
|
||||
setup: ## Интерактивно создать .env по env.example (scripts/setup_env_interactive.py)
|
||||
docker: ## Маркер среды: задайте вторую цель (например: make docker up)
|
||||
@:
|
||||
|
||||
podman: ## Маркер среды: задайте вторую цель (например: make podman up)
|
||||
@:
|
||||
|
||||
# Общая проверка: цели up/down/logs/compose-build/check-docker вызывать только как make docker … / make podman …
|
||||
_require_runtime:
|
||||
@if [ -z "$(COMPOSE)" ]; then \
|
||||
echo >&2 "Укажите среду в той же команде, что и цель:"; \
|
||||
echo >&2 " make docker up | make podman up"; \
|
||||
echo >&2 " make docker down | make docker logs | make docker compose-build | make docker check-docker"; \
|
||||
echo >&2 " (или то же с префиксом podman)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
up: _require_runtime clusters-dir compose-build ## (с docker/podman) Поднять веб-UI в фоне
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) up -d kind-k8s-web
|
||||
|
||||
down: _require_runtime ## (с docker/podman) Остановить compose в этом каталоге
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) down
|
||||
|
||||
logs: _require_runtime ## (с docker/podman) Логи kind-k8s-web
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) logs -f kind-k8s-web
|
||||
|
||||
setup: ## Интерактивно создать .env (scripts/setup_env_interactive.py; нужен python3 на хосте)
|
||||
@$(PYTHON) "$(SETUP_ENV_SCRIPT)"
|
||||
|
||||
clusters-dir: ## Создать каталог clusters/ для тома (если ещё нет)
|
||||
clusters-dir: ## Каталог clusters/ для тома (если ещё нет)
|
||||
@mkdir -p "$(KIND_K8S_DIR)/clusters"
|
||||
|
||||
check-docker: ## Проверить docker/podman в PATH и работу команды COMPOSE (по умолчанию docker compose)
|
||||
@command -v docker >/dev/null 2>&1 || command -v podman >/dev/null 2>&1 || { echo "Нужен docker или podman в PATH."; exit 1; }
|
||||
@$(COMPOSE) version >/dev/null 2>&1 || { echo "Нужна рабочая команда Compose: «$(COMPOSE)». Для Podman: COMPOSE='podman compose' make check-docker"; exit 1; }
|
||||
check-docker: _require_runtime ## (с docker/podman) Проверить CLI и compose
|
||||
@case "$(COMPOSE)" in \
|
||||
docker*) command -v docker >/dev/null 2>&1 || { echo >&2 "docker не найден в PATH."; exit 1; } ;; \
|
||||
podman*) command -v podman >/dev/null 2>&1 || { echo >&2 "podman не найден в PATH."; exit 1; } ;; \
|
||||
esac
|
||||
@$(COMPOSE) version >/dev/null 2>&1 || { echo >&2 "Команда «$(COMPOSE) version» недоступна."; exit 1; }
|
||||
@echo "$(COMPOSE): OK"
|
||||
|
||||
compose-build: clusters-dir ## Собрать образ kind-k8s-tools
|
||||
compose-build: _require_runtime clusters-dir ## (с docker/podman) Собрать образ kind-k8s-tools:local
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) build $(COMPOSE_BUILD_FLAGS)
|
||||
|
||||
# --- Сценарий без установки kind/kubectl/python на хост (только Docker) ---
|
||||
|
||||
create: compose-build ## Интерактивно создать кластер (всё в контейнере)
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm -it kind-k8s-tools python3 $(K8S_APP)/create_cluster.py
|
||||
|
||||
delete: compose-build ## Интерактивно удалить кластер и папку clusters/<имя>/
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm -it kind-k8s-tools python3 $(K8S_APP)/delete_cluster.py
|
||||
|
||||
list: compose-build ## Список кластеров kind (kind внутри контейнера)
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm kind-k8s-tools kind get clusters
|
||||
|
||||
status: compose-build ## Статус узлов; make status CLUSTER=имя — один кластер
|
||||
cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm -it kind-k8s-tools python3 $(K8S_APP)/cluster_status.py $(CLUSTER)
|
||||
|
||||
# Совместимость со старыми именами целей
|
||||
create-compose: ## то же, что create (совместимость)
|
||||
@$(MAKE) -C "$(KIND_K8S_DIR)" create
|
||||
|
||||
delete-compose: ## то же, что delete (совместимость)
|
||||
@$(MAKE) -C "$(KIND_K8S_DIR)" delete
|
||||
|
||||
# --- Локальный запуск скриптов на хосте (нужны kind, kubectl, python3) ---
|
||||
|
||||
check-host: ## Проверить docker, kind, kubectl, python3 на хосте
|
||||
@echo "--- check-host (локальные бинарники) ---"
|
||||
@command -v docker >/dev/null 2>&1 && echo " docker: $$(command -v docker)" || { echo " docker: НЕ НАЙДЕН"; exit 1; }
|
||||
@command -v kind >/dev/null 2>&1 && echo " kind: $$(command -v kind)" || { echo " kind: НЕ НАЙДЕН (см. https://kind.sigs.k8s.io/docs/user/quick-start/#installation)"; exit 1; }
|
||||
@command -v kubectl >/dev/null 2>&1 && echo " kubectl: $$(command -v kubectl)" || { echo " kubectl: НЕ НАЙДЕН"; exit 1; }
|
||||
@command -v $(PYTHON) >/dev/null 2>&1 && echo " $(PYTHON): $$(command -v $(PYTHON))" || { echo " $(PYTHON): НЕ НАЙДЕН"; exit 1; }
|
||||
|
||||
create-host: check-host ## Создать кластер скриптом на хосте (не через образ)
|
||||
cd "$(KIND_K8S_DIR)" && $(PYTHON) app/create_cluster.py
|
||||
|
||||
delete-host: ## Удалить кластер скриптом на хосте
|
||||
@command -v $(PYTHON) >/dev/null 2>&1 || { echo "Нужен $(PYTHON)"; exit 1; }
|
||||
cd "$(KIND_K8S_DIR)" && $(PYTHON) app/delete_cluster.py
|
||||
|
||||
status-host: check-host ## Статус узлов скриптом на хосте
|
||||
cd "$(KIND_K8S_DIR)" && \
|
||||
if [ -n "$(CLUSTER)" ]; then $(PYTHON) app/cluster_status.py "$(CLUSTER)"; else $(PYTHON) app/cluster_status.py; fi
|
||||
|
||||
kubeconfig: ## Путь к kubeconfig на хосте: make kubeconfig CLUSTER=имя
|
||||
@if [ -z "$(CLUSTER)" ]; then echo "Использование: make kubeconfig CLUSTER=<имя_кластера>"; exit 1; fi
|
||||
@test -f "$(KIND_K8S_DIR)/clusters/$(CLUSTER)/kubeconfig" || { echo "Файл не найден: clusters/$(CLUSTER)/kubeconfig"; exit 1; }
|
||||
@echo "$(KIND_K8S_DIR)/clusters/$(CLUSTER)/kubeconfig"
|
||||
|
||||
Reference in New Issue
Block a user