Klarity: GitOps-дашборд для Kubernetes только на чтение

Что такое Klarity?

Klarity — это открытый дашборд корпоративного уровня для наблюдаемости (observability) Kubernetes, созданный для команд, работающих по принципам GitOps. Он обеспечивает полную видимость кластера: все ресурсы, метрики в реальном времени, потоковую передачу логов, веб-терминал, проброс портов и автоматическую интеграцию с GitOps — всё это в одном самодостаточном бинарном файле.

Большинство дашбордов позволяют редактировать ресурсы напрямую. Klarity намеренно не делает этого — потому что в правильном GitOps-процессе источник истины для кластера находится в Git, а не в веб-форме. Нажатие «редактировать» в дашборде обходит весь процесс проверки, аудита и конвейера.

Klarity Headlamp k9s

🔒 Только чтение / GitOps-first

✅

❌

❌

👥 Встроенное управление пользователями

✅

❌

❌

🔄 Авто-обнаружение ArgoCD + Flux

✅ Без настройки

❌

❌

📋 Журнал аудита

✅

❌

❌

🖥 Веб-терминал (kubectl exec)

✅

✅

✅

🔌 Проброс портов через браузер

✅

✅

❌

📌 Панель активностей (закреплённые сессии)

✅

✅

❌

🌐 Веб-интерфейс (без установки)

✅

✅

❌ CLI

📦 Развёртывание как один бинарный файл

✅

❌

✅

🔍 Авто-обнаружение 60+ типов ресурсов

✅

✅

✅

Скриншоты

Обзор кластера

Метрики в реальном времени · Состояние рабочих нагрузок · Использование ресурсов узлов · Предупреждающие события

Обзор кластера Klarity с метриками и состоянием рабочих нагрузок

Поды — мониторинг ресурсов в реальном времени

CPU и память по каждому поду · Встроенные индикаторы прогресса · Экспорт в CSV · Фильтр по пространству имён

Список подов Klarity с мониторингом CPU и памяти

Топ потребителей ресурсов

Живые данные CPU и памяти по всем подам · Сортировка по CPU или памяти · Вид по пространствам имён

Klarity — топ потребителей ресурсов кластера
Страница настроек Klarity — авто-обновление, размер страницы, часовой пояс
Страница входа в Klarity — внутренняя аутентификация, токен K8s, OIDC/SSO

🚀 Быстрый старт

Вариант 1 — Helm (рекомендуется)

# Добавить репозиторий Helm
helm repo add klarity https://selvarajmurugesan90.github.io/klarity
helm repo update

# Установить
helm upgrade --install klarity klarity/klarity \
  --namespace klarity \
  --create-namespace \
  --set config.authMode=internal

# Получить доступ
kubectl port-forward svc/klarity 8080:8080 -n klarity

Откройте http://localhost:8080 — Данные по умолчанию: admin / admin@123 (требуется смена при первом входе)

Вариант 2 — kubectl / Kustomize (30 секунд)

kubectl apply -k https://github.com/selvarajmurugesan90/klarity/deploy/manifests
kubectl port-forward svc/klarity 8080:8080 -n klarity

Вариант 3 — Docker Compose (локальная разработка)

git clone https://github.com/selvarajmurugesan90/klarity
cd klarity
docker compose up

Откройте http://localhost:8080 — используется ~/.kube/config, аутентификация не требуется.

✨ Возможности

🔍 Полное авто-обнаружение — 60+ типов ресурсов

При запуске Klarity обращается к GET /apis и составляет карту всех групп API, версий и типов ресурсов в кластере — включая все установленные CRD. Никакой конфигурации. Никаких плагинов. Если в кластере установлены Istio, ArgoCD, Cert-Manager или любой другой оператор, все их пользовательские ресурсы появятся автоматически.

Категория Ресурсы

Рабочие нагрузки

Pods · Deployments · StatefulSets · DaemonSets · ReplicaSets · Jobs · CronJobs · ReplicationControllers

Сеть

Services · Ingresses · NetworkPolicies · Endpoints · EndpointSlices · IngressClasses

Хранилище

PersistentVolumes · PVClaims · StorageClasses · VolumeAttachments · CSIDrivers · CSINodes

