Создание Платформы Kubernetes На Pinterest

За прошедшие годы 300 миллионов пользователей Pinterest создали более 200 миллиардов пинов на более чем 4 миллиардах досок.

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

И вот настал момент, когда взгляд компании упал на k8s. Почему «куб» хорошо выглядел на Pinterest? Об этом вы узнаете из нашего перевода недавней статьи от блог Pinterest инжиниринг .



Создание платформы Kubernetes на Pinterest

Итак, сотни миллионов пользователей и сотни миллиардов пинов.

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

Кроме того, у нас есть множество платформ, которым также может потребоваться доступ к процессору, памяти или вводу-выводу.

Поддерживая этот зоопарк инструментов, команда разработчиков сталкивается с рядом проблем:

Для инженеров не существует единого способа управления производственной средой.

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

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

Разработчики с собственным парком виртуальных машин создают огромную нагрузку на внутренних администраторов.

В результате такие простые операции, как обновление ОС или AMI, занимают недели и месяцы.

Это приводит к увеличению нагрузки в, казалось бы, абсолютно повседневных ситуациях.

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

Ситуация осложняется еще и тем, что найти владельцев виртуальных машин непросто.

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

Системы оркестрации контейнеров — это способ унифицировать управление рабочей нагрузкой.

Они открывают путь к увеличению скорости разработки и упрощают управление инфраструктурой, поскольку все ресурсы, задействованные в проекте, управляются одной централизованной системой.



Создание платформы Kubernetes на Pinterest

Рисунок 1. Приоритеты инфраструктуры (надежность, продуктивность разработчиков и эффективность).

Команда облачной платформы управления Pinterest обнаружила K8 в 2017 году.

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

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

Ближе к концу 2017 года мы решили использовать Kubernetes. Он был достаточно гибким и широко поддерживался сообществом разработчиков.

На сегодняшний день мы создали собственные инструменты загрузки кластера на основе Kops и перенесли существующие компоненты инфраструктуры, такие как сеть, безопасность, метрики, ведение журналов, управление идентификацией и трафиком, в Kubernetes. Также мы реализовали для нашего ресурса систему моделирования нагрузки, сложность которой скрыта от разработчиков.

Сейчас мы сосредоточены на обеспечении стабильности кластера, его масштабировании и подключении новых клиентов.



Kubernetes: путь Pinterest

Начало работы с Kubernetes в масштабе Pinterest как с платформой, которая понравится нашим инженерам, сопряжено с множеством проблем.

Будучи крупной компанией, мы вложили значительные средства в инфраструктурные инструменты.

Примеры включают инструменты безопасности, которые обрабатывают сертификаты и распределение ключей, компоненты управления трафиком, системы обнаружения служб, компоненты видимости, а также компоненты диспетчеризации журналов и метрик.

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

Такой подход в целом упростил миграцию, поскольку вся поддержка приложений уже существует и ее не нужно создавать с нуля.

С другой стороны, моделей прогнозирования нагрузки в самом Kubernetes (таких как развертывания, задания и наборы демонов) недостаточно для нашего проекта.

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

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

Также было очень сложно поддерживать разные версии в одном кластере.

Представьте себе сложность поддержки клиентов, если вам нужно одновременно работать в нескольких версиях одной и той же среды выполнения со всеми их проблемами, ошибками и обновлениями.



Свойства пользователя и контроллеры Pinterest

Чтобы нашим инженерам было проще внедрять Kubernetes, а также упростить и ускорить нашу инфраструктуру, мы разработали собственные определения ресурсов (CRD).

CRD предоставляют следующие функциональные возможности: Объединение различных собственных ресурсов Kubernetes, чтобы они работали как единая рабочая нагрузка.

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

Это позволяет разработчикам не беспокоиться о настройке DNS. Реализуйте необходимую поддержку приложений.

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

Это обеспечивает принципиально иной уровень комфорта для разработчиков.

Контроллеры CRD также управляют жизненным циклом собственных ресурсов и повышают доступность отладки.

Это включает в себя согласование желаемых и фактических спецификаций, обновление статуса CRD, ведение журналов событий и многое другое.

Без CRD разработчики были бы вынуждены управлять несколькими ресурсами, что только увеличило бы вероятность ошибки.

Вот пример PinterestService и внутреннего ресурса, которым управляет наш контроллер:

Создание платформы Kubernetes на Pinterest

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

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

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



Рабочий процесс развертывания приложения



Создание платформы Kubernetes на Pinterest

На изображении выше показано, как развернуть пользовательский ресурс Pinterest в кластере Kubernetes:
Разработчики взаимодействуют с нашим кластером Kubernetes через CLI и пользовательский интерфейс.

