Примечание: Эта статья теперь принята в официальную документацию Kubernetes: Merge pull request #62563 from devdattakulkarni/client-go-details client-go under the hood Преимуществом Kubernetes является его расширяемость. Одним из способов расширения Kubernetes является написание собственных кастомных контроллеров (custom controllers). Вы можете написать кастомные контроллеры, которые обрабатывают встроенные объекты Kubernetes, такие как Deployment, Service, или вы можете добавить новые кастомные ресурсы в Kubernetes и написать кастомный контроллер для их обработки. Недавно мы разрабатывали Custom Resource Definition (CRD) для Postgres. В процессе разработки CRD была изучена библиотека client-go в Kubernetes. Она содержит различные механизмы, которые вы можете использовать при разработке своих кастомных контроллеров. Эти механизмы определены в папке tools/cache библиотеки. Мы подготовили наглядную иллюстрацию, показывающую, как работают различные компоненты библиотеки client-go и их взаимодействие с кодом кастомного контроллера, который вы напишете. Вот это представление. Рисунок разделен на две части — client-go и кастомный контроллер. Ниже мы рассматриваем каждый компонент, указывая на соответствующие места в коде client-go, и наш кастомный контроллер для Postgres, который показывает основные действия каждого компонента. Рефлектор (Reflector): Рефлектор просматривает API Kubernetes на предмет определенного типа (вида) ресурса. Это может быть встроенный или пользовательский (кастомный) ресурс. Когда он принимает уведомление о существовании нового экземпляра ресурса через watch API, он получает вновь созданный объект, используя соответствующий API listing. Затем он помещает объект в очередь Delta Fifo. Информатор (Informer): Информатор извлекает объекты из очереди Delta Fifo. Его задача заключается в сохранении объекта для последующего извлечения и вызове кода контроллера, передающего ему объект. Индексатор (Indexer): Индексатор обеспечивает выполнение индексирования объектов. Типичным случаем использования индексации является создание индекса на основе меток объектов. Индексатор может поддерживать индексы на основе нескольких функций индексирования. Индексатор использует потокобезопасное хранилище данных для хранения объектов и их ключей. Существует функция по умолчанию, которая генерирует ключ объекта как комбинацию <пространство имен>/<имя> (<namespace>/<name>) для этого объекта. Ссылка на информатор (Informer reference) : Это ссылка на инстанс Informer, который знает, как работать с вашими кастомными объектами ресурса. Код вашего кастомного контроллера должен создать соответствующий Informer. Ссылка на индексатор (Indexer reference): Это ссылка на инстанс Indexer, который знает, как работать с вашими кастомными объектами ресурса. Ваш код кастомного контроллера должен его создать. Вы будете использовать эту ссылку при получении объектов для последующей обработки. client-go предоставляет функции для создания Informer и Indexer в соответствии с вашими потребностями. В своем коде вы можете напрямую вызывать эти функции, либо использовать фабричные методы для создания информера. Обработчики события ресурса (Resource Event Handlers): Это колбэк-функции (обратного вызова), которые будут вызываться Informer, когда он захочет доставить объект вашему контроллеру. Типовой схемой по написанию этих функций является получение ключа отправленного объекта и его занесение в рабочую очередь для дальнейшей обработки. Рабочая очередь (Workqueue): Это очередь, которую вы создаете в коде вашего контроллера, чтобы отделить доставку объекта от его обработки. Функции обработчика события ресурса пишутся для извлечения ключа доставленного объекта и добавления его в рабочую очередь. Элемент процесса (Process Item): Это функция, которую вы создаете в своем коде для обработки объектов из рабочей очереди. Может быть одна или несколько различных функций, которые выполняют фактическую обработку. Эти функции обычно используют ссылку на Indexer или обертку Listing для получения объекта, соответствующего ключу. Вы можете попробовать наш кастомный ресурс Postgres, чтобы увидеть, как эти компоненты сочетаются в реальном коде. Этот пользовательский ресурс был разработан на основе образца контроллера, доступного в Kubernetes. Мы надеемся, что приведенное выше разъяснение различных компонентов и механизмов, участвующих в написании кастомных Kubernetes контроллеров, поможет вам в написании собственных кастомных контроллеров. Приглашаем на открытое занятие «Service mesh. Знакомство с Istio и Envoy». На бесплатном вебинаре:— Разберем, что такое service mesh вообще;— Познакомимся с одним из его представителей - Istio;— Научимся устанавливать его в кластер и настраивать политики по управлению трафиком. Регистрация по ссылке.   Редактор