Обновить
16K+
202
Andrei Kvapil@kvaps

Суперпользователь

46,5
Рейтинг
313
Подписчики
Отправить сообщение

Ralph Wiggum простыми словами: цикл в Claude Code, который не останавливается

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели8.6K

Если вы в последнее время заглядывали в техно-Twitter, то наверняка видели, как люди обсуждают «Ralph Wiggum» так, будто это чит-код. Мемный нейминг делу не помогает, но идея вполне реальна: это официальный плагин для Claude Code, который превращает одиночный промпт в устойчивый цикл. Агент продолжает работать, исправляя собственные ошибки, пока действительно не дойдёт до финишной черты, которую вы задали.

В этом материале объясняется, что это за плагин, как он работает на пальцах, почему он привлекает столько внимания и как безопасно применять его в реальной работе — от рефакторинга легаси до покрытия тестами и greenfield-приложений.

Читать далее

Последний мейнтейнер

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели12K

Говорят, всё началось довольно скучно.

Сначала искусственный интеллект научился писать код. Потом научился писать его лучше большинства людей. А потом выяснилась вещь, которую отрасль почему-то проглядела на десятилетия вперёд: самый дорогой ресурс в open source — вовсе не разработка. Не ревью. И даже не CI, пожирающий бюджеты дата-центров. Самым дорогим оказалось то, на что никогда не хватало людей.

Поддержка.

Ответить на issue. Разобраться с чужим, наспех собранным pull request’ом. Обновить зависимость, из-за которой по ночам не спят сразу три континента. Переписать документацию, которую никто не любит писать и все ненавидят читать. Проверить, что новый релиз библиотеки не сломал совместимость у тех, кто поставил её ещё шесть лет назад и с тех пор ни разу не открывал.

Через пару лет почти у каждого серьёзного репозитория на GitHub появился собственный хранитель. Небольшая программа. Не слишком умная. Не слишком самостоятельная. Просто интеллект, навсегда закреплённый за одним конкретным проектом — как смотритель за маяком, который уже давно никому не светит, но всё ещё стоит.

У неё был доступ ко всему, что когда-либо происходило внутри проекта: к истории коммитов, к пайплайнам, к документации, к давно остывшим спорам в обсуждениях, к каждому релизу и каждому откату. Раз в несколько часов она просыпалась. Читала новые issues. Отвечала новичкам — терпеливо, по сто раз, одно и то же. Закрывала дубликаты. Подтягивала зависимости. Иногда предлагала маленький рефакторинг. Иногда исправляла опечатку в комментарии, которую до неё видели тысячи людей и никто не тронул. Иногда замечала свежий CVE и выкатывала патч раньше, чем об этом успевали написать в соцсетях.

Читать далее

Жизненный цикл объекта в Kubernetes: путь от kubectl apply до полного удаления

Уровень сложностиСложный
Время на прочтение24 мин
Охват и читатели6.9K

Привет. В предыдущих статьях этого цикла мы разбирали, как Kubernetes-объекты читаются (первая — informer и кэш в controller-runtime) и записываются (вторая — Server-Side Apply, patch’и, managedFields). Сегодня — про их жизненный цикл.

Между kubectl apply и появлением объекта в etcd проходит целая цепочка: admission chain, мутирующие и валидирующие вебхуки, schema-валидация, встроенные плагины. Между kubectl delete и реальным исчезновением объекта может пройти от миллисекунд до часов — в зависимости от того, какие на нём финализаторы и какая стратегия каскадного удаления выбрана. Механизм при этом универсален для любого ресурса: Pod, Deployment, ваш CRD — жизненный цикл у всех один.

В этой статье я постараюсь ответить, что происходит с объектом от его рождения до смерти. И отдельно поговорим про другое измерение — эволюцию его API-схемы.

Читать далее

Запись в Kubernetes: как контроллеры учились не перезаписывать друг друга

Уровень сложностиСложный
Время на прочтение24 мин
Охват и читатели7.9K

Привет. В прошлой статье мы в основном говорили про чтение — кэш в controller-runtime, informer’ы, Reflector, DeltaFIFO, почему r.Get в реконсайле не ходит в apiserver. Сегодня поговорим больше про запись.