Инструменты CLI/UI извлекают YAML-файлы конфигурации рабочего процесса и другие свойства сборки (тот же идентификатор версии) из Artifactory, а затем отправляют их в службу отправки заданий.

Этот шаг гарантирует, что в кластер доставляются только производственные версии.

JSS — это шлюз для различных платформ, включая Kubernetes. Здесь проходит аутентификация пользователя, выдаются квоты и частично проверяется конфигурация нашего CRD. После проверки CRD на стороне JSS информация отправляется в API платформы k8s. Наш CRD-контроллер отслеживает события на всех пользовательских ресурсах.

Он преобразует CR в собственные ресурсы k8s, добавляет необходимые модули, устанавливает соответствующие переменные среды и выполняет другую работу по поддержке, чтобы гарантировать, что контейнерные пользовательские приложения имеют достаточную поддержку инфраструктуры.

Затем контроллер CRD передает полученные данные в Kubernetes API, чтобы они могли быть обработаны планировщиком и запущены в производство.

Примечание : Этот предварительный рабочий процесс развертывания был создан для первых пользователей новой платформы k8s. В настоящее время мы находимся в процессе доработки этого процесса для полной интеграции с нашим новым CI/CD. Это означает, что мы не можем рассказать вам все, что связано с Kubernetes. Мы с нетерпением ждем возможности поделиться нашим опытом и прогрессом команды в этом направлении в нашей следующей публикации в блоге «Создание платформы CI/CD для Pinterest».



Виды специальных ресурсов

Основываясь на конкретных потребностях Pinterest, мы разработали следующие CRD для различных рабочих процессов: PinterestService — это сервисы без сохранения состояния, которые работают уже давно.

Многие из наших основных систем основаны на наборе таких сервисов.

PinterestJobSet моделирует пакетные задания полного цикла.

Распространенный сценарий в Pinterest заключается в том, что несколько заданий параллельно запускают одни и те же контейнеры, независимо от других подобных процессов.

PinterestCronJob широко используется в сочетании с небольшими периодическими нагрузками.

Это оболочка для нативной работы cron с механизмами поддержки Pinterest, которые отвечают за безопасность, трафик, журналы и метрики.

PinterestDaemon включает инфраструктурные демоны.

Это семейство продолжает расти по мере того, как мы расширяем поддержку наших кластеров.

PinterestTrainingJob распространяется на процессы Tensorflow и Pytorch, обеспечивая тот же уровень поддержки во время выполнения, что и все другие CRD. Поскольку Pinterest активно использует Tensorflow и другие системы машинного обучения, у нас появилась причина построить вокруг них отдельный CRD. Мы также работаем над PinterestStatefulSet, который вскоре будет адаптирован для хранилищ данных и других систем с отслеживанием состояния.



Поддержка во время выполнения

Когда модуль приложения запускается в Kubernetes, он автоматически получает сертификат для идентификации.

Этот сертификат используется для доступа к секретному хранилищу или для связи с другими службами через mTLS. Тем временем конфигуратор и демон Container Init загрузят все необходимые зависимости перед запуском контейнерного приложения.

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

Все это будет работать, поскольку сетевой модуль был настроен до запуска приложения.

Выше приведены типичные примеры поддержки рабочих нагрузок во время выполнения.

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

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



Тестирование и контроль качества

Мы построили сквозной конвейер тестирования поверх существующей тестовой инфраструктуры Kubernetes. Эти тесты распространяются на все наши кластеры.

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

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



Альтернативы

Мы рассмотрели некоторые альтернативы пользовательским ресурсам, такие как контроллеры доступа к мутациям и системы шаблонов.

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

Однако он столкнулся с различными проблемами, такими как привязка ресурсов и управление жизненным циклом, где такие проблемы не возникают в CRD. Примечание: Системы шаблонов, такие как диаграммы Helm, также широко используются для запуска приложений со схожими конфигурациями.

Однако наши рабочие приложения слишком разнообразны, чтобы ими можно было управлять с помощью шаблонов.

Также при непрерывном развертывании будет слишком много ошибок при использовании шаблонов.



Предстоящая работа

В настоящее время мы имеем дело со смешанной нагрузкой во всех наших кластерах.

Для поддержки таких процессов различного типа и масштаба мы работаем по следующим направлениям: Коллекция кластеров распределяет большие приложения по разным кластерам для обеспечения масштабируемости и стабильности.

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

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

Новая платформа CI/CD для поддержки и развертывания приложений в Kubernetes. Теги: #инфраструктура #ИТ-инфраструктура #облачные сервисы #api #Kubernetes #k8s #ci/cd #itsumma #translation #platform #Pinterest #pinterest api

Вместе с данным постом часто просматривают: