Что такое Klarity?
Klarity — это открытый дашборд корпоративного уровня для наблюдаемости (observability) Kubernetes, созданный для команд, работающих по принципам GitOps. Он обеспечивает полную видимость кластера: все ресурсы, метрики в реальном времени, потоковую передачу логов, веб-терминал, проброс портов и автоматическую интеграцию с GitOps — всё это в одном самодостаточном бинарном файле.
Большинство дашбордов позволяют редактировать ресурсы напрямую. Klarity намеренно не делает этого — потому что в правильном GitOps-процессе источник истины для кластера находится в Git, а не в веб-форме. Нажатие «редактировать» в дашборде обходит весь процесс проверки, аудита и конвейера.
| Klarity | Headlamp | k9s | |
|---|---|---|---|
🔒 Только чтение / GitOps-first |
✅ |
❌ |
❌ |
👥 Встроенное управление пользователями |
✅ |
❌ |
❌ |
🔄 Авто-обнаружение ArgoCD + Flux |
✅ Без настройки |
❌ |
❌ |
📋 Журнал аудита |
✅ |
❌ |
❌ |
🖥 Веб-терминал (kubectl exec) |
✅ |
✅ |
✅ |
🔌 Проброс портов через браузер |
✅ |
✅ |
❌ |
📌 Панель активностей (закреплённые сессии) |
✅ |
✅ |
❌ |
🌐 Веб-интерфейс (без установки) |
✅ |
✅ |
❌ CLI |
📦 Развёртывание как один бинарный файл |
✅ |
❌ |
✅ |
🔍 Авто-обнаружение 60+ типов ресурсов |
✅ |
✅ |
✅ |
Скриншоты
Обзор кластера
Метрики в реальном времени · Состояние рабочих нагрузок · Использование ресурсов узлов · Предупреждающие события
Поды — мониторинг ресурсов в реальном времени
CPU и память по каждому поду · Встроенные индикаторы прогресса · Экспорт в CSV · Фильтр по пространству имён
Топ потребителей ресурсов
Живые данные CPU и памяти по всем подам · Сортировка по CPU или памяти · Вид по пространствам имён
🚀 Быстрый старт
Вариант 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), поиском по ключевым словам, автопрокруткой и загрузкой |
Веб-терминал |
Полноценный |
Проброс портов |
SPDY HTTP-прокси туннель — прямой доступ к порту любого пода прямо в браузере |
Панель активностей |
Постоянная панель справа — закрепляйте потоки логов и терминалы, они продолжают работать при навигации |
Глобальный поиск |
|
🔄 Интеграция с 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 — вычислительно затратен для перебора |
Роли |
|
Блокировка аккаунта |
5 неудачных попыток → блокировка на 15 минут |
JWT-токены |
Токены доступа на 8 часов + refresh-токены на 7 дней |
Принудительная смена пароля |
Применяется при первом входе для учётных записей по умолчанию |
Постоянное хранилище |
Хранится в K8s Secret |
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, автоматически монтируется в |
Нулевая конфигурация, никаких секретов |
Локально / Docker Compose |
|
Переключение кластера из выпадающего меню интерфейса |
📦 Руководство по установке
Предварительные требования
| Требование | Версия | Примечания |
|---|---|---|
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 |
|
|
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 | По умолчанию | Описание |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Порт HTTP-сервера |
|
|
|
Пространство имён, выбранное по умолчанию в интерфейсе |
|
|
|
Время жизни JWT-токена |
|
|
|
Максимальное число буферизованных строк лога на поток |
|
|
|
Включить интеграцию с metrics-server |
|
|
— |
URL OIDC-обнаружения |
|
|
— |
ID клиента OAuth2 |
🔌 Проброс портов
Прямой доступ к порту любого пода прямо в браузере — без kubectl:
-
Откройте раздел Operations → Port Forwarding в боковой панели
-
Нажмите New Port-Forward
-
Выберите пространство имён, под и удалённый порт
-
Перейдите по сгенерированному URL прокси
Klarity создаёт SPDY-туннель через Kubernetes API и предоставляет доступ к сервису через встроенный HTTP-реверс-прокси. Активные туннели отображают статус в реальном времени и прямые ссылки для браузера.
📌 Панель активностей
Панель активностей (Activities Panel) — это постоянный выдвижной блок справа, который сохраняет потоки логов и терминалы живыми во время навигации:
| Действие | Как |
|---|---|
Открыть поток логов |
Нажать 📄 в строке любого пода |
Открыть терминал |
Нажать 🖥 в строке любого пода |
Закрепить в Activities |
Вкладка Logs/Terminal → «Pin to Activities» |
Переключить панель |
Нажать «N active» в заголовке или |
Переключить сессии |
Панель вкладок в верхней части панели |
🌐 Мультикластерность
# Создать 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» — все остальные функции работают в штатном режиме.
⌨️ Горячие клавиши
Нажмите ? в любом месте, чтобы открыть полную справку по горячим клавишам.
| Сочетание | Действие | Сочетание | Действие |
|---|---|---|---|
|
Глобальный поиск |
|
Справка по горячим клавишам |
|
Обзор |
|
Поды |
|
Деплойменты |
|
StatefulSets |
|
Сервисы |
|
Ingresses |
|
Пространства имён |
|
Узлы |
|
События |
|
Журнал аудита |
|
Идентификация |
|
Отчёт о здоровье |
|
Закрыть модальное окно |
🔒 Безопасность
| Контроль | Подробности |
|---|---|
Контейнер без root |
Запускается от UID 1000 — никогда не от root |
Файловая система только для чтения |
|
Capabilities |
|
Профиль seccomp |
|
Маскировка секретов |
Значения 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+ |
|
Node.js |
22+ |
|
Docker |
Любая |
|
kind |
Любая |
Запуск локально
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 |
⚡ Экспериментально |
📚 Документация
| Документ | Описание |
|---|---|
Техническое погружение — поток данных, дизайн компонентов, принятые решения |
|
Полное руководство по развёртыванию — Helm, kubectl, OIDC, мультикластер |
|
Учётные записи, роли, политика паролей, справочник API |
|
Планируемые функции — Prometheus, Gateway API, Projects |
|
Как участвовать в разработке — PR, issues, руководство разработчика |
|
Политика безопасности и процесс раскрытия уязвимостей |
|
Полная история релизов |
🤝 Участие в разработке
Вклад в проект приветствуется! Перед отправкой 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.