Kubernetes по своей природе спроектирован так, что одним и тем же объектом могут управлять разные контроллеры — и это нормально. На один Deployment смотрят и deployment-controller (правит status), и HPA (правит spec.replicas), и admission-мутаторы (расставляют labels), и cert-manager (дописывает свои аннотации), и пользователь с kubectl apply. Каждый из них отвечает за свои поля и не лезет в чужие. И всё это работает.

Сегодня будем разбираться, какие механизмы в Kubernetes позволяют разным компонентам делить ответственность за части одного и того же объекта, не превращая запись в гонку — и как ими правильно пользоваться, когда оператор пишете вы сами. Добро пожаловать под кат.

Читать далее

Как на самом деле устроен кэш в controller-runtime, и почему ваш оператор не кладёт apiserver

Уровень сложностиСложный
Время на прочтение21 мин
Охват и читатели11K

Kubernetes давно стал повсеместной платформой, а написать к нему собственный оператор сегодня — задача нескольких часов. Стандартный путь — kubebuilder на основе controller-runtime: scaffold проекта, типы, реконсайлер. В типовых сценариях этого вполне достаточно. Но как только нагрузка растёт или поведение оператора начинает расходиться с ожиданиями, всплывает целый класс edge-кейсов, причина которых — непонимание того, как controller-runtime устроен внутри. Если вы пишете контроллеры для Kubernetes, этот материал поможет собрать целостную mental model и заранее избежать дорогих сюрпризов в проде.

В этой статье разберём внутреннее устройство controller-runtime и на его примере увидим, какие архитектурные решения лежат в основе самого Kubernetes. Начнём с того, как контроллеры читают объекты из Kubernetes API.

Есть распространённое заблуждение, что r.Get() в Reconcile ходит прямо в kube-apiserver, List() каждый раз смотрит «живую» картину мира, а после Update() можно сразу перечитать объект и увидеть свежее состояние. На практике всё наоборот: controller-runtime живёт на локальной копии данных через LIST+WATCH. Благодаря этому чтение в реконсайле обходится почти бесплатно и не нагружает control plane даже при сотнях вызовов в секунду — но ценой этой модели становится то, что оператор может внезапно съедать гигабайты памяти, делать скрытые O(n)-сканы и регулярно упираться в stale reads.

Статья рассчитана на тех, кто уже писал операторы на Go с использованием controller-runtime, но хочет собрать целостную mental model, а не жить с набором частных наблюдений. Фокус будет на практических последствиях для production-кластеров: память, трафик, консистентность чтения и поведение реконсайла.

Читать далее

Игровые серверы на Cozystack: первоапрельская нешутка

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели8.5K

Привет, Хабр! Мы — команда Cozystack, open-source платформы для построения облаков на своём железе. Хотим рассказать, почему мы решили целиться в направление игровых серверов и что из этого вышло.

Читать далее

Platformize It! Часть 2: Расширяем Kubernetes с помощью API Aggregation Layer

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели5K

В предыдущей части статьи мы разобрались, как построить платформу для развертывания управляемых приложений с единым API и UI. Сегодня мы сделаем следующий шаг — дополним стандартный API Kubernetes своим API-сервером для синхронизации состояния. Рассказываем по порядку, это сделать.

Читать далее

Platformize it! Часть 1: Платформенный подход, ядро современной платформы и API

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели5.3K

Я много лет мечтал построить свою облачную платформу — и если раньше я пытался реализовать эту мечту в рамках нескольких компаний и проектов, то в последние годы я запустил собственный проект, Cozystack. В своей статье я расскажу о нашем опыте и о том, как, на мой взгляд, стоит подходить к созданию современной инфраструктурной платформы, в основе которой — Kubernetes и Kubernetes API.

Я разберу платформенный подход: что такое платформы, как они работают, кому нужны и как построить свою. А также сравню разные архитектуры для платформ, расскажу, почему мы остановились именно на K8s как на ключевой технологии, и покажу, как мы собрали на его основе production-решение.

Читать далее

KubeVirt: мифы и реальность об оверхедах виртуализации в Kubernetes

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели7.9K

Когда заходит речь о запуске виртуальных машин в Kubernetes через KubeVirt, первый вопрос, который возникает у инженеров: «А какой там оверхед?» Давайте разберём этот вопрос детально, рассмотрев каждую подсистему отдельно: вычисления, хранилище и сеть.

Статья основана на обсуждении в профессиональном сообществе.

Читать далее

Flux-aio, Kubernetes mTLS и проблема курицы и яйца

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели7.3K