Конфигурация

ConfigMaps · Secrets (с маскировкой) · ServiceAccounts · ResourceQuotas · LimitRanges

Управление доступом

Roles · ClusterRoles · RoleBindings · ClusterRoleBindings

Политики

HPAs · PodDisruptionBudgets · PriorityClasses · RuntimeClasses

Admission

MutatingWebhookConfigurations · ValidatingWebhookConfigurations

Сертификаты

CertificateSigningRequests

Координация

Leases

Управление потоком

FlowSchemas · PriorityLevelConfigurations

Пользовательские ресурсы

Все установленные CRD — Istio, ArgoCD, Cert-Manager, Prometheus Operator и др.

Кластер

Nodes · Namespaces · Events · ComponentStatuses

🛠 Инструменты диагностики

Инструмент Описание

Потоковая передача логов

Логи в реальном времени через WebSocket с фильтром по серьёзности (ERROR/WARN/INFO/DEBUG), поиском по ключевым словам, автопрокруткой и загрузкой

Веб-терминал

Полноценный kubectl exec через xterm.js — с авто-переподключением, без необходимости устанавливать kubectl локально

Проброс портов

SPDY HTTP-прокси туннель — прямой доступ к порту любого пода прямо в браузере

Панель активностей

Постоянная панель справа — закрепляйте потоки логов и терминалы, они продолжают работать при навигации

Глобальный поиск

Ctrl+K — одновременный поиск по 10 типам ресурсов с мгновенным результатом

🔄 Интеграция с GitOps — без настройки

Klarity автоматически обнаруживает GitOps-инструменты, сканируя CRD кластера. Раздел GitOps в боковой панели появляется сразу после установки ArgoCD или Flux CD — никакой дополнительной настройки не нужно.

ArgoCD:

  • Приложения со статусом синхронизации (Synced / OutOfSync)

  • Статус здоровья (Healthy / Degraded / Progressing)

  • Исходный репозиторий, целевой путь, текущая ревизия

  • ApplicationSets и AppProjects

Flux CD:

  • Kustomizations со статусом готовности и временем последней сверки

  • HelmReleases с именем и версией чарта

  • GitRepositories, HelmRepositories, OCIRepositories

  • Уведомления и получатели (Notification alerts and receivers)

📊 Наблюдаемость в реальном времени

  • Живые метрики — CPU и память через metrics-server с визуальными индикаторами прогресса по каждому узлу и контейнеру

  • Топ потребителей — сортировка всех подов или пространств имён по CPU или памяти

  • Метрики на уровне контейнеров — детальная разбивка по контейнерам на странице деталей пода

  • Круговые индикаторы узлов — визуальные кольца CPU/памяти на странице деталей узла

  • Сводка по пространствам имён — совокупное использование ресурсов по каждому пространству имён

  • Отчёт о здоровье кластера — загружаемый самодостаточный HTML-снимок для целей соответствия требованиям или совместного использования

  • События — события Kubernetes в реальном времени с фильтром Warning/Normal и диапазоном времени

🔐 Корпоративное управление пользователями

Klarity включает полноценную, готовую к продуктиву систему внутренней аутентификации — внешний провайдер идентификации не требуется.

Возможность Подробности

Хеширование паролей

bcrypt, стоимость 12 — вычислительно затратен для перебора

Роли

admin · editor · viewer — детализированные уровни прав

Блокировка аккаунта

5 неудачных попыток → блокировка на 15 минут

JWT-токены

Токены доступа на 8 часов + refresh-токены на 7 дней

Принудительная смена пароля

Применяется при первом входе для учётных записей по умолчанию

Постоянное хранилище

Хранится в K8s Secret klarity-users — переживает все перезапуски

OIDC / SSO

Google · GitHub · GitLab · Okta · Auth0 · Keycloak · Azure AD · Dex

🔑 Права по ролям

Право admin editor viewer

Чтение всех ресурсов

✅

✅

✅

Потоковые логи и терминал

✅

✅

✅

Проброс портов

✅

✅

✅

Перезапуск деплойментов

✅

✅

❌

Запуск CronJob

✅

✅

❌

Cordon / drain узлов

✅

