Kind Clusters Dashboard — локальные кластеры Kubernetes (kind)

Проект сделан для тех, кому нужен локальный Kubernetes без облака и без ручной возни в терминале: kind остаётся движком, а поверх него — единая панель в браузере и REST API. В одном месте можно создавать и удалять кластеры, смотреть узлы и поды, ставить типовые вещи через Helm (ingress, мониторинг, metrics-server и др.), вести журнал операций и скачивать kubeconfig для работы с кластером с хоста или из других контейнеров. Удобно для обучения DevOps/Kubernetes, быстрой проверки манифестов и Helm-чартов, демо и песочниц, когда не хочется поднимать управляемый кластер и платить за API control plane.

Технически панель — это FastAPI в Docker-образе kind-k8s-tools:local, запуск через Makefile и Compose (Docker или Podman). На хосте по умолчанию интерфейс открывается на порту 8080 (переменная KIND_K8S_WEB_PORT в .env); внутри контейнера приложение слушает 6000. Порт 6000 наружу по умолчанию не пробрасываем: в Chrome и других браузерах на Chromium он считается небезопасным (ERR_UNSAFE_PORT). kind, kubectl и Helm ставятся в образ — на машине достаточно контейнерной среды и make. Данные кластеров и kubeconfig лежат на хосте в clusters/<имя>/.

Зачем это нужно

  • Быстро получить Kubernetes локально (интеграционные тесты, манифесты, обучение) — см. ввод о назначении проекта выше.
  • Версия кластера и число worker-нод задаются в веб-UI (или через REST API / скрипты в контейнере).
  • Количество кластеров не ограничено кодом (ограничения — ресурсы хоста и Docker).
  • Артефакты на хосте: clusters/<имя>/ — том для kubeconfig (доступен в контейнере как /work/clusters/<имя>/).

Требования на хосте

Компонент Назначение
Docker + Compose v2 (или Podman + compose) Сборка образа и запуск веб-сервиса
make make docker up / make podman up и вспомогательные цели
python3 Только для make setup (создание .env)

На хост не нужны: kind, kubectl, Python приложения — всё это в образе kind-k8s-tools:local и выполняется в контейнере kind-k8s-web. Проверка API и узлов: веб-интерфейс (кластер → узлы/поды) или make docker kubectl CLUSTER=<имя> / make podman kubectl … (см. ниже) — kubectl вызывается через docker compose exec / podman compose exec внутри уже запущенного сервиса.

Быстрый старт в docker-compose.yml

services:
  kind-k8s-web:
    image: inecs/kind-cluster-dashboard:v1.0.0
    container_name: kind-clusters-dashboard
    user: "0:0"
    volumes:
      - ./clusters}:/work/clusters
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "8080:6000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      HOME: /root
      DOCKER_HOST: unix:///var/run/docker.sock
      KIND_K8S_IN_CONTAINER: "1"
      KIND_K8S_WORKDIR: /work
      KIND_K8S_PATCH_KUBECONFIG: "1"
      KIND_K8S_KUBECONFIG_CLIENT_HOST: localhost
      KIND_K8S_KUBECONFIG_TLS_SERVER_NAME: localhost
      KIND_K8S_APISERVER_GATEWAY_HOST: host.docker.internal
      CONTAINER_CLI: docker
      KIND_K8S_SKIP_VERSION_LIST: "0"
      KIND_K8S_VERSION_LIST_DISPLAY: "50"
      KIND_K8S_HUB_TAGS_MAX_PAGES: "120"
      KIND_K8S_DEBUG: "0"
      KIND_K8S_JOB_LOG_MAX_LINES: "2500"
      KIND_K8S_STREAM_PTY: "1"
      KIND_K8S_DOCKER_PULL_PLAIN: "1"
      KIND_K8S_JOB_API_LOG_MAX_LINES: "5000"
      KIND_K8S_JOBS_JSON: /work/clusters/kind_k8s_jobs.json
      KIND_K8S_README_PATH: /opt/kind-k8s/README.md
      KIND_K8S_WAIT_NODES: "1"
      KIND_K8S_WAIT_NODES_TIMEOUT_SEC: "300"
      KIND_K8S_HELM_TIMEOUT_SEC: "900"
      KIND_K8S_HELM_VERSIONS_CACHE_SEC: "600"
      KIND_K8S_HELM_VERSIONS_MAX: "80"
      KIND_K8S_CLUSTER_JOURNAL_MAX_ENTRIES: "500"
      KIND_K8S_CLUSTER_JOURNAL_MAX_LOG_LINES: "2000"
      KIND_K8S_HELM_ADDON_LOG_MAX_ENTRIES: "500"
      KIND_K8S_APP_TITLE: "Kind Clusters Dashboard"
      KIND_K8S_UVICORN_RELOAD: "0"
    working_dir: /opt/kind-k8s/app
    command: ["/opt/kind-k8s/run_uvicorn.sh"]