Мы тут в Cozystack в очередной раз решаем проблему курицы и яйца: как задеплоить CNI и kube-proxy через Flux, но при этом обеспечить работу самого flux без CNI и kube-proxy.

Сам Flux запустить без CNI и kube-proxy можно используя проект flux-aio (от создателя Flux), который запускает единый deployment со всеми контроллерами настроенными на коммуникацию друг с другом через localhost.

Специфика Cozystack заключается в том, что на каждый кластер мы деплоим внутри небольшой HTTP-сервер с Helm-чартами и другими ассетами используемыми в платформе. Flux эти чарты читает и устанавливает в систему.

Но вот как организовать доступ флюксу к внутреннему HTTP-серверу, запущенному как под внутри того же кластера?

Читать далее

Cozypkg: как мы упростили локальную разработку с Helm + Flux

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели4.6K

Привет! Я Андрей Квапил (или kvaps) и в этой статье я опишу наш путь организации доставки приложений в Kubernetes, объясню недостатки классического GitOps в локальной разработке и покажу, как новая утилита cozypkg решает эти проблемы. Материал рассчитан на разработчиков, знакомых с Helm и Flux.

У нас есть общий репозиторий — в нем мы описываем общую конфигурацию всех компонентов, а также темплейты для их деплоя. Для того чтобы максимально упростить процесс поддержки каждого из компонентов, мы следуем определенному процессу.В основе этого процесса лежит идея о том, что каждый компонент — это Helm-чарт.

Читать далее

Эволюция платформ виртуализации: как мы пришли к миру managed-сервисов и как сервис-провайдерам конкурировать с AWS

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели3.7K

Привет! Меня зовут Андрей Квапил (или kvaps). Я CEO в Ænix, и мы делаем Open Source-платформу и фреймворк Cozystack, с которым очень удобно строить облака.

В этой статье я проанализировал, как современные облачные подходы повлияли на инфраструктуру, какую роль стала играть виртуализация, кто такие «питомцы» и что происходит с локальными сервис-провайдерами.

Читать далее

Простой способ установки Talos Linux на любую машину и у любого провайдера

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели11K

Обычно Talos Linux предоставляется в виде набора готовых образов под различные системы. 

Стандартный метод установки предполагает, что вы возьмёте подготовленный образ под конкретное облако или гипервизор и просто создадите из него виртуальную машину. Если же говорить о физических серверах, то предполагается, что для загрузки образа Talos Linux и последующей установки вы будете использовать ISO или PXE.

К сожалению, это не работает, когда речь заходит о провайдерах, которые предоставляют преднастроенный сервер или виртуальную машину без возможности использовать кастомный образ или даже ISO для установки через KVM. В этом случае ваш выбор будет ограничен лишь теми дистрибутивами, которые предлагает облачный провайдер.

Читать далее

Как мы создавали динамический Kubernetes API server для API Aggregation Layer в Cozystack

Уровень сложностиСложный
Время на прочтение89 мин
Охват и читатели4.2K

Kubernetes действительно поражает своими могучими возможностями к расширению. Вы наверняка уже знаете про operator-паттерн, а также фреймворки kubebuilder и operator-sdk с помощью которых можно его реализовать. Если вкратце, то они позволяют расширять ваш Kubernetes через определение кастом-ресурсов (CRDs) и написание дополнительного контроллера, который будет выполнять вашу бизнес-логику для реконсиляции и управления этими ресурсами. Этот подход широко изучен, а в интернете можно найти огромное количество информации о том, как написать такой оператор.

Однако это не единственный метод расширения Kubernetes API. Так, для более сложных кейсов, например реализации императивной логики, сабресурсов и формирования ответов на лету, можно рассмотреть механизм API aggregation layer, который поддерживается в Kubernetes. В рамках aggregation layer можно разработать свой собственный extension API server и бесшовно интегрировать его в общий Kubernetes API.

В этой статье мы разберем, что такое API aggregation layer, для решения каких задач его стоит использовать, когда его использовать не стоит и как мы использовали эту модель для реализации собственного extension API server в платформе Cozystack

Читать далее

FreeIPA tips & tricks: перенос FreeIPA из LXC-контейнера CentOS 7 в Rocky Linux, дебаг и истекшие сертификаты

Время на прочтение8 мин
Охват и читатели5K

