Привет, Хабр. В рамках курса «Инфраструктурная платформа на основе Kubernetes» подготовили для вас перевод полезного материала.
Также приглашаем на открытый вебинар «Работа с NoSQL базами в k8s (на примере Apache Cassandra)». На вебинаре участники вместе с экспертом рассмотрят плюсы и минусы запуска Apache Cassandra в k8s: насколько такой вариант установки готов к продакшену, и какие подводные камни имеются.
![](https://habrastorage.org/getpro/habr/upload_files/668/1f4/fe7/6681f4fe70badec2973ba7479825de2e.png)
В этой статье мы рассмотрим несколько вопросов касательно Argo CD: что это такое, зачем его используют, как его развернуть (в Kubernetes), как его использовать для реализации непрерывного развертывания (continuous deployment), как настроить SSO с помощью GitHub и разрешений и т. д.
Что такое Argo CD и GitOps
![](https://habrastorage.org/getpro/habr/upload_files/e83/add/ab4/e83addab44dcfe16ff61e85227cdb7ce.png)
Argo CD — это декларативный GitOps-инструмент непрерывной доставки (continuous delivery) для Kubernetes.
Но что же такое GitOps?
![](https://habrastorage.org/getpro/habr/upload_files/8d6/b3e/d79/8d6b3ed7960d32d30557c06055e3d9f1.png)
Официальное определение гласит, что GitOps — это способ реализации непрерывного развертывания (continuous deployment) облачных приложений. Он фокусируется на создании ориентированного на разработчиков опыта эксплуатации инфраструктуры с использованием инструментов, с которыми разработчики уже знакомы, включая Git и Continuous Deployment.
Официальное определение не вдается в подробности, не так ли? Возможно, вы не так часто слышали об этой концепции, но, скорее всего, вы уже использовали ее: вы определяете свои K8s ресурсы в YAML или с помощью Helm-диаграммы, вы используете Git в качестве единого источника истины (single source of truth), вы запускаете одни автоматизированные CI задачи для деплоя в продакшн, когда ваша ветвь master изменена, и вы запускаете другие задачи по пул реквесту для деплоя на стейджи.
Почему GitOps
Определения, конфигурации и среды приложений должны быть декларативными и подлежать контролю версий.
Развертывание (деплой) приложений и управление жизненным циклом должны быть:
автоматизированными
проверяемыми
простыми для понимания
Эти правила не требуют пояснений, поскольку они приносят очевидную пользу. Вам не хотелось бы тратить много времени на выяснение, какая версия развернута в какой среде и какой тег git ей соответствует; вам нужна возможность отката до определенной версии; вы хотели бы, чтобы определение приложений и деплоев было легко читаемым для людей; вы хотите, чтобы все было автоматизировано и не исключало возможность проверки.
В этом и заключается концепция GitOps и то, почему он хорош.
Почему Argo CD
Можно ли достичь вышеупомянутых преимуществ GitOps, используя любые другие инструменты CI/CD? Скорее всего, да. Например, вы можете использовать старый добрый Jenkins, определить разные задачи для разных ветвей, после чего задачи будут следить за Git-репозиториями или использовать хуки для реакции на события, а в конвейере вы можете выполнить несколько git clone и helm install. Нет ничего плохого в Jenkins, на что я указывал в моей предыдущей статье о CI: Введение в CI: сравнение 17 основных инструментов CI или Как выбрать лучшее CI в 2020 году.
Если вы не читали ее, я рекомендую вам сделать это, чтобы лучше понять, что мы ищем при выборе инструмента.
По сути, Argo CD упрощает все, о чем я упоминал выше: легко настраивать, легко развертывать, почти без особых напрягов, так что вы можете сосредоточиться на более важных вещах, а не возиться с инструментом, просто чтобы понять, как его использовать и настраивать.
Все еще неубедительно
Хорошо, я понимаю, что у вас есть опасения по поводу внедрения новых инструментов, поэтому вот несколько фактов, которые могут вас убедить:
Это часть фонда Cloud Native Computing Foundation (CNCF).
Он активно поддерживается и постоянно улучшается. Посмотрите количество на коммитов:
![](https://habrastorage.org/getpro/habr/upload_files/298/d1b/ab7/298d1bab72b6e8b94d20cd14a0bf7275.png)
Мне порой доставляет удовольствие покопаться в git-репозиториях в поисках разнообразной информации, и вот что я нашел здесь:
первый релиз v0.1.0 состоялся в марте 2018 года (относительно новый проект)
v1.0.0 зарелижен в мае 2019 (быстро развивается)
на момент написания статьи имеет версию v1.7.8 (ноябрь 2020, развивается очень быстро)
4,3 тыс. звезд в репозитории Argo CD (еще больше на других репозиториях того же проекта)
60 открытых PR и 500 открытых задач на сегодняшний день (очень даже неплохо, это означает, что сообщество активно занимается им и постоянно исправляет и придумывает запросы на новый функционал)
Он также упоминается в техническом радаре CNCF:
![](https://habrastorage.org/getpro/habr/upload_files/0ae/b0d/666/0aeb0d6668c96702f395c2d019ca21f8.png)
Он все еще находится на стадии «ОЦЕНКА» (ASSESS), что означает, что члены CNCF протестировали его, и он показался многообещающим. Он рекомендован к рассмотрению, когда вы сталкиваетесь с конкретной потребностью в подобной технологии в вашем проекте.
Радар является инициативой CNCF End User Community. Это группа из более чем 140 ведущих компаний и стартапов, которые регулярно встречаются для обсуждения проблем и передовых методов внедрения облачных технологий. Если вам лень разбираться, какой инструмент использовать, или если вы чувствуете себя неуверенно в отношении новых вещей, которые вы еще не пробовали, довольно безопасно выбрать один из вариантов, которые предлагает радар, потому что многие крупные компании уже протестировали его за вас, множество из имен которых вы уже слышали. Если это подходит им, есть большая вероятность, что и вам это понравится.
Развертывание
Окей, приступим к практике. У вас должен быть запущен кластер K8s, потому что мы собираемся делать это внутри k8s.
kubectl create namespace argocd
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Один YAML, чтоб править всеми.
После развертывания у вас будет несколько запущенных подов и сервисов. Примеры:
Pods:
argocd-application-controller-6b47c9bd78-kp6dj
argocd-dex-server-7b6d8776d8-knsxx
argocd-redis-99fb49846-l466k
argocd-repo-server-b664bd94b-bmtwr
argocd-server-768879948c-sx875
Services:
argocd-dex-server
argocd-metrics
argocd-redis
argocd-repo-server
argocd-server
argocd-server-metrics
Комментарии по доступу к сервису и ingress:
Обратите внимание, что в развертывании по умолчанию сервис работает как тип Cluster IP, и ingress по умолчанию нет. Поэтому, если вы хотите получить доступ к сервису, вам нужно будет либо выполнить переадресацию портов, либо изменить тип сервиса на балансировщик нагрузки, либо создать ingress.
Если вы делаете это в производственном кластере, например в EKS в AWS, скорее всего, вы хотите использовать ingress и, вероятно, у вас уже есть ingress-контроллер. Вход для Argo CD здесь немного сложен, потому что на порту 443 он имеет как HTTPS (для веб-интерфейса консоли), так и GRPC для вызовов API командной строки. Если вы используете EKS, например, с ingress-контроллером Nginx, скорее всего, вы уже выполнили завершение TLS там, поэтому вам может потребоваться несколько ingress-объектов и хостов, один для протокола HTTP, другой для GRPC. Подробнее смотрите здесь.
Установка CLI
Для Mac это всего лишь одна команда:
brew install argocd
Инициализация
После установки изначальный пароль совпадает с именем пода сервера. Мы можем войти в систему:
argocd login (переадресация портов, служба балансировки нагрузки, ingress - на ваш выбор)
и изменить пароль:
argocd account update-password
Вы также можете войти в консоль пользовательского интерфейса со своим юзернеймом и паролем, чтобы прочувствовать:
![](https://habrastorage.org/getpro/habr/upload_files/d34/5bf/65f/d345bf65fce1af31de1f9988dafb5f57.png)
Страница входа в пользовательский интерфейс Argo CD
Добавление кластеров
Вы можете управлять сразу несколькими кластерами внутри Argo CD, например, у вас могут быть разные кластеры для разных сред, таких как dev, test, staging, production или что-то еще.
По умолчанию кластер, в котором развернут Argo CD, уже настроен с помощью Argo CD:
![](https://habrastorage.org/getpro/habr/upload_files/a82/ede/a50/a82edea503920831ba39062ac45d2060.png)
![](https://habrastorage.org/getpro/habr/upload_files/b64/9e6/386/b649e6386de7924b4f45ad041b9ccf54.png)
Вы также можете увидеть список кластеров с помощью интерфейса командной строки:
argocd cluster list
Если вы хотите управлять другими кластерами, вы можете запустить:
argocd cluster add CONTEXTNAME
«CONTEXTNAME»- имя kube контекста в вашей локальной конфигурации.
Helloworld-пример развертывания
Теперь мы можем попробовать создать «приложение» на Argo CD.
Версия «TL;DR» или версия «Мне не нравится UI» в этом разделе — это одна команда:
argocd app create helloworld --repo https://github.com/ironcore864/go-hello-http.git --path helm --sync-policy automatic --dest-server https://kubernetes.default.svc --dest-namespace default --values values.yaml --values values.dev.yaml
Эта CLI-команда создаст приложение, развернет его и синхронизирует. Чтобы продемонстрировать простоту Argo CD, я буду делать то же самое в пользовательском интерфейсе, а именно:
Нажмите кнопку «NEW APP» в консоли пользовательского интерфейса:
![](https://habrastorage.org/getpro/habr/upload_files/ede/70b/fca/ede70bfcaeec900673ae9f89336e618c.png)
Затем вам нужно ввести несколько параметров для задачи, например:
Application Name: имя этого приложения. Здесь я назову его просто «helloworld»
Project: вы можете выбрать «default». Project (проект) — это концепция внутри Argo CD, в рамках которой вы можете создать несколько приложений и связать каждое приложение с проектом
Sync policy: вы можете выбрать между Manual и Automatic (что даст вам настоящий GitOps). Здесь я выберу Automatic (обратите внимание, что здесь в пользовательском интерфейсе значение по умолчанию — «Manual»).
![](https://habrastorage.org/getpro/habr/upload_files/a76/862/6de/a768626def105dec76d7bfb6c162cb3a.png)
Нажмите «SYNC POLICY» и выберите «Automatic»
Затем мы перейдем к SOURCE части. Нам нужно указать URL-адрес git. Я собираюсь использовать пример, расположенный по адресу. Если вы перейдете в этот репозиторий, вы обнаружите, что там нет ничего, кроме простого Golang приложения с папкой с именем «helm», которая представляет собой диаграмму для развертывания с несколькими файлами значений.
После того, как вы ввели URL-адрес git-репозитория, кликните часть «PATH», и вы обнаружите, что Argo CD уже автоматически обнаружил, что у нас есть папка «helm» в этом репозитории, которая содержит вещи, которые могут нас заинтересовать:
![](https://habrastorage.org/getpro/habr/upload_files/49f/08f/48e/49f08f48e3532680123590a1e4702098.png)
Кликните «Path» и выберите имя папки «helm» в раскрывающемся меню.
Итак, здесь мы просто кликаем раздел «Path» и выбираем папку «helm».
Стоит отметить, что Argo CD поддерживает несколько инструментов для развертывания. Сам Argo CD не предвзят; он позволяет использовать собственный YAML k8s, или kustomize, или helm. Например, если файлы в «Path» представляют собой схему управления, Argo CD знает, что нужно запустить установку Helm; но если это просто файлы YAML k8s, Argo CD знает, что вместо этого нужно запустить kubectl apply. Умно, не правда ли?
В разделе «Destination» нам нужно выбрать, в каком кластере Kubernetes развернуть это приложение (выбор из раскрывающегося списка) и в каком пространстве имен (введите текст).
![](https://habrastorage.org/getpro/habr/upload_files/b24/8e9/625/b248e9625c8a43e23f8e9d9eb7b6acc7.png)
Щелкните «URL-адрес кластера», выберите кластер для развертывания и введите пространство имен.
Поскольку в этом примере в нашей папке «helm» есть диаграмма, Argo CD автоматически загружает новый раздел с именем «Helm», чтобы попросить вас выбрать, какой файл значений, который нужно применить:
![](https://habrastorage.org/getpro/habr/upload_files/d2e/741/62d/d2e74162d71cf4e2d7d6d10586d39f7f.png)
Кликните раздел «VALUES FILES», и вы можете выбрать один или несколько файлов из списка, который выбирается из «Path», настроенного ранее.
Это раскрывающееся меню, вам даже не нужно вводить имена файлов. Эта часть хорошо интегрирована с helm — причина, по которой я предпочитаю создавать приложение в пользовательском интерфейсе, хотя то же самое можно сделать с помощью одной единственной CLI-команды.
Здесь мы указали два файл со значениями, один по умолчанию, другой для dev стейджа, и в нем есть значения, которые переопределяют значения, определенные по умолчанию.
После нажатия кнопки «Create» Argo CD «синхронизирует» (sync) статус, определенный в git-репозитории, и если текущее состояние не совпадает с тем, что определено в git, Argo CD синхронизирует его и переведет состояние в то же, что определено в git. Через некоторое время вы увидите, что приложение синхронизировано, и какие компоненты развернуты:
![Приложение синхронизировано Приложение синхронизировано](https://habrastorage.org/getpro/habr/upload_files/315/a99/e0b/315a99e0bd9df7d0b3df806b393944c0.png)
![Подробное представление приложения Подробное представление приложения](https://habrastorage.org/getpro/habr/upload_files/31a/63f/6de/31a63f6deb3134a5357c0a3f89d05c2e.png)
В этом примере у нас есть развертывание, в котором развернут только 1 под (значения из «values.dev.yaml» переопределяет 3 пода по умолчанию, определенные в файле «values.yaml»), и сервис, раскрывающий развертывание. Теперь, если мы перейдем к целевому кластеру и проверим, он действительно уже развернут:
![Приложение действительно развернуто, без шуток Приложение действительно развернуто, без шуток](https://habrastorage.org/getpro/habr/upload_files/65a/6b3/d73/65a6b3d7397295c9747b1e1ad8d213ac.png)
Это демонстрирует весь процесс, в котором вы создаете приложение и развертываете его. Весь процесс занимает около 1 минуты, без написания bash-скриптов для cd в какую-либо папку, а затем для установки helm, или, что еще хуже, если у вас нет подходящего образа с helm, необходимости его собрать или найти.
Там также есть много CLI-команд, которые можно использовать, если вы предпочитаете их пользовательскому интерфейсу, чтобы у вас был контроль над всем, не выходя из зоны комфорта.
GitHub SSO
Последняя, но не по важности, тема — это пользователи и разрешения, как и в каждом новом инструменте, который мы хотим внедрить в нашу команду.
После установки Argo CD имеет одного встроенного администратора, который имеет полный доступ к системе. Рекомендуется использовать пользователя с правами администратора только для изначальной настройки, а затем переключиться на локальных пользователей или настроить SSO-интеграцию.
Вы можете создать локального пользователя в Argo CD, но вы, вероятно, захотите настроить SSO.
Argo CD включает и поставляет Dex как часть установочного комплекта с целью делегирования аутентификации внешнему поставщику идентификации. Поддерживаются несколько типов поставщиков идентификации (OIDC, SAML, LDAP, GitHub и т. Д.). Для настройки единого входа (SSO) на Argo CD необходимо отредактировать файл конфигурации argocd-cm с настройками Dex-коннектора. После регистрации нового OAuth приложения в git вы можете отредактировать configmap «argocd-cm», чтобы добавить следующие значения:
data:
url: https://argocd.example.com
dex.config: |
connectors:
# GitHub example
- type: github
id: github
name: GitHub
config:
clientID: aabbccddeeff00112233
clientSecret: $dex.github.clientSecret
orgs:
- name: your-github-org
# GitHub enterprise example
- type: github
id: acme-github
name: Acme GitHub
config:
hostName: github.acme.com
clientID: abcdefghijklmnopqrst
clientSecret: $dex.acme.clientSecret
orgs:
- name: your-github-org
После сохранения изменения должны вступить в силу автоматически, и у вас будет GitHub SSO уже для всей вашей команды.
![GitHub SSO (здесь в примере — корпоративный git) GitHub SSO (здесь в примере — корпоративный git)](https://habrastorage.org/getpro/habr/upload_files/a03/9a6/90b/a039a690b59904c1b98968fff6ce1c44.png)
Если вы запустите GitHub SSO с новым пользователем, входящим в систему, он не увидит список кластеров или только что созданное приложение — это из-за функций RBAC, позволяющих ограничивать доступ к ресурсам Argo CD. После того, как мы уже включили SSO, мы можем настроить RBAC, создав следующую configmap argocd-rbac-cm
:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
policy.default: role:readonly
policy.csv: |
p, role:org-admin, applications, *, */*, allow
p, role:org-admin, clusters, get, *, allow
p, role:org-admin, repositories, get, *, allow
p, role:org-admin, repositories, create, *, allow
p, role:org-admin, repositories, update, *, allow
p, role:org-admin, repositories, delete, *, allow
g, your-github-org:your-team, role:org-admin
Таким образом, пользователи, вошедшие в систему с помощью нашей системы единого входа GitHub, могут управлять приложениями и видеть кластеры.
Заключение
Установка, инициализация, управление (кластер, SSO, пользователь, RBAC), использование (создание приложения, развертывание) довольно просты. Я настоятельно рекомендую вам попробовать, в любом случае это займет у вас не больше часа. И я гарантирую, что вам понравится его простота и то, что он может вам принести.
Узнать подробнее о курсе «Инфраструктурная платформа на основе Kubernetes».
Смотреть открытый вебинар «Работа с NoSQL базами в k8s (на примере Apache Cassandra)».