❌

❌

Управление пользователями

✅

❌

❌

🏗 Архитектура

flowchart TD
    classDef clientCls   fill:#0c2140,stroke:#60a5fa,stroke-width:2px,color:#93c5fd
    classDef mwareCls    fill:#1a1040,stroke:#818cf8,stroke-width:2px,color:#c4b5fd
    classDef handlerCls  fill:#160830,stroke:#a78bfa,stroke-width:1.5px,color:#ddd6fe
    classDef realtimeCls fill:#08192e,stroke:#38bdf8,stroke-width:1.5px,color:#7dd3fc
    classDef authCls     fill:#1a0825,stroke:#e879f9,stroke-width:2px,color:#f5d0fe
    classDef kcmCls      fill:#041820,stroke:#22d3ee,stroke-width:3px,color:#a5f3fc
    classDef k8sCls      fill:#021c10,stroke:#4ade80,stroke-width:2px,color:#86efac

    subgraph L1["🌐  Layer 1 — Browser Client"]
        direction LR
        C1["React 18 · TypeScript · Vite\nTailwind CSS · Lucide Icons"]:::clientCls
        C2["TanStack Query v5\nZustand (persist + JWT rehydrate)"]:::clientCls
        C3["xterm.js Terminal\nMonaco YAML Viewer · Recharts"]:::clientCls
    end

    subgraph L2["🛡️  Layer 2 — Middleware Pipeline"]
        direction LR
        MW1["🔐 Auth Middleware\nJWT · OIDC · K8s Token · None"]:::mwareCls
        MW2["📋 Audit Middleware\n2 000-event in-memory ring buffer"]:::mwareCls
        MW3["🔀 CORS  ·  🗜 Gzip\nRequest logging · Panic recovery"]:::mwareCls
    end

    subgraph L3["📦  Layer 3 — Resource Handlers  (~150 routes)"]
        direction LR
        H1["Workloads\nPod · Deployment\nStatefulSet · DaemonSet\nJob · CronJob · ReplicaSet"]:::handlerCls
        H2["Networking\nService · Ingress\nNetworkPolicy\nEndpoints · IngressClass"]:::handlerCls
        H3["Storage\nPersistentVolume · PVC\nStorageClass · CSI\nVolumeAttachment"]:::handlerCls
        H4["Config & Access\nConfigMap · Secret\nServiceAccount\nRBAC Roles & Bindings"]:::handlerCls
        H5["GitOps\nArgoCD Apps · AppSets\nFlux Kustomizations\nHelmReleases · GitRepos"]:::handlerCls
        H6["Operations\nGlobal Search  Ctrl+K\nAudit · Events · Health Report\nTop Consumers · Port-Forward"]:::handlerCls
    end

    subgraph L3B["⚡  Layer 3 — Real-time Layer  (WebSocket + SPDY)"]
        direction LR
        RT1["Log Streaming\nWebSocket · Severity filter\nKeyword search · Download\nAuto-scroll toggle"]:::realtimeCls
        RT2["Web Terminal\nkubectl exec via xterm.js\nConnecting · Reconnecting\nError state recovery"]:::realtimeCls
        RT3["Port-Forward Proxy\nSPDY tunnel via K8s API\nHTTP reverse proxy\nAny pod port in browser"]:::realtimeCls
    end

    subgraph AUTH["🔑  Auth Module"]
        direction TB
        A1["JWT Engine\n8h access token  ·  7d refresh\nRevocation support"]:::authCls
        A2["OIDC / OAuth2\nGoogle · GitHub · GitLab · Okta\nAzure AD · Keycloak · Auth0 · Dex"]:::authCls
        A3["Internal User Store\nK8s Secret  ·  bcrypt cost-12\n3 roles  ·  5-attempt lockout"]:::authCls
    end

    KCM["☸️  Kubernetes Client Manager\nclient-go  ·  dynamic client  ·  discovery API  ·  metrics.k8s.io\nCalls GET /apis on startup — auto-discovers 62+ resource types + all installed CRDs"]:::kcmCls

    subgraph L4["☸️  Layer 4 — Kubernetes Cluster"]
        direction LR
        K1["API Server\n62+ built-in resource types\n+ all installed CRDs"]:::k8sCls
        K2["metrics-server\nCPU · Memory\nper node and pod"]:::k8sCls
        K3["ArgoCD CRDs\nApplications · AppSets\nProjects  —  auto-detected"]:::k8sCls
        K4["Flux CD CRDs\nKustomizations · HelmReleases\nGitRepos  —  auto-detected"]:::k8sCls
    end

    L1  -->|"REST  /api/v1/*"| L2
    L1  -->|"WebSocket  /ws/logs  ·  /ws/exec"| L3B
    L2  -->|"authenticated request"| L3
    L2  <-->|"validate · issue · revoke"| AUTH
    L3  -->|"resource queries"| KCM
    L3B -->|"streams · exec · tunnel"| KCM
    KCM -->|"ServiceAccount token  (in-cluster)\nor  ~/.kube/config  (local)"| K1
    K1  --- K2 & K3 & K4
