- PVSM.RU - https://www.pvsm.ru -
Прим. перев.: После недавней публикации материала [1] о методах pull и push в GitOps мы увидели интерес к этой модели в целом, однако русскоязычных публикаций на эту тему оказалось совсем мало (на хабре их попросту нет). Посему рады предложить вашему вниманию перевод другой статьи — пусть и уже почти годичной давности! — от компании Weaveworks, глава которой придумал термин «GitOps». В тексте поясняется суть подхода и ключевые отличия от уже существующих.

Год назад мы опубликовали введение в GitOps [2]. Тогда мы рассказали, как команда Weaveworks запустила SaaS, целиком основанную на Kubernetes, и разработала набор предписывающих лучших практик для развертывания, управления и мониторинга в среде cloud native.
Статья оказалась популярной. Другие люди заговорили о GitOps, стали публиковать новые инструменты для git push [3], разработки [4], секретов [5], функций [6], непрерывной интеграции [7] и т.п. На нашем сайте появилось большое количество [8] публикаций и вариантов использования GitOps. Но у некоторых людей все же остались вопросы. Чем модель отличается от традиционной infrastructure as code [9] и непрерывной поставки (continuous delivery [9])? Обязательно ли использовать Kubernetes?
Вскоре мы поняли, что необходимо новое описание, предлагающее:
В этой статье мы попытались охватить все эти темы. В ней вы найдете обновленное введение в GitOps и взгляд на него со стороны разработчиков и CI/CD. Мы преимущественно ориентируемся на Kubernetes, хотя модель вполне можно обобщить.
Представьте себе Алису. Она управляет компанией Family Insurance, предлагающей полисы по страхованию здоровья, автомобилей, недвижимости и туристическую страховку людям, которые слишком заняты, чтобы разбираться в нюансах контрактов самостоятельно. Ее бизнес начинался как сторонний проект, когда Алиса работала в банке как data scientist. Однажды она поняла, что может использовать передовые компьютерные алгоритмы для более эффективного анализа данных и формирования страховых пакетов. Инвесторы профинансировали проект, и теперь ее компания приносит более 20 млн долларов в год и стремительно растет. В настоящий момент в ней на различных должностях работают 180 человек. В их числе технологическая команда, которая занимается разработкой, обслуживанием сайта, базы данных и анализом клиентской базы. Команду из 60 человек возглавляет Боб — технический директор компании.
Команда Боба развертывает production-системы в облаке. Их основные приложения работают на GKE, пользуясь преимуществами Kubernetes в Google Cloud. Кроме того, они используют в работе различные инструменты для работы с данными и аналитики.
Family Insurance не собиралась использовать контейнеры, но заразилась энтузиазмом вокруг Docker. Вскоре специалисты компании обнаружили, что GKE позволяет развертывать кластеры для тестирования новых функций легко и непринужденно. Были добавлены Jenkins для CI и Quay для организации реестра контейнеров, написаны скрипты для Jenkins, которые push'или новые контейнеры и конфигурации в GKE.
Прошло некоторое время. Алиса и Боб разочаровались в производительности выбранного подхода и его влиянии на бизнес. Внедрение контейнеров не повысило производительность настолько, насколько надеялась команда. Иногда deployment'ы ломались, и было неясно, виноваты ли в этом изменения кода. Также оказалось тяжело отслеживать изменения конфигов. Часто приходилось создавать новый кластер и перемещать в него приложения, поскольку так было проще всего ликвидировать тот бардак, в который превратилась система. Алиса боялась, что ситуация ухудшится по мере развития приложения (кроме того, назревал новый проект на основе машинного обучения). Боб автоматизировал большую часть работы и не понимал, почему пайплайн по-прежнему неустойчив, плохо масштабируется и периодически требует ручного вмешательства?
Затем они узнали о GitOps. Это решение оказалось именно тем, что им было нужно для уверенного движения вперед.
Алиса и Боб уже не один год слышали о рабочих процессах на основе Git, DevOps и infrastructure as code. Уникальность GitOps в том, что он привносит ряд лучших практик — категоричных и нормативных — по реализации этих идей в контексте Kubernetes. Эта тема неоднократно поднималась [10], в том числе и в блоге Weaveworks [11].
Family Insurance решает внедрить GitOps. Теперь у компании есть автоматизированная модель эксплуатации, совместимая с Kubernetes и сочетающая скорость со стабильностью, поскольку они:
GitOps — это две вещи:

