Любой «более простой» инструмент DevOps — это просто Kubernetes в темных очках.
Я — Саша Краснов, СТО «Штурвала». Недавно я наткнулся на волшебную статью о Kubernetes, и просто не смог справиться с желанием перевести ее. Мой собственный опыт знакомства с Kubernetes был другим, но путь был похожим: от отрицания и «зачем же так сложно» до восторга от элегантных решений в отдельных контроллерах. Даже архаичные винтажные части, вроде API группы “”, встречающиеся тут и там, больше не раздражают, а вызывают любопытство археолога. Кубер — он сложный, но это не просто так.

Мечта о простоте
Я помню тот день, когда пообещал себе, что больше никогда не буду работать с Kubernetes. Я видел, как модули зацикливались, узлы исчезали, а Helm-чарты плакали в YAML. Поэтому на этот раз я поклялся:
«Всего один контейнер».
Так всегда начинается, правда? Ты говоришь себе, что запустишь один образ Docker, будешь обслуживать одно крошечное приложение и на этом все, но потом одно превращается в два, а дальше все как в тумане… Тебе нужен балансировщик нагрузки, потом проверка работоспособности, и вот ты уже на полпути к перестройке Kubernetes.
Я называю это петлей отрицания в DevOps. Через это проходит каждый инженер:
Сначала вы отказываетесь от Kubernetes.
Затем вы изобретаете его заново.
Наконец, вы принимаете его. Как горе, но с YAML.
Что самое забавное? Дело даже не в Kubernetes, дело в нас.
Мы не можем устоять перед соблазном все усложнить, автоматизировать и «просто заставить это масштабироваться». Мы жаждем простоты, но при этом преклоняемся перед сложностью.
TL;DR: В 2025 году я попытался упростить развертывание. В итоге мне пришлось заново собирать Kubernetes. Это история о том, как я это осознал и наконец успокоился, приняв ситуацию.
Затишье перед кластером

Когда я впервые запустил docker run nginx, я почувствовал себя неудержимым.
Контейнер запустился как по волшебству. Никаких проблем с конфигурацией, никаких кричащих серверов, просто... рабочий код.
Это было как открыть для себя огонь — только без счетов за кислород.
Тогда мне понадобился второй контейнер. «Всего лишь еще один», — сказал я себе, улыбаясь, как новичок в первые десять минут фильма-катастрофы.
Поэтому я создал docker-compose.yml. Потом еще один, затем еще один для продакшена. Вскоре я уже смотрел больше на YAML, чем на код. Каждая строка казалась загадкой, которую нашептывало жуткое существо по имени «IndentationError».
Проверяем на практике

Предполагалось, что на этом все. Два контейнера, одна простая конфигурация, но потом появились переменные окружения, постоянные тома и проверки работоспособности — еще одна «фишка» DevOps.
Внезапно я бросился составлять карты портов, как картограф в XVII веке. Каждое изменение требовало перестройки, а каждый сбой заставлял меня сомневаться в правильности выбора жизненного пути.
Сначала я подумал, что мне просто кажется. Но у каждого разработчика, с которым я потом разговаривал, был такой же загнанный взгляд. Они шепотом рассказывали о монтируемых томах и циклических зависимостях, как ветераны войны делятся боевыми историями. И тогда я кое-что понял:
«Простота никогда не бывает простой, если вы заботитесь о безотказной работе».
Docker дал мне почувствовать вкус власти, и, как любой хороший разработчик, я тут же начал злоупотреблять ею. Следующий логичный шаг? Найти что-нибудь более простое. По крайней мере, я так думал…
Провал в погоне за простыми инструментами

После третьей ночи отладки перезапусков Docker Compose я сделал то, что делает каждый разработчик, когда заходит в тупик. Я погуглил «более простую альтернативу Kubernetes».
Это все равно что искать «низкокалорийную пиццу, которая при этом будет невероятно вкусной». Конечно, вы найдете варианты, но все они закончатся разочарованием и YAML.
Сначала я попался на удочку Fly.io. Их страница сладко нашептывала обещания:
«Глобальное развертывание с помощью одной команды. Красиво. Минималистично. Волшебно»
Итак, я запустил свое приложение. Затем в логах начали появляться загадочные сообщения вроде «проверка работоспособности не пройдена» и «образ недоступен в регионе FRA». Это было дежавю, только с более красивым интерфейсом.
Затем появилась Nomad — минималистичная альтернатива оркестрации от HashiCorp. Интерфейс командной строки был понятным. Документация была удобной. Через пять минут я уже определял файлы заданий, которые подозрительно снова напоминали YAML.

Я верил, что в этот раз все будет по-другому. Я сказал себе, что мне не нужен Kubernetes, и вот я уже настраиваю балансировщики нагрузки, реплики и секреты в «облегченном оркестраторе».
Вот о чем вам не расскажут: каждый «простой» инструмент для развертывания втайне мечтает стать Kubernetes, когда вырастет. Они начинаются с одного бинарного файла, а заканчиваются уровнем управления, CRD и сообществом в Slack, где спорят о контроллерах входящего трафика.
Это не их вина. Простота не масштабируется, а масштабирование нарушает простоту. Таков компромисс. Вы можете скрыть Kubernetes, но не можете его уничтожить.
Снова проверяем на практике
Kubernetes сложен не потому, что инженеры любят трудности. Он сложен, потому что продуктивные среды такие.
Итак, в своем благородном стремлении к минимализму я прошел полный круг. Каждый инструмент обещал спасение, и каждый выдавал YAML.
Тот момент, когда понимаешь, что снова сделал Kubernetes

Однажды вечером, когда я смотрел на свой терминал, меня осенило. У меня работали следующие сервисы: сетевой оверлей, управление секретами, автомасштабирование и проверка работоспособности. Тогда-то я и понял…
Я снова собрал Kubernetes.
Только хуже. Мой был скреплен скотчем с bash-скриптами, docker ps-командами и молитвой.
Сначала я смеялся, потом немного поплакал. Потому что в глубине души знал, что дело не в инструментах, а во мне. Я гнался за «простотой», как разработчик за идеальной светлой темой: ее не существует, но надежда вечна.
Я открыл свои настройки, чтобы посмотреть, что я «упростил».
Небольшой фрагмент описания места преступления:

Скажите мне, что это не Deployment YAML с накладными усами.
Это был Kubernetes. Просто притворялся независимым.

Я помню, как смотрел на свою архитектурную схему и шептал себе под нос:
«Вы либо умрете, будучи пользователем Docker, либо проживете достаточно долго, чтобы увидеть себя за поддержкой etcd».
Все инструменты, все абстракции — это просто разные диалекты одного и того же языка. Планирование. Сеть. Масштабирование. Как только вам понадобились все три составляющие, вы случайно «вызвали» Kubernetes.
Иллюзия простоты рухнула. От этого никуда не деться: ни в Fly.io, ни в Nomad, ни в Render. Все они стоят на плечах гигантов в форме YAML.
И в этот момент хаоса произошло нечто удивительное: я перестал злиться на Kubernetes. Потому что впервые понял, зачем он существует.
Принятие дзена Kubernetes
В жизни каждого разработчика наступает момент, когда гнев сменяется спокойствием. Ты перестаешь кричать на файлы YAML. Больше не притворяешься, что твоя docker-compose-настройка отличается от других. Закрываешь глаза, делаешь глубокий вдох и шепчешь:
«Возможно, Kubernetes — не враг».
Сначала я думал, что просветление означает удаление Kubernetes. Теперь я знаю, что просветление означает его понимание. Дело не в том, что система слишком сложна, а в том, что сложен мир, которому она служит. Распределенные приложения, поэтапные обновления, самовосстанавливающиеся кластеры… все это непросто. Так почему же я ожидал, что инструмент будет простым?
Это осознание обрушилось на меня, как звук от удара в гонг.

Я перестал с этим бороться. Я научился пользоваться помощниками, а не прятаться от них. Lens для визуализации кластеров. K9s для работы с логами. Portainer для управления хаосом без потери рассудка.
Я начал замечать элегантность в дизайне. Логику в безумии. Каждый контроллер, каждый модуль, каждый перезапуск — это тихая симфония, которая поддерживает работу приложений, пока я сплю. Конечно, он все еще ломается. Конечно, я все еще ругаюсь, когда сервис не работает. Но теперь я делаю это с любовью.
Когда я наконец обрел покой, я понял: дело было не в том, чтобы сбежать из Kubernetes. А в том, чтобы принять тот факт, что любая абстракция в конечном счете становится им.
В конце концов, мы не перерастаем кластер. Мы просто учимся дышать внутри него.
Заключение: бесконечный цикл DevOps
Забавно, что после всех этих инструментов, слез, YAML… я оказался там же, где и начинал, — сидел и пялился на кластер.
Но теперь это меня не пугает. Я вижу его таким, какой он есть: не чудовище, а просто зеркало. Каждая платформа, которую мы создаем, каждый фреймворк, который мы изобретаем, — это всего лишь мы, пытающиеся навести порядок в хаосе.
А Kubernetes? Это укротитель хаоса, на которого мы все втайне полагаемся. Раньше я думал, что его заменит «следующая большая вещь». Теперь я понимаю: даже инструменты, пытающиеся убить Kubernetes… работают на Kubernetes.
Ирония просто космическая.
Fly.io? На кластерах. Render? Под капотом то же самое. Даже инструменты для развертывания на базе ИИ догадываются, что управляет их инференс серверами. Да, Kubernetes.
Так что нет, мы не отказываемся от кластера. Мы просто оформляем его по-другому. Даем ему более дружелюбные названия, красивые панели управления и темную тему. Но он все еще там, работает в фоновом режиме, как сердце современной инфраструктуры, и это нормально. Потому что Kubernetes — это не то, что нам нужно победить, а то, с чем нужно научиться жить.

«В DevOps, как и в жизни, от сложностей никуда не деться. Нужно просто научиться их контейнеризировать».
Полезные ресурсы
Если вы хотите изучить инструменты и идеи, описанные в этой статье, или самостоятельно разобраться в Kubernetes, вот с чего можно начать:
Документация Kubernetes — официальная «кроличья нора».
K3s — облегченная версия Kubernetes для здравомыслящих людей.
Lens IDE — третий глаз вашего кластера.
Консольный интерфейс K9s — для приручения подов.
Portainer — наглядное управление контейнерами.
Блог CNCF — истории и новости сообщества.
r/devops — терапевтическая группа для выживших в кластере.
Российское kuber community — место, где всегда подскажут и помогут.
acmnu
Я бы сказал что у k8s сейчас две фундоментальные проблемы:
Он снизил комплексность запуска софта убрав слои операционной системы, сетевой топологии и ряда других особенностей сведя все к контейнерам. Но этого недостаточно. Поэтому так много решений: напишите приложение по этим правилам и мы его запустим в k8s одним действием.
Уже много лет (если не 10) k8s как бы застыл в развитии. Он остановился на половине дороги: сетевая подсистема не сдвинулась с мертвой точки: сделано сложно и при этом не то чтобы функционально. DNS и service discovery делают не благодоря k8s, а вопреки. YAML каша требует стороннего управления (Helm). Ну и безопасность... Какая еще безопасность?
Для комании которая разрабатывает свой софт есть рецепт счастья: взять фреймворк, который закроет работу с k8s или написать свои шаблоны, операторы и прочее. Т.е. надо использовать не k8s, а полноценную аппликейшен платформу.
Тем же кто только экслуатирует можно только сочувствовать.
jingvar
Нет, просто кубер как был маловнятным говном так и остался. Да я с ним живу. Но если продукты Энтерпрайз уровня предполагали хоть какое-то видение продукта и обвязки, тут постоянный взрыв на макаронной фабрике фигак и в продакшен, а простите альфу. Крэшлубеки, зависшие поды. А как же один под один контейнер - не смоглось? Обложилси инит, сайдкарами итд. Ой а чего кубернетеснейтив не смоглось в полный стейтлес бида и огорчение, нужно pvc. Ну и так далее. Вот поэтому девопс с опытом когда приходить в кубер, и выясняется что его нужно еще обложить кучей стандартного софта и задает вопрос, а кубер какой процент в общем решении занимает?