Развёртывание Метод аутентификации Примечания

В кластере (Helm / kubectl)

Токен ServiceAccount, автоматически монтируется в /var/run/secrets/kubernetes.io/serviceaccount/token

Нулевая конфигурация, никаких секретов

Локально / Docker Compose

~/.kube/config — загружаются все контексты

Переключение кластера из выпадающего меню интерфейса

📦 Руководство по установке

Предварительные требования

Требование Версия Примечания

Kubernetes

1.26+

Любой дистрибутив

kubectl

Любая

Нужен только для доступа через port-forward

Helm

3.x

Только для установки через Helm

metrics-server

Любая

Опционально — включает метрики CPU/памяти

Helm — внутренняя аутентификация (по умолчанию)

helm repo add klarity https://selvarajmurugesan90.github.io/klarity
helm repo update

helm upgrade --install klarity klarity/klarity \
  --namespace klarity \
  --create-namespace \
  --set config.authMode=internal

Учётные записи по умолчанию (смените при первом входе):

Имя пользователя Пароль Роль

admin

admin@123

Admin

viewer

viewer@123

Viewer

Helm — аутентификация по токену Kubernetes

helm upgrade --install klarity klarity/klarity \
  --namespace klarity --create-namespace \
  --set config.authMode=token

# Создать токен
kubectl create token klarity -n klarity --duration=8h

Helm — OIDC / SSO

# Сохранить client secret в K8s Secret
kubectl create secret generic oidc-secret \
  --from-literal=oidcClientSecret=<your-secret> \
  -n klarity

helm upgrade --install klarity klarity/klarity \
  --namespace klarity --create-namespace \
  --set config.authMode=oidc \
  --set config.oidc.issuerURL=https://accounts.google.com \
  --set config.oidc.clientID=klarity \
  --set config.oidc.redirectURL=https://klarity.example.com/callback \
  --set oidcClientSecretRef.name=oidc-secret

Поддерживаемые провайдеры: Google · GitHub · GitLab · Okta · Auth0 · Keycloak · Azure AD · Dex

Helm — продуктивные настройки

# production-values.yaml
replicaCount: 2

config:
  authMode: internal
  logLevel: info
  logFormat: json
  sessionTimeout: 8h

ingress:
  enabled: true
  className: nginx
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  hosts:
    - host: klarity.company.internal
      paths: [{path: /, pathType: Prefix}]
  tls:
    - secretName: klarity-tls
      hosts: [klarity.company.internal]

resources:
  requests: {cpu: 200m, memory: 256Mi}
  limits:   {cpu: 1000m, memory: 1Gi}

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 5

podDisruptionBudget:
  enabled: true
  minAvailable: 1
helm upgrade --install klarity klarity/klarity \
  --namespace klarity --create-namespace \
  -f production-values.yaml

kubectl / Kustomize

# Применить манифесты
kubectl apply -k https://github.com/selvarajmurugesan90/klarity/deploy/manifests

# Проверить
kubectl get all -n klarity

# Получить доступ
kubectl port-forward svc/klarity 8080:8080 -n klarity

⚙️ Справочник конфигурации

Переменная окружения Ключ Helm По умолчанию Описание

KD_AUTH_MODE

config.authMode

internal

internal · token · oidc · none

