Замена Lens, которую целиком написала модель: что получилось и где мы проигрываем

Sextant — десктопный клиент Kubernetes на Rust и Tauri 2: всё, что вы делали в Lens, без аккаунта, сервера и телеметрии, плюс встроенный MCP-сервер для AI-агентов. Проект открытый (MIT или Apache-2.0), сборки есть для Linux, macOS и Windows.
Меня зовут Юрий Потемкин, я CTO в REES46 и 25 лет в IT. Kubernetes для меня — ежедневная работа: высоконагруженные системы на 120 тысяч запросов в секунду и несколько кластеров одновременно. Lens долго был открыт у меня с утра до вечера, и за это время накопилось три боли.
Первая боль — коммерция. Много лет Lens был инструментом по умолчанию: открыл kubeconfig — и видишь кластер. Потом он стал всё более коммерческим. В июле 2022 года Lens 6 ввёл активацию через Lens ID и подписки: бесплатная Lens Personal — только для личного использования, учёбы и компаний с выручкой или инвестициями меньше $10 млн, остальным — Lens Pro за $19,90 в месяц на пользователя (блог Mirantis). В декабре того же года из открытой OpenLens 6.3.0 убрали логи и терминал, оставив их только в коммерческом продукте (DEV Community).
Вторая боль — стабильность. Оговорюсь: дальше исключительно мой личный опыт. Ни для кого не секрет, что если оставить Lens на ночь с парой терминалов и открытыми логами, к утру компьютер, скорее всего, будет намертво висеть. Port-forward постоянно зависает, и замечаешь это, только когда сервис перестал отвечать. Похожие жалобы есть и в трекере проекта: высокое потребление памяти GPU-процессом OpenLens (#7227), зависания и медленный интерфейс после перехода на Lens 6 (#6265, #6248). Отчасти это цена Electron: вместе с приложением работает целый Chromium.
Третья — куда идёт развитие. Lens развивается: в версии 2026.10 появились разделы Flux, Argo CD и Cost Monitoring. Но всё больше нового уходит за подписку: кластеры AKS, EKS и GKE, расширения и их маркетплейс помечены PREMIUM, а в строке состояния висит напоминание о лицензии Lens Personal. В Sextant всё это бесплатно.
В Sextant это уже сделано:
Память под контролем. У терминала есть управление потоком: команда, которая заваливает вывод (хотя бы
yes), не съедает память окна, а Ctrl-C срабатывает за 0,1 с. Буфер логов ограничен по размеру, метрики закрытых панелей не копятся, а найденные проблемы с памятью лежат открыто в issues.Port-forward, который не виснет молча. Как и
kubectl port-forward, он открывает новый поток к поду на каждое соединение, раз в 2 секунды проверяет, жив ли под, и показывает ошибку, если под пропал. Forward на сервис сам переключается на другой готовый под.GitOps и новое в Kubernetes. Flux и Argo CD — полноценные разделы: sync, suspend/resume, diff для Argo CD и установка обоих из приложения. Есть Gateway API, cert-manager и right-sizing requests и limits по реальному потреблению. Учёт стоимости через OpenCost — в планах.
Есть форки вроде Freelens, есть Headlamp и k9s, но мне хотелось трёх вещей сразу:
Нативное приложение без Electron, которое не съедает память на десятке кластеров.
Никаких аккаунтов и телеметрии: kubeconfig остаётся на моём компьютере.
Безопасный способ дать AI-агенту (Claude Code, Cursor) доступ к кластеру — с правами на каждый кластер, подтверждением каждого изменения и журналом, а не через админский kubeconfig в песочнице агента.
Параллельно я много работаю с LLM и AI-агентами и решил проверить, как далеко можно зайти, если доверить ИИ весь код, но работать по-взрослому: с архитектурными решениями в ADR, ревью каждого изменения и тестами на настоящем кластере. Первый коммит Sextant появился 11 октября 2026 года, а версия 0.10 вышла 18 октября — за неделю 184 коммита и десять релизов.
Сразу два важных уточнения. Sextant бесплатный и таким останется: никаких платных тарифов, аккаунтов и «pro»-функций. И весь его код сгенерирован ИИ — Claude Code: человек ставит задачи, принимает архитектурные решения и делает ревью, а каждое изменение проходит многократное тестирование: больше 2800 тестов, e2e на настоящем кластере и CI на трёх ОС. Как это устроено, рассказываю в разделе «Весь код написала модель», а как мы пускаем ИИ в кластер — в разделе про MCP-сервер.
В статье — что умеет Sextant, как он устроен внутри и как мы сделали MCP-сервер, которому не страшно показать прод.
Что умеет
Открываете приложение — и видите все контексты из вашего kubeconfig; подключить можно несколько кластеров сразу.

Живые таблицы всех ресурсов, включая CRD: детали, редактор YAML, scale, restart, cordon, drain, запуск CronJob. Новые CRD появляются в боковой панели без переподключения. Командная палитра (Ctrl+K) — к любому объекту или странице с клавиатуры.
Логи, shell и проброс портов: логи с поиском, в том числе нескольких подов в одном потоке; shell в любом контейнере, debug-контейнеры, копирование файлов в контейнер и обратно; shell на ноде через временный привилегированный под, который удаляется при закрытии вкладки; локальный терминал с уже настроенным kubectl.
Проблемы и уведомления: всё, что сломано в кластере, на одной странице, и десктопные уведомления о новых проблемах (отключаются целиком, по виду, по кластеру или на час). История rollout с diff и откатом.
Понять кластер: right-sizing requests и limits по реальному потреблению, cert-manager и сроки всех TLS-сертификатов, карта связей объектов (и что сломает удаление), RBAC: кто что может. Gateway API с проверкой, куда попадёт запрос.
Безопасные изменения: dry-run на сервере и diff перед применением YAML и обновлением Helm-релиза, готовность к обновлению кластера (устаревшие API), Pod Security Standards и отчёты Trivy, обзор нескольких кластеров на одной странице.
Метрики из metrics-server и Prometheus (Prometheus находится сам), Helm-релизы и чарты.
GitOps: Flux и Argo CD — списки, sync, suspend/resume, diff для Argo CD; их можно установить из приложения из официальных манифестов, с предпросмотром. Всё идёт через Kubernetes API, без CLI
fluxиargocd.Облачные кластеры: EKS, GKE и AKS находятся через уже установленные
aws,gcloudиaz. Sextant пишет свой kubeconfig и никогда не трогает~/.kube/config.Расширения: свои страницы, панели, действия и колонки в изолированных фреймах, SDK и шаблон в репозитории.
MCP-сервер для Claude Code, Claude Desktop и Cursor — о нём отдельный раздел ниже.
На вашем языке: интерфейс на 13 языках, включая русский и украинский.
Почему Rust и Tauri 2 и как это устроено
Вся работа с кластером живёт в Rust, а React только рисует: так данные, секреты и проверки прав никогда не зависят от того, что происходит в веб-части. Tauri 2 даёт системный WebView вместо встроенного Chromium, а kube-rs — зрелый клиент Kubernetes.
Проект делится на три слоя:
sextant-core— библиотека на kube-rs: kubeconfig, discovery, watch, действия, логи, exec, port-forward, метрики, Helm, настройки, расширения. Она не зависит от Tauri, и это проверяет отдельный скрипт в CI. Внешние процессы (helm, облачные CLI) спрятаны за фичейdesktop.Слой Tauri — команды, состояние приложения, PTY для терминалов, MCP-сервер. Каждая подписка, стрим и сессия регистрируется в одном
AppState, поэтому закрытие кластера или окна гарантированно закрывает всё, что было открыто.React + TypeScript — интерфейс. Фичи подключаются автоматически из
src/features/<name>/index.tsи регистрируют страницы, секции деталей и действия в реестрах. Типы на границе генерируются из Rust через ts-rs, и CI падает, если они разошлись.

Интерфейс ходит в ядро через команды Tauri, а расширения и AI-агенты — только через общий Guard, где проверяются права, спрашивается подтверждение и пишется журнал.
Несколько решений, которые делают интерфейс быстрым на больших кластерах:
Стримы без потерь. Id стрима выбирает фронтенд и до старта создаёт для него канал Tauri (
Channel), поэтому первые данные не теряются. Каналы, а не события, — сознательно: событие Tauri доставляется исполнением скрипта со вшитым JSON, и пачка на сотни подов разбиралась WebKit как код. Крупные сообщения канала идут через IPC и разбираются как JSON: вместе с ограничением арен аллокатора это сократило рост памяти на 500 подах примерно на пятую часть. Первый снимок watch уходит сразу, дальше изменения идут пачками не чаще раза в 250 мс, логи — раз в 100 мс.Один discovery на кластер. Все, кто ждёт список видов ресурсов, получают один общий результат. Встроенные виды открываются вообще без discovery, а колонки CRD читаются лениво, по одному CRD. На фикстуре из 150 CRD и 500 подов тест требует, чтобы первые данные приходили за 2 секунды.
Изменения не повторяются. Клиент сам повторяет только чтения на 429/503/504 (до 3 раз и не дольше 5 секунд). Scale, delete или apply никогда не отправляются дважды: таймаут изменения не отменяет его на сервере, и честнее сказать об этом, чем повторить вслепую.
Секреты не утекают в UI. Значения Secret вырезаются ещё в ядре; целиком их можно получить только отдельной командой для одного ключа или для редактора. Ошибки kube-клиента проходят через фильтр, который вырезает секреты exec-плагинов.
MCP-сервер: как пустить AI-агента в кластер и не пожалеть
Агент получает не kubeconfig, а 29 инструментов Sextant, и каждый их вызов проходит через правила кластера, подтверждение в окне и журнал. Обычный путь — дать агенту kubectl с вашим kubeconfig — означает, что он может всё, что можете вы, и вы узнаёте об этом после.

Подключение Claude Code — одна команда, её можно скопировать из настроек Sextant:
claude mcp add --transport http sextant http://127.0.0.1:47391/mcp --header "Authorization: Bearer <токен>"Для Claude Desktop есть stdio-мост sextant mcp: он сам читает порт и токен, поэтому в конфиге Claude Desktop токена нет.
Что защищает кластер:
Всё закрыто по умолчанию. Сервер выключен, пока вы его не включите, а доступ к каждому кластеру — Off, пока вы не выберете набор: Read-only, Read + write (без удаления), Full или Custom.
Правила на кластер. В Custom каждое правило — это неймспейсы × виды ресурсов × действия (чтение, изменение, удаление, логи, exec, port-forward) плюс флажок «спрашивать перед запуском». Значения секретов — отдельное действие, его не даёт ни один набор. Незнакомое поле в правилах читается как Off, а не игнорируется.
Проверка прямо перед действием. Права сверяются не в начале вызова, а перед каждым побочным эффектом, со свежими настройками. Инструмент, который трогает несколько объектов, проверяет все до первого запроса.
applyпроверяется на тех же распарсенных документах, которые затем применяются, — второго парсинга YAML, на котором можно обмануть проверку, нет.Неймспейс не обманешь. Для вида без неймспейса неймспейс всегда считается пустым, что бы ни прислал агент. Иначе правило «team-a × все виды × Delete» позволило бы удалить Node.
Подтверждение в окне. Диалог показывает агента, кластер, действие, цель и детали. Нет ответа за 120 секунд — отказ; нет окна — тоже отказ.
Журнал активности. Последние 2000 вызовов: кто, что, где, решение, результат. Только краткие сводки: значения секретов, YAML и вывод команд туда не попадают.
Сеть и токен. Сервер слушает только
127.0.0.1. Запрос с заголовкомOrigin, чужимHost, неверным Bearer или телом больше 4 МБ отклоняется до MCP-слоя — это защита от сайтов в браузере и DNS rebinding. Токен лежит в файле с правами 0600 и никогда не пишется в логи и журнал.Что агенту нельзя совсем. Shell на ноде, exec и изменение служебных подов node-shell, port-forward к подам с
hostNetwork. При остановке сервера все его вызовы отменяются, а проброшенные агентом порты закрываются.
Так агент может сам разбираться в логах и событиях упавшего деплоя, а решение «рестартнуть» или «отмасштабировать» остаётся за человеком.
Расширения в песочнице
Расширение в Sextant — это веб-страница в изолированном iframe, которая достаёт до кластера только через проверяемые в Rust вызовы. Оно может добавить страницу, секцию в деталях ресурса, действие, колонку таблицы, вкладку в нижней панели или секцию настроек.
Принцип простой: iframe считается недоверенным, поэтому все решения принимаются снаружи:
Изоляция. В
sandboxфрейма никогда нетallow-same-origin, файлы отдаёт своя схемаsextant-ext:. CSP собирается на каждый ответ из адреса расширения и не использует'self': у фрейма непрозрачный origin, а на Windows все расширения делят один origin.Права проверяет Rust. Каждый вызов сверяется с тем, что пользователь разрешил при установке: чтение, изменение, удаление, логи, значения секретов — по конкретным контекстам. Изменения проходят через тот же диалог подтверждения и журнал, что и у агентов; не больше 4 ожидающих подтверждений на расширение, чтобы оно не засыпало диалогами.
Протокол с привязкой к документу. Каждое сообщение
postMessageнесёт версию протокола и случайный id документа; чужие сообщения игнорируются. Лимиты: 32 watch на документ и 8 документов на фрейм.
Для авторов есть SDK с шаблоном и примерами (простая страница и просмотр CRD). Сборка упаковывает проект в файл .sextant-ext; установить его можно из файла, по ссылке на GitHub Release или из папки — в последнем случае Sextant сам перезагружает расширение при изменении файлов.
Весь код написала модель
Ни одной строки Sextant не написано руками: около 165 тысяч строк на Rust и TypeScript вместе с тестами сгенерировал Claude Code. Для меня это главный результат эксперимента и хорошая демонстрация того, на что способны современные модели.
Как распределена работа:
Человек формулирует требования, принимает архитектурные решения, делает ревью и решает, что выпускать.
Модель пишет код и тесты, ведёт документацию, гоняет проверки и чинит то, что сломалось.
Память проекта записана так, чтобы её читала и модель: файл с соглашениями для агентов и 78 ADR с причинами решений. Новая сессия начинает не с нуля, а с истории решений.
Почему этому можно доверять: каждое изменение проходит тесты на Rust и TypeScript, сверку типов на границе Rust/TS, интеграционные тесты и e2e на настоящем kind-кластере, CI на Linux, macOS и Windows. Ошибки случаются — и находятся тем же процессом: проблемы с памятью из следующего раздела нашли замеры, а не пользователи.
И скорость: та самая неделя от первого коммита до версии 0.10. Современные модели уже умеют вести большой проект на нескольких языках, если дать им чёткие требования, записанные решения и строгие проверки. Но без человека, который понимает предметную область и отвечает за решения, такого результата не было бы.
Цифры и тесты
Мы сравнили Sextant 0.11.1 с Freelens 1.10.3 — открытым форком Lens на том же Electron — и с самим Lens 2026.10 на бесплатной лицензии Lens Personal. Одна машина (Linux, 16 ядер, 27 ГБ), один kind-кластер, у каждого приложения отдельный профиль, окно 1280×800, своп не задействован; во всех трёх открыт список подов всех неймспейсов.
Замер | Sextant 0.11.1 | Freelens 1.10.3 | Lens 2026.10 |
|---|---|---|---|
Старт до появления окна, с | 0,6–0,7 | 3,4–4,7 | 2,4 |
Память: список подов, 44 пода, МБ | 326 | 649 | 862 |
Память: 544 пода и 150 CRD, МБ | 376 | 672 | 877 |
Память — сумма PSS по всем процессам приложения: у Sextant это ядро на Rust и процессы WebKit, у Freelens и Lens — процессы Electron. Старт — тёплый запуск до появления окна: у Sextant и Freelens по три замера, у Lens один.
Где мы проигрываем. На 500 подах Sextant прибавляет больше остальных: +50 МБ против +23 у Freelens и +15 у Lens. В 0.11.1 мы уже сократили этот рост примерно на пятую часть (у 0.11.0 в тех же условиях было +63 МБ): потоки данных идут через каналы Tauri вместо событий, а аллокатор glibc ограничен двумя аренами. Разбор продолжается открыто (issue #170).
О памяти мы не только говорим, но и мерим: аудит перед v0.7.0 закрыл утечку в кэше метрик, добавил лимиты на буфер логов и управление потоком в терминале. То, что ещё не решено, открыто лежит в issues: например, WebKit не возвращает системе память после пиковой нагрузки.
Тесты (на версии 0.11.1):
990 тестов на Rust, 1630 на vitest и 226 для SDK; юнит-тесты ядра ходят в фейковый API-сервер, без кластера.
Интеграционные тесты ядра и GitOps — против настоящего кластера kind с Prometheus, Flux и Argo CD.
E2E на WebdriverIO и tauri-driver гоняют настоящее приложение: подключение, логи, shell, port-forward, редактирование YAML, scale, Helm. На той же инфраструктуре записаны GIF из этой статьи.
CI собирает и тестирует проект на Linux, macOS и Windows; релиз публикуется, только когда собрались все платформы. Обновления приложения подписаны.
Как попробовать и что дальше
Скачайте установщик (.deb, .AppImage, .dmg или .msi) из последнего релиза — Sextant сам найдёт ваш kubeconfig. Установщики пока не подписаны сертификатами Apple и Microsoft, поэтому macOS и Windows предупредят при первом запуске; как это обойти, написано в инструкции по установке.
Планы на ближайшие версии (roadmap): 0.12 — разбор проблем (таймлайн изменений, автомасштабирование HPA, KEDA и Karpenter, гигиена кластера, проверка сетевой связности); 0.13 — сохранённые виды, рабочие пространства и управление kubeconfig; 0.14 — редактор YAML по схеме кластера, хранилища и Velero, стоимость через OpenCost; 0.15 — service mesh, сравнение объектов между кластерами и очень большие кластеры. Подпись установщиков — тоже в планах.
Чем можно помочь проекту:
Попробовать на своих кластерах и завести issue, если что-то сломалось — особенно интересны большие кластеры и необычные схемы аутентификации.
Подключить своего агента через MCP и рассказать, каких инструментов или правил не хватает.
Написать расширение для ваших CRD и показать его в Show and tell.
Поставить звезду на GitHub, чтобы проект увидели другие.
Документация — в вики, вопросы — в Discussions. Критика в комментариях приветствуется.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.