Kubernetes в браузере: инженер ngrok портировал все компоненты на TypeScript

Инженер ngrok Сэм Роз (Sam Rose) ровно за 2 месяца портировал существенную часть функциональности Kubernetes в TypeScript для запуска в браузере. Проект webernetes генерирует интерактивный кластер Kubernetes прямо в браузере пользователя, реализуя жизненные циклы подов, кластерную DNS и сеть, сборку мусора контейнеров, выделение IP, отслеживание Deployment и ReplicaSet. Визуализация показывает синие точки, поды, отправляющие друг другу HTTP-запросы.
Вместо компиляции стандартного Kubernetes в WebAssembly (что заняло бы мегабайты из-за зависимостей Go), Роз переписал код вручную с помощью LLM. Получилось всего 140 КБ (gzipped) против 540 КБ для простого «hello world» из Go. Проект не требует реальных Docker-образов, у него своя браузерная регистрия изображений на TypeScript API.
Критическая часть работы, проверка. Роз признаёт, что LLM-ы плохо портируют код, и просто пожимал плечами при типичных ошибках (неправильные типы, путаница с методами). Вместо слепого доверия он:
- Вручную сравнил большую часть кода со строками из оригинального Kubernetes на Go и проверил их идентичность.
- Написал 204 интеграционных теста и 1855 unit-тестов, которые одновременно запускаются как против реального k3s кластера, так и против webernetes, гарантируя функциональность даже при разных runtime окружениях.
Код содержит пользовательский браузерный контейнерный runtime, реализацию каналов, мьютексов и Go-select из JavaScript. Тесты создаются для каждой найденной ошибки (feedback loop) и поиска edge-cases.
Проект рассчитан на создателей обучающего контента про Kubernetes, не на production. Роз планирует развивать функциональность по мере необходимости для своих будущих материалов. Наибольшей проблемой стала работа с LLM на ответственных участках: требовалась человеческая проверка каждого сгенерированного куска, особенно тестов, чтобы убедиться, что LLM понял критерии успеха.
Ключевые факты
- Инженер ngrok создал webernetes, Kubernetes, работающий в браузере на TypeScript, за 2 месяца; 100 тысяч строк в 629 файлах.
- Вместо WebAssembly использована переписка кода вручную с помощью LLM; размер всего 140 КБ gzipped против мегабайтов для обычного Go-бинарника.
- Реализованы pod lifecycles, cluster DNS, networking, garbage collection, IP allocation, Deployment/ReplicaSet tracking, интерактивно работает в браузере.
- Критическая проверка: 204 интеграционных теста + 1855 unit-тестов одновременно запускаются против реального k3s и webernetes для гарантии идентичности поведения.
- Проект требовал ручной проверки каждого LLM-сгенерированного куска; LLM-ы плохи в портировании кода, но хороши в скорости, если есть тесты и reviews.
Почему это важно
Kubernetes доминирует в контейнеризации, но учить его сложно без рабочего кластера. Webernetes позволяет преподавателям создавать интерактивный обучающий контент прямо в браузере, где пользователи видят, как взаимодействуют поды и как работает сеть кластера. Это снижает барьер входа: никаких локальных кластеров, никаких Docker, просто браузер.
Кому это важно
Создателям обучающего контента про Kubernetes (блогеры, инструкторы, авторы интерактивных туториалов), а также разработчикам, которые хотят экспериментировать с концепциями Kubernetes без локальной инфраструктуры. Не для production; для демонстраций и обучения.
Как это применить
Установить webernetes как NPM-пакет (@ngrok/webernetes), определить образы через TypeScript API (класс, наследующий BaseImage с методом exec), развернуть через стандартный Kubernetes YAML (Deployment, ReplicaSet), затем взаимодействовать через kubernetes-client API (listNamespacedPod, createNamespacedPod, watch, fetch между подами). Демо работает в реальном браузере на странице блога ngrok.
Можно ли доверять
Проект полностью покрыт тестами (204 интеграционных, 1855 unit-тестов), которые гарантируют идентичность поведения с реальным k3s. Код непосредственно портирован из официального Kubernetes Go-кода и вручную проверен. Автор честно признаёт LLM-зависимость и делает упор на проверку, а не на «это LLM, так что работает». Поддержка будет расширяться по мере использования; неподдерживаемых функций (ConfigMaps, Secrets, volumes) можно запросить в issues.
Риски и подводные камни
Webernetes не поддерживает ConfigMaps, Secrets, pod resources, persistent volumes и другие возможности реального Kubernetes, по мере надобности. Браузерная среда всё ещё отличается от реальной: нет настоящего scheduler, нет RBAC, нет hooks жизненного цикла. Как инструмент обучения, а не production-системы, может неправильно обучить некоторым аспектам реальной работы кластера. LLM-сгенерированный код требует человеческой бдительности, слепое доверие к LLM приводит к bugs.
«Когда я получал PR от людей в старые добрые времена, я ожидал хорошие тесты и хороший код. У меня такие же ожидания от LLM. Разница в 2026 году в том, что хотя я обычно доверял своим человеческим коллегам хорошей работе, я совершенно спокойно полагаю, что LLM этого не сделает. Нужно проверять его вывод, и нужно требовать тесты.»
— Сэм Роз (Sam Rose), инженер ngrok