Если вы не знакомы с системами контроля версий и основанном на Git рабочим процессом, мы настоятельно рекомендуем изучить их. Поначалу работа с ветвями и pull request'ами может показаться черной магией, но плюсы стоят затраченных усилий. Вот хорошая статья [15] для начала.
В нашей истории Алиса и Боб обратились к GitOps, некоторое время проработав с Kubernetes. Действительно, GitOps тесно связан с Kubernetes — это модель эксплуатации для инфраструктуры и приложений, основанных на Kubernetes.
Вот некоторые основные возможности:
Когда администратор вносит изменения в конфигурацию, оркестратор Kubernetes будет применять их к кластеру до тех пор, пока его состояние не приблизится к новой конфигурации. Эта модель работает для любого ресурса Kubernetes и расширяется с помощью Custom Resource Definitions (CRDs). Поэтому deployment'ы Kubernetes обладают следующими чудесными свойствами:
Мы достаточно узнали о Kubernetes, чтобы объяснить принципы работы GitOps.
Давайте вернемся к командам Family Insurance, связанным с микросервисами. Чем им обычно приходится заниматься? Посмотрите на перечень ниже (если какие-то пункты в нем покажутся странными или незнакомыми — пожалуйста, повремените с критикой и оставайтесь с нами). Это всего лишь примеры рабочих процессов на основе Jenkins. Существует и множество других процессов при работе с другими инструментами.
Главное — мы видим, что каждое обновление заканчивается внесением изменений в конфигурационные файлы и репозитории Git. Эти изменения в Git приводят к тому, что «оператор GitOps» обновляет кластер:
1. Рабочий процесс: «Сборка Jenkins — ветка master».
Список задач:
2. Сборка Jenkins — ветка release или hotfix:
3. Сборка Jenkins — ветка develop или feature:
4. Добавление нового клиента:
Повторим еще раз: все желаемые свойства кластера должны быть наблюдаемы в самом кластере.
Несколько примеров дивергенции:
Несколько примеров:
GitOps объединяет Git с прекрасным механизмом конвергенции Kubernetes, предлагая модель для эксплуатации.
GitOps позволяет нам заявить: автоматизации и контролю поддаются только те системы, которые можно описывать и наблюдать.
GitOps — это не только Kubernetes. Мы хотим, чтобы вся система управлялась декларативно и использовала конвергенцию. Под всей системой мы подразумеваем совокупность сред, работающих с Kubernetes — например, «dev cluster 1», «production» и т. п. В каждую среду входят машины, кластеры, приложения, а также интерфейсы для внешних сервисов, обеспечивающих данные, мониторинг и т. п.
Заметьте, насколько в данном случае Terraform важен для проблемы bootstrapping'а. Kubernetes должен с чего-то начинать, и использование Terraform означает, что мы можем применить те же самые рабочие процессы GitOps для создания управляющего слоя, лежащего в основе Kubernetes и приложений. Это полезная лучшая практика.
Большое внимание уделяется применению концепций GitOps к слоям над Kubernetes. На данный момент имеются решения GitOps-типа для Istio, Helm, Ksonnet, OpenFaaS и Kubeflow, а также например, для Pulumi, что создают слой для разработки приложений под cloud native.
Как говорилось, GitOps — это две вещи:
Для многих GitOps — это прежде всего рабочий процесс на основе Git push'ей. Нам он тоже нравится. Но это не все: давайте теперь посмотрим на CI/CD-пайплайны.
GitOps предлагает механизм непрерывного развертывания, устраняющий необходимость в отдельных «системах управления развертываниями». Всю работу за вас выполняет Kubernetes.
Следует избегать использования Kubectl для обновления кластера, а в особенности — скриптов для группирования команд kubectl. Вместо этого, с помощью GitOps-пайплайна пользователь может обновить свой кластер Kubernetes через Git.
Преимущества включают в себя:
GitOps улучшает существующие CI/CD-модели.
Современный CI-сервер представляет собой инструмент для оркестрации. В частности, это инструмент для оркестрации CI-пайплайнов. Они включают в себя build, test, merge to trunk и т. д. CI-серверы автоматизируют управление сложными многошаговыми пайплайнами. Распространенный соблазн состоит в том, чтобы создать скрипт для набора обновлений Kubernetes и выполнить его в качестве элемента пайплайна для push'а изменений в кластер. Действительно, так поступают многие специалисты. Однако это неоптимально, и вот почему.
CI должна использоваться для внесения обновлений в trunk, а кластер Kubernetes должен менять себя на основе этих обновлений, чтобы управлять CD «внутренне». Мы называем это pull-моделью для CD [20], в отличие от CI push-модели. CD является частью runtime-оркестрации.
Не используйте CI-сервер для оркестрации прямых обновлений в Kubernetes в виде набора CI-заданий. Это анти-паттерн, о котором мы уже рассказывали [23] в своем блоге.
Давайте вернемся к Алисе и Бобу.
С какими проблемами они столкнулись? CI-сервер Боба применяет изменения к кластеру, но если в процессе он упадет, Боб не будет знать, в каком состоянии находится (или должен быть) кластер и как его исправить. То же самое справедливо и в случае успеха.
Давайте предположим, что команда Боба собрала новый образ и затем пропатчила свои deployment'ы, чтобы развернуть образ (все это из CI-пайплайна).
Если образ соберется нормально, но пайплайн упадет, команде придется выяснять:
Организация основанного на Git'е рабочего процесса не гарантирует, что команда Боба не столкнется с этими проблемами. Они по-прежнему могут ошибиться с push'ем коммита, с тегом или каким-либо другим параметром; однако этот подход все же гораздо ближе к явному все-или-ничего.
Подытоживая, вот почему CI-серверы не должны заниматься CD:
Примечание о Helm'e: если вы хотите использовать Helm, мы рекомендуем объединить его с GitOps-оператором, таким как Flux-Helm [24]. Это обеспечит конвергентность. Сам по себе Helm нельзя назвать детерминистским или атомарным.
Команда Алисы и Боба внедряет GitOps и обнаруживает, что стало гораздо проще работать с программными продуктами, поддерживать высокую производительность и стабильность. Давайте закончим эту статью иллюстрациями, показывающими, как выглядит их новый подход. Учтите, что мы в основном говорим о приложениях и сервисах, однако GitOps можно использовать для управления всей платформой.
Посмотрите на следующую диаграмму. Она представляет Git и хранилище образов контейнеров как общие ресурсы для двух оркестрированных жизненных циклов:

GitOps предоставляет весомые гарантии обновления, необходимые любому современному инструменту CI/CD:
Это важно, поскольку он предлагает модель эксплуатации для разработчиков в области cloud native.
Представьте множество кластеров, разбросанных по различным облакам и множество сервисов со своими собственными командами и планами развертываний. GitOps предлагает масштабно-инвариантную модель для управления всем этим изобилием.
Читайте также в нашем блоге:
Автор: diafour
Источник [28]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/git/322979
Ссылки в тексте:
[1] материала: https://habr.com/ru/company/flant/blog/456754/
[2] введение в GitOps: https://www.weave.works/blog/gitops-operations-by-pull-request
[3] git push: https://github.com/hasura/gitkube
[4] разработки: https://dzone.com/articles/weaveworks-gitops-developer-toolkit-part-one-skaff
[5] секретов: https://www.weave.works/blog/storing-secure-sealed-secrets-using-gitops
[6] функций: https://blog.alexellis.io/introducing-openfaas-cloud/
[7] непрерывной интеграции: https://jenkins.io/blog/2018/03/19/introducing-jenkins-x/
[8] большое количество: https://www.weave.works/blog/category/gitops/
[9] infrastructure as code: https://puppet.com/blog/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn
[10] неоднократно поднималась: https://twitter.com/search?q=gitops&src=typd
[11] блоге Weaveworks: https://www.weave.works/blog/gitops-high-velocity-cicd-for-kubernetes
[12] здесь: https://www.imperva.com/learn/data-security/soc-2-compliance/
[13] одного слайда: https://twitter.com/vitorsilva/status/999978906903080961
[14] Luis Faceira: https://2018.agilept.org/speaker_luis_faceira.html
[15] хорошая статья: https://codeburst.io/trunk-based-development-vs-git-flow-a0212a6cae64
[16] GitOps-оператор Weave Flux: https://github.com/weaveworks/flux
[17] Weave Cloud: https://cloud.weave.works/
[18] Terraform: https://blog.gruntwork.io/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c
[19] Цитируя: https://twitter.com/kelseyhightower/status/939003832805179392?lang=en
[20] мою публикацию: https://www.weave.works/blog/gitops-compliance-and-secure-cicd
[21] статью о взломе Homebrew: https://medium.com/@vesirin/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab
[22] такое резюме: http://superuser.openstack.org/articles/kubernetes-boring/
[23] уже рассказывали: https://www.weave.works/blog/kubernetes-anti-patterns-let-s-do-gitops-not-ciops
[24] Flux-Helm: https://www.weave.works/blog/managing-helm-releases-the-gitops-way
[25] этой презентации: https://www.slideshare.net/weaveworks/continuous-lifecycle-london-2018-event-keynote-97418556
[26] Представляем библиотеку kubedog для слежения за ресурсами Kubernetes: https://habr.com/ru/company/flant/blog/434160/
[27] Расширяем и дополняем Kubernetes (обзор и видео доклада): https://habr.com/ru/company/flant/blog/449096/
[28] Источник: https://habr.com/ru/post/458878/?utm_source=habrahabr&utm_medium=rss&utm_campaign=458878
Нажмите здесь для печати.