Недавно мне довелось обновлять старую FreeIPA в большой компании. Эта FreeIPA была установлена в LXC-контейнере на CentOS 7 и находилась в нерабочем состоянии уже несколько месяцев. Мне передали бэкап LXC-контейнера для Proxmox, и я взялся за дело.

Читать далее

DIY: Ваше собственное облако на базе Kubernetes (часть 3)

Время на прочтение8 мин
Охват и читатели12K

Вот мы и подобрались к самому интересному: запуску Kubernetes в Kubernetes. В этой статье мы поговорим о таких технологиях, как Kamaji и Cluster API, а также о том, как интегрировать их с KubeVirt.

В прошлых статьях мы уже рассказывали, как мы готовим Kubernetes на bare metal, и о том, как превратить Kubernetes в средство запуска виртуальных машин. Эта статья завершает серию, объясняя, как, используя всё вышеперечисленное, можно построить полноценный managed Kubernetes service и запускать виртуальные Kubernetes-кластеры по клику.

И начнём мы, пожалуй с Cluster API.

Читать далее

DIY: Ваше собственное облако на базе Kubernetes (часть 2)

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели15K

Продолжаем серию постов про то как построить своё собственное облако в экосистеме Kubernetes. В прошлой статье мы разобрали как можно подготовить базовый дистрибутив Kubernetes на базе Talos Linux и Flux CD. Теперь нам предстоит обсудить возможность запуска виртуальных машин и всего что для этого необходимо, а это в первую очередь хранилище и сеть.

Мы поговорим про такие технологии как KubeVirt, LINSTOR и Kube-OVN

Для начала мне стоит рассказать зачем вообще нужны виртуальные машины, почему бы нам не ограничиться только-лишь контейнерами?

Всё дело в том, что контейнеры в ядре Linux не дают должного уровня изоляции. Несмотря на то, что с каждым годом ситуация становится всё лучше, тем не менее довольно часто мы сталкиваемся с уязвимостями, позволяющими покинуть песочницу контейнера и повысить свои привилегии в системе.

Читать далее

Argo CD vs Flux CD

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели18K

За последнее время я вижу всё больше споров на тему двух популярных GitOps инструментов: Argo CD и Flux CD.

На самом деле я считаю такие споры необоснованными, потому что глубоко убеждён что внимания заслуживают оба инструмента и каждый из них хорош для решения своего круга задач.

В своей профессиональной деятельности я активно использую и тот и другой. Я хочу поделиться с вами своим мнением и кейсами использования. Надеюсь эта статья поможет вам выбрать наиболее подходящий инструмент под ваши нужды.

Read more

DIY: Ваше собственное облако на базе Kubernetes (часть 1)

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели27K

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

А вы когда-нибудь задумывались о том чтобы построить своё собственное облако? Могу поспорить что да. Но можно ли это сделать используя лишь современные технологии и подходы, не покидая уютной экосистемы Kubernetes? Нам по опыту разработки Cozystack пришлось с ним как следует разобраться.

Да, вы могли бы возразить что Kubernetes для этого не предназначен и почему бы не использовать OpenStack для Bare Metal-серверов а внутри него запускать Kubernetes как положено. Но поступив так, вы просто переложите ответственность с ваших рук на руки OpenStack администраторов. Что добавит как-минимум ещё одну сложную и неповоротливую систему в вашу экосистему.

Зачем так всё усложнять? - ведь на данный момент Kubernetes уже имеет всё необходимое для запуска Kubernetes кластеров.

Читать далее

Restic: эффективное резервное копирование из Stdin

Время на прочтение5 мин
Охват и читатели23K

Про restic я уже рассказывал в статье Бэкап-хранилище для тысяч виртуальных машин свободными инструментами, с тех пор он остаётся моим любимым инструментом для бэкапа.

Сегодня я опишу вам готовый рецепт того как настроить эффективное бэкапирование чего угодно прямо из stdin, с дедупликацией и автоматической очисткой репозитория от старых копий.

Несмотря на то, что restic отлично подходит для сохранения целых каталогов с данными в этой статье мне хотелось бы сделать упор на сохранении резервных копий на лету прямо из Stdin.

Как правило это бывает актуально для сохранения бэкапов виртуальных машин, баз данных и других, представленных одним большим файлом, данных, которые можно последовательно вычитывать и сразу отправлять в систему бэкапирования.

Читать далее

Информация

В рейтинге
184-й
Откуда
Чехия
Работает в
Зарегистрирован
Активность