KD_LOG_LEVEL

config.logLevel

info

debug · info · warn · error

KD_LOG_FORMAT

config.logFormat

json

json · text

KD_SERVER_PORT

config.port

8080

Порт HTTP-сервера

KD_SERVER_DEFAULTNS

config.defaultNamespace

default

Пространство имён, выбранное по умолчанию в интерфейсе

KD_SERVER_SESSIONTIMEOUT

config.sessionTimeout

8h

Время жизни JWT-токена

KD_SERVER_MAXLOGLINES

config.maxLogLines

10000

Максимальное число буферизованных строк лога на поток

KD_SERVER_METRICSENABLED

config.metricsEnabled

true

Включить интеграцию с metrics-server

KD_AUTH_OIDC_ISSUERURL

config.oidc.issuerURL

—

URL OIDC-обнаружения

KD_AUTH_OIDC_CLIENTID

config.oidc.clientID

—

ID клиента OAuth2

🔌 Проброс портов

Прямой доступ к порту любого пода прямо в браузере — без kubectl:

  1. Откройте раздел Operations → Port Forwarding в боковой панели

  2. Нажмите New Port-Forward

  3. Выберите пространство имён, под и удалённый порт

  4. Перейдите по сгенерированному URL прокси

Klarity создаёт SPDY-туннель через Kubernetes API и предоставляет доступ к сервису через встроенный HTTP-реверс-прокси. Активные туннели отображают статус в реальном времени и прямые ссылки для браузера.

📌 Панель активностей

Панель активностей (Activities Panel) — это постоянный выдвижной блок справа, который сохраняет потоки логов и терминалы живыми во время навигации:

Действие Как

Открыть поток логов

Нажать 📄 в строке любого пода

Открыть терминал

Нажать 🖥 в строке любого пода

Закрепить в Activities

Вкладка Logs/Terminal → «Pin to Activities»

Переключить панель

Нажать «N active» в заголовке или g+a

Переключить сессии

Панель вкладок в верхней части панели

🌐 Мультикластерность

# Создать Secret с несколькими файлами kubeconfig
kubectl create secret generic multi-cluster \
  --from-file=production=~/.kube/prod.yaml \
  --from-file=staging=~/.kube/staging.yaml \
  -n klarity

# Указать в Helm
helm upgrade klarity klarity/klarity \
  --namespace klarity \
  --set existingMultiClusterSecret=multi-cluster

Переключайте кластеры через выпадающий список контекстов в верхней панели навигации в любой момент.

📈 Metrics Server

# Установить metrics-server
kubectl apply -f \
  https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# Для kind / minikube — патч для небезопасного TLS
kubectl patch deployment metrics-server -n kube-system \
  --type='json' \
  -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'

Если metrics-server не установлен, Klarity корректно показывает сообщение «metrics unavailable» — все остальные функции работают в штатном режиме.

⌨️ Горячие клавиши

Нажмите ? в любом месте, чтобы открыть полную справку по горячим клавишам.

Сочетание Действие Сочетание Действие

Ctrl+K

Глобальный поиск

?

Справка по горячим клавишам

g o

Обзор

g p

Поды

g d

Деплойменты

g s

StatefulSets

g v

Сервисы

g i

Ingresses

g n

Пространства имён

g N

Узлы

g e

События

g a

Журнал аудита

g I

Идентификация

g h

Отчёт о здоровье

Esc

Закрыть модальное окно

🔒 Безопасность

Контроль Подробности

Контейнер без root

Запускается от UID 1000 — никогда не от root

Файловая система только для чтения

readOnlyRootFilesystem: true

Capabilities

drop: [ALL] — без Linux-привилегий

Профиль seccomp

RuntimeDefault

Маскировка секретов

Значения Secret всегда отображаются как * в интерфейсе

Без серверного хранения токенов

Токены аутентификации существуют только в сессии браузера

Пароли bcrypt

Коэффициент стоимости 12 — вычислительно затратен для перебора

Блокировка аккаунта

5 неудачных попыток → блокировка на 15 минут

API только для чтения

Нет операций создания/редактирования/удаления ресурсов кластера

Stateless-сервер

Безопасно перезапускать в любой момент — никакого незавершённого состояния не теряется

Политика раскрытия уязвимостей описана в SECURITY.md.

🏠 Архитектура — структура проекта

klarity/
├── cmd/server/              # Точка входа приложения (main.go)
├── internal/
│   ├── api/
│   │   ├── handlers/        # 24 файла HTTP-обработчиков — по одному на группу ресурсов
│   │   ├── middleware/      # Auth, журналирование аудита, CORS, gzip
│   │   └── routes.go        # Все ~150 регистраций маршрутов
│   ├── assets/              # Встроенная сборка React (go:embed)
│   ├── auth/                # Хранилище пользователей, хеширование bcrypt, подпись/проверка JWT
│   ├── config/              # Загрузчик конфигурации Viper
│   └── k8s/                 # Менеджер Kubernetes-клиента + обнаружение
├── web/                     # Фронтенд React 18 (TypeScript + Vite)
│   └── src/
│       ├── components/      # Компоновка, общий UI, ActivityPanel, Terminal
│       ├── pages/           # 40+ страниц — по одной на тип ресурса
│       ├── lib/             # API-клиент, менеджер WebSocket, утилиты
│       └── store/           # Zustand-хранилища (auth, settings, activities)
├── helm/klarity/            # Helm-чарт (values.yaml + 10 шаблонов)
├── deploy/manifests/        # Чистый YAML + Kustomize overlay
├── docs/                    # Документация по архитектуре, развёртыванию, управлению пользователями
├── scripts/                 # Вспомогательные скрипты развёртывания
├── website/                 # Лендинг GitHub Pages
└── .github/workflows/       # CI · Release · GitHub Actions для Pages

🧪 Разработка

Предварительные требования

Инструмент Версия Установка

Go

1.22+

golang.org

Node.js

22+

nodejs.org

Docker

Любая

docker.com

kind

Любая

kind.sigs.k8s.io

Запуск локально

git clone https://github.com/selvarajmurugesan90/klarity
cd klarity
make dev
# Backend:  http://localhost:8080  (auth=none, использует ~/.kube/config)
# Frontend: http://localhost:3000  (горячая перезагрузка, проксируется на backend)

Команды сборки

make build           # Frontend + backend → bin/klarity
make docker-build    # Docker-образ → klarity:<version>
make helm-package    # Helm-чарт → dist/klarity-*.tgz
make test            # Тесты Go + тесты frontend
make lint            # golangci-lint + ESLint
make generate-manifests  # Helm template → dist/klarity.yaml

🌍 Совместимость

Kubernetes Статус

1.26 – 1.29

✅ Поддерживается

1.30 – 1.33

✅ Протестировано

1.34+

⚡ Должно работать

Платформа Статус

kind · minikube · k3s

✅ Протестировано

Amazon EKS

✅ Поддерживается

Google GKE

✅ Поддерживается

Azure AKS

✅ Поддерживается

OpenShift

⚡ Экспериментально

Rancher

⚡ Экспериментально

📚 Документация

Документ Описание

ARCHITECTURE.md

Техническое погружение — поток данных, дизайн компонентов, принятые решения

DEPLOYMENT.md

Полное руководство по развёртыванию — Helm, kubectl, OIDC, мультикластер

USER_MANAGEMENT.md

Учётные записи, роли, политика паролей, справочник API

ROADMAP.md

Планируемые функции — Prometheus, Gateway API, Projects

CONTRIBUTING.md

Как участвовать в разработке — PR, issues, руководство разработчика

SECURITY.md

Политика безопасности и процесс раскрытия уязвимостей

CHANGELOG.md

Полная история релизов

🤝 Участие в разработке

Вклад в проект приветствуется! Перед отправкой pull request, пожалуйста, ознакомьтесь с CONTRIBUTING.md.

# Fork → Clone → Branch → Change → Test → PR
git checkout -b feature/amazing-feature
make test && make lint
git push origin feature/amazing-feature
# Откройте Pull Request на GitHub

Сообщения об ошибках и запросы функций — в GitHub Issues.

📄 Лицензия

Copyright 2026 Klarity Contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Полный текст лицензии смотрите в LICENSE.

© 2026 meganuke