Внедрение GitOps с использованием Argo CD

Введение

Argo CD – популярная реализация открытого исходного кода для выполнения непрерывной доставки GitOps поверх Kubernetes. Ваши приложения, определения, конфигурации и среды должны быть декларативными и контролироваться версиями. Также развертывание приложений и управление их жизненным циклом должно быть автоматизированным, аудиторным и понятным. Все это можно сделать с помощью Argo.

Argo CD придерживается тех же шаблонов и принципов GitOps, следовательно, поддерживает состояние вашего кластера, используя декларативный подход. Синхронизация происходит через репозиторий Git, где хранятся ваши манифесты Kubernetes. Манифесты Kubernetes могут быть указаны несколькими способами:

Как и каждое приложение, запущенное в кластере Kubernetes, Argo CD настраивается с помощью определений пользовательских ресурсов (CRD), хранящихся внутри YAML-манифестов. Самый важный из них – это CRD Application. В приложении Argo CD вы определяете, какой репозиторий Git должен использоваться для синхронизации с каким кластером Kubernetes. Это может быть тот же кластер Kubernetes, где развернут Argo CD, или внешний.

Argo CD реализован как контроллер Kubernetes, который непрерывно отслеживает работающие приложения и сравнивает текущее (или актуальное) состояние с желаемым целевым состоянием (как указано в репозитории Git). Развернутое приложение, у которого актуальное состояние отличается от целевого, считается OutOfSync. Argo CD отображает и визуализирует различия, предоставляя возможности автоматической или ручной синхронизации актуального состояния обратно к желаемому целевому состоянию.

Argo CD предлагает множество функций, наиболее заметные из которых:

  • Поддержка нескольких инструментов управления конфигурациями/шаблонизации, таких как: Kustomize, Helm, Ksonnet, Jsonnet, plain-YAML.
  • Способность управлять и развертывать на нескольких кластерах.
  • Интеграция SSO (OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn).
  • Многопользовательский режим и политики RBAC для авторизации.
  • Анализ статуса здоровья ресурсов приложения.
  • Откат/Откатить к любой настроенной конфигурации приложения, зафиксированной в репозитории Git.
  • Автоматизированное обнаружение и визуализация “дрейфа” конфигурации.
  • Веб-интерфейс, предоставляющий в реальном времени обзор активности приложения.
  • Интерфейс командной строки для автоматизации и интеграции с CI.
  • Интеграция с вебхуками (GitHub, BitBucket, GitLab).
  • Хуки PreSync, Sync, PostSync для поддержки сложных развертываний приложений (например, blue/green и обновления по канарейкам).
  • Метрики Prometheus.

В этом руководстве вы узнаете, как:

  • Использовать Helm для развёртывания Argo CD на ваш кластер DOKS.
  • Синхронизировать состояние приложений вашего кластера Kubernetes с репозиторием Git (используя принципы GitOps).
  • Развертывать и управлять приложениями через Argo CD.

По завершении всех шагов этого руководства у вас должен быть кластер DOKS с развернутым Argo CD, который будет:

  • Обрабатывать согласование кластера, через CRD-объекты Application.
  • Управлять выпусками Helm, используя источники Helm, определенные внутри объектов CRD приложений.

Обзор DOKS и Argo CD для Helm Releases

Ниже приведена схема того, как Argo CD управляет приложениями Helm, размещенными с использованием репозитория Git:

Содержание

Предварительные требования

Для выполнения этого учебного пособия вам понадобятся:

  1. A working DOKS cluster that you have access to. Please follow the Starter Kit DOKS Setup Guide to find out more.to find out more.
  2. A GitHub repository and branch, to store Argo CD and your applications manifests. Must be created beforehand.
  3. A Git client, for cloning the Starter Kit repository.
  4. CLI Kubectl, для взаимодействия с Kubernetes. Следуйте этим инструкциям, чтобы подключиться к вашему кластеру с помощью kubectl и doctl.
  5. Argo CLI, для взаимодействия с Argo CD с помощью интерфейса командной строки.
  6. Kubeseal, для шифрования секретов и взаимодействия с контроллером Sealed Secrets.
  7. Helm, для управления релизами и обновлений Argo CD (необязательно, но рекомендуется в общем для систем в производстве).

Понимание концепций Argo CD для развертывания приложений

Argo CD использует основной концепт Приложения для управления развертыванием и жизненным циклом приложений. Внутри манифеста приложения Argo CD вы определяете Git-репозиторий, хранящий определения вашего приложения, а также соответствующий кластер Kubernetes для развертывания приложений. Другими словами, приложение Argo CD определяет отношение между исходным репозиторием и кластером Kubernetes. Это очень лаконичный и масштабируемый дизайн, позволяющий ассоциировать несколько источников (Git-репозиториев) и соответствующих кластеров Kubernetes.

A major benefit of using applications is that you don’t need to deploy Argo to each cluster individually. You can use a dedicated cluster for Argo, and deploy applications to all clusters at once from a single place. This way, you avoid Argo CD downtime or loss, in case other environments have issues or get decommissioned.

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

Starter Kit использует default проект для быстрого старта с использованием Argo CD. Затем вы узнаете, как создать Application для каждого компонента Starter Kit и использовать Helm charts в качестве исходного кода приложения. Argo CD не ограничивается только источниками Helm, и вы также можете использовать мощь Kustomize, Ksonnet, Jsonnet и т. д. Пожалуйста, ознакомьтесь с страницей исходных кодов приложений для получения более подробной информации.

Хотя вы можете использовать графический интерфейс пользователя (веб-интерфейс) Argo CD для создания приложений, Starter Kit полагается на декларативный способ GitOps, с помощью YAML-манифестов. Каждая конфигурация YAML действует как рецепт для каждого приложения, поэтому ее можно сохранить в репозитории Git. Это означает, что вы всегда можете воссоздать свою установку Argo CD, если воссоздадите свою среду или перейдете на другой кластер. Более важно, вы можете проводить аудиты и отслеживать каждое изменение через историю Git. Хорошей практикой также является иметь файлы конфигурации Argo CD в отдельном репозитории Git, чем тот, который используется для разработки вашего приложения. Вы можете прочитать лучшую страницу практик на официальном веб-сайте документации Argo CD для получения дополнительной информации по этой теме.

Важное примечание:
Важным аспектом, который следует иметь в виду, является то, что по умолчанию Argo CD не автоматически синхронизирует ваши новые приложения. Когда приложение ArgoCD впервые создается, его состояние – OutOfSync. Это означает, что состояние репозитория Git, на который указывает приложение ArgoCD, не соответствует состоянию кластера Kubernetes. Создание нового приложения ArgoCD не запускает автоматическое развертывание в целевом кластере.

Для включения автоматической синхронизации и удаления устаревших ресурсов (очистки) вам необходимо создать syncPolicy. Вы также можете настроить Argo CD на автоматическое откатывание ручных изменений, внесенных с помощью kubectl. Больше информации о политиках автоматической синхронизации можно найти на официальном веб-сайте документации.

Типичный CRD приложения, использующий источник из репозитория Git, выглядит следующим образом:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-apps
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: my-apps
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Пояснения к вышеуказанной конфигурации:

  • spec.project: Сообщает Argo CD, какой проект использовать для приложения (default в этом примере).
  • spec.source.repoURL: URL репозитория Git, используемого для синхронизации состояния кластера.
  • spec.source.targetRevision: Ревизия репозитория Git, используемая для синхронизации (также может быть именем ветки или тега).
  • spec.source.path: Путь репозитория Git, где хранятся исходные файлы (YAML манифесты).
  • spec.destination.server: Адрес целевого кластера Kubernetes. Обычно указывает на https://kubernetes.default.svc, если Argo CD используется в том же кластере, где он развернут.
  • spec.destination.namespace: Пространство имен Kubernetes, которое следует использовать для вашего приложения.
  • spec.syncPolicy.automated: Включает автоматическую синхронизацию приложений в вашем кластере с репозиторием Git.
  • spec.syncPolicy.automated.prune: Параметр prune указывает, следует ли удалять ресурсы из кластера, которые больше не найдены в источниках в рамках автоматической синхронизации.
  • spec.syncPolicy.automated.selfHeal: Указывает, следует ли восстанавливать ресурсы обратно в их желаемое состояние при ручной модификации в кластере (например, через kubectl).

Вы также можете использовать репозитории Helm в качестве источника для установки приложений в вашем кластере. Типичный CRD приложения, использующий источник репозитория Helm, выглядит примерно следующим образом (аналогично примеру с репозиторием Git, за исключением использования репозитория Helm chart):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sealed-secrets
  namespace: argocd
spec:
  project: default
  source:
    chart: sealed-secrets
    repoURL: https://bitnami-labs.github.io/sealed-secrets
    targetRevision: 2.4.0
    helm:
      releaseName: sealed-secrets
      values: |
        replicaCount: 2
  destination:
    server: "https://kubernetes.default.svc"
    namespace: kubeseal

Объяснения для вышеприведенной конфигурации:

  • spec.source.chart: Чарт Helm, который следует использовать в качестве источника для приложения.
  • spec.source.repoURL: URL репозитория чартов Helm.
  • spec.source.targetRevision: Версия чарта Helm, которую следует использовать для приложения.
  • spec.source.helm.releaseName: Имя релиза Helm, которое следует создать в вашем кластере Kubernetes.
  • spec.source.helm.values: Указывает значения Helm, которые следует передать в шаблон helm, обычно определяются как блок.
  • spec.destination.server: Адрес целевого кластера Kubernetes. Обычно указывает на https://kubernetes.default.svc, если Argo CD использует тот же кластер, где он развернут.
  • spec.destination.namespace: Пространство имен Kubernetes, используемое для вашего приложения.

Пожалуйста, продолжите и ознакомьтесь с дополнительной информацией о базовых концепциях Argo CD на официальном веб-сайте документации. Затем вы узнаете о доступных вариантах установки для развертывания Argo CD в вашем кластере Kubernetes.

Установка Argo CD

Argo CD можно установить с помощью kubectl или Helm:

  1. Используя kubectl и файл манифеста установки. Этот метод не предоставляет прямого контроля над различными параметрами установки. Если вы не очень знакомы с установками на основе Helm, это самый простой вариант для начала.
  2. Установка с помощью Helm. Предлагает более детальный контроль за развертыванием и жизненным циклом приложения Argo CD. Рекомендуется для настройки HA (высокой доступности) и если Argo CD используется в производственной среде.

Затем, в зависимости от необходимых функций, у вас есть два варианта:

  • Режим Мульти-арендатора. Этот тип установки обычно используется для обслуживания нескольких команд разработчиков приложений в организации и поддерживается командой платформы. Конечные пользователи могут получить доступ к Argo CD через API-сервер с использованием веб-интерфейса или CLI argocd.
  • Режим только Core. Это урезанная установка без графического пользовательского интерфейса, сервера API, SSO и т. д., и устанавливает легковесную (не-HA) версию каждого компонента.

Starter Kit использует режимы Multi-Tenant и High Availability для установки Argo CD в ваш кластер DOKS. Таким образом, у вас будет надежная настройка, и вы сможете изучить все доступные функции, включая пользовательский интерфейс. Пожалуйста, посетите страницу документации по методам установки, чтобы получить более подробную информацию по этой теме.

Установка на основе Kubectl

Этот метод требует kubectl и состоит из двух шагов:

  1. Создайте namespace для развертывания самого Argo CD.
  2. Запустите манифест установки HA с помощью kubectl.

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

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

Теперь проверьте успешность установки. Сначала проверьте, все ли развертывания Argo CD здоровы:

kubectl get deployments -n argocd

Вывод будет похож на следующий (проверьте столбец READY – все Pods должны быть запущены):

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 51s argocd-dex-server 1/1 1 1 50s argocd-notifications-controller 1/1 1 1 50s argocd-redis-ha-haproxy 3/3 3 3 50s argocd-repo-server 2/2 2 2 49s argocd-server 2/2 2 2 49s

Для режима HA сервер Argo CD должен иметь минимальное значение replicaset равное 2. Если по какой-то причине некоторые развертывания не здоровы, пожалуйста, проверьте события Kubernetes и журналы для затронутых компонентов Pods.

Установка на основе Helm

Для этого метода необходимо установить Helm на вашем локальном компьютере. Набор инструментов предоставляет файл значений Helm, готовый к использованию, чтобы начать работу, и устанавливает Argo CD в режиме HA (без автомасштабирования).

Пожалуйста, выполните следующие шаги, чтобы завершить установку на основе Helm:

  1. Сначала клонируйте каталог Starter Kit (если еще этого не сделано) и перейдите в каталог вашей локальной копии:
git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git
cd Kubernetes-Starter-Kit-Developers
  1. Затем добавьте репозиторий Helm Argo CD:
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update argo 
  1. Теперь выполните поиск доступных для установки диаграмм в репозитории Helm argo:
helm search repo argo

Вывод будет похож на:

Output
NAME CHART VERSION APP VERSION DESCRIPTION argo/argo 1.0.0 v2.12.5 A Helm chart for Argo Workflows argo/argo-cd 4.9.4 v2.4.0 A Helm chart for Argo CD, a declarative, GitOps... ...
  1. Затем откройте и проверьте файл значений Helm Argo CD, предоставленный в репозитории Starter Kit, используя редактор на ваш выбор (желательно с поддержкой YAML-линта). Например, вы можете использовать VS Code:
code 14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v4.9.4.yaml
  1. Наконец, разверните Argo CD на своем кластере DOKS:
HELM_CHART_VERSION="4.9.4"
helm install argocd argo/argo-cd --version "${HELM_CHART_VERSION}" \
  --namespace argocd \
  --create-namespace \
  -f "14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v${HELM_CHART_VERSION}.yaml"

–create-namespace \

Примечание:
Используется конкретная версия диаграммы Helm. В данном случае выбрана версия 4.9.4, которая соответствует версии приложения 2.4.0. Это хорошая практика в целом, заблокировать на конкретной версии. Это помогает получать предсказуемые результаты и позволяет контролировать версии с помощью Git.

helm ls -n argocd

Теперь проверьте, была ли успешной установка релиза Helm:

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
argocd  argocd          1               2022-03-23 11:22:48.486199 +0200 EET    deployed        argo-cd-4.9.4   v2.4.0

Выходной вид аналогичен (значение столбца STATUS должно быть установлено в deployed):

kubectl get deployments -n argocd

Наконец, проверьте состояние развертывания приложения Argo CD:

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 2m9s argocd-dex-server 1/1 1 1 2m9s argocd-notifications-controller 1/1 1 1 2m9s argocd-redis-ha-haproxy 3/3 3 3 2m9s argocd-repo-server 2/2 2 2 2m9s argocd-server 2/2 2 2 2m9s

Выходной вид аналогичен (проверьте столбец READY – все Pods должны быть запущены):

Сервер Argo CD должен иметь минимальное значение replicaset равное 2 для режима HA. Если по какой-либо причине некоторые развертывания не работают корректно, пожалуйста, проверьте события Kubernetes и журналы для затронутых компонентов Pods.

Вы также можете найти больше информации о Helm-чарте Argo CD, обратившись к общественно поддерживаемому репозиторию.

Затем вы узнаете, как получить доступ и исследовать основные функции графического пользовательского интерфейса, предоставленного Argo CD.

Доступ и исследование веб-интерфейса Argo CD

Одна из интересных особенностей, которую предлагает Argo CD, – это веб-интерфейс, используемый для выполнения различных административных задач и просмотра статуса развертывания приложений. Вы можете создавать приложения, используя графический интерфейс пользователя, и взаимодействовать с Argo CD различными способами. Еще одной важной функцией является возможность проверки состояния каждого приложения и доступ к событиям Kubernetes, а также к журналам вашего приложения. Более того, Argo CD предоставляет визуальное представление всех объектов Kubernetes (репликационные наборы, поды и т. д.), используемых каждым развертыванием приложения.

kubectl port-forward svc/argocd-server -n argocd 8080:443

Веб-интерфейс можно получить, портовидя службу Kubernetes argocd-server. Выполните следующую команду в оболочке терминала:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

Теперь откройте веб-браузер и перейдите на localhost:8080 (в настоящее время проигнорируйте недействительные сертификаты TLS). Вы увидите страницу входа в Argo CD. Имя пользователя администратора по умолчанию – admin, а пароль генерируется случайным образом при установке. Вы можете получить его, выполнив следующую команду:

Затем вы будете перенаправлены на страницу панели приложений. Отсюда вы можете просматривать, создавать или управлять приложениями через интерфейс (доступен также редактор YAML), а также выполнять операции синхронизации или обновления:

Если вы щелкнете по любому плитке приложения, также будет показано визуальное представление всех задействованных объектов:

В следующем разделе вы можете управлять вашими проектами приложений, репозиториями и кластерами:

Наконец, раздел с информацией о пользователе показывает доступных пользователей и позволяет обновлять пароль администратора:

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

Знакомство с CLI Argo CD

argocd
Usage:
  argocd [flags]
  argocd [command]

Available Commands:
  account     Manage account settings
  admin       Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access
  app         Manage applications
  cert        Manage repository certificates and SSH known hosts entries
  cluster     Manage cluster credentials
  completion  output shell completion code for the specified shell (bash or zsh)
  context     Switch between contexts
  gpg         Manage GPG keys used for signature verification
  help        Help about any command
...

Argo CD позволяет использовать тот же набор функций как через веб-интерфейс, так и через CLI. Чтобы использовать CLI argocd, вам нужно открыть отдельное окно оболочки и просто ввести argocd без аргументов. По умолчанию он отобразит доступные команды и параметры:

argocd app --help

Для любой команды или подкоманды вы можете вызвать соответствующую страницу справки, используя следующий шаблон: argocd <команда/подкоманда> --help. Например, если вы хотите проверить, какие параметры доступны для команды app:

Manage Applications
Usage:
  argocd app [flags]
  argocd app [command]

Examples:
  Вывод выглядит аналогично:
  argocd app list
  
  # Вывести список всех приложений.
  argocd app get my-app
...

# Получить детали приложения

Пожалуйста, продолжайте изучать другие команды/подкоманды, чтобы увидеть все доступные параметры. Затем вы узнаете, как настроить ваше первое приложение Argo CD, которое автоматически развернет все компоненты Starter Kit.

Загрузка приложений Argo CD

При свежей установке Argo CD не знает, откуда синхронизировать ваши приложения или какие репозитории Git доступны для загрузки манифестов приложений. Поэтому первым шагом является выполнение одноразовой операции, называемой загрузкой приложений. Все операции, представленные в этом разделе, можно выполнить с помощью интерфейса командной строки argocd или графического интерфейса пользователя.

Существует несколько способов загрузки вашего кластера (например, с помощью скриптов), но обычно пользователи Argo CD используют шаблон приложения приложений. Это означает, что вы начнете с создания родительского приложения с использованием интерфейса командной строки good (или веб-интерфейса), которое в свою очередь будет ссылаться на и загружать остальные приложения в вашем кластере Kubernetes.

Подготовка структуры репозитория Git

clusters
└── dev
    └── helm
        ├── cert-manager-v1.8.0.yaml
        ├── nginx-v4.1.3.yaml
        ├── prometheus-stack-v35.5.1.yaml
        ├── sealed-secrets-v2.4.0.yaml
        └── velero-v2.29.7.yaml

Сначала вам нужно подготовить свой репозиторий Git для использования согласованной структуры. В следующем примере вы создадите структуру макета репозитория Git, аналогичную:

  1. Пожалуйста, откройте терминал и выполните следующие шаги для создания макета вашего репозитория Git:
git clone <YOUR_ARGOCD_GIT_REPOSITORY_ADDRESS>
  1. Сначала клонируйте свой git-репозиторий, используемый для тестирования Argo CD (убедитесь, что замените соответствующие заполнители <>):
cd <YOUR_GIT_REPO_LOCAL_COPY_DIRECTORY>
mkdir -p clusters/dev/helm
  1. Затем измените каталог на вашу локальную копию и создайте структуру каталогов (убедитесь, что замените соответствующие заполнители <>):
CERT_MANAGER_CHART_VERSION="1.8.0"
NGINX_CHART_VERSION="4.1.3"
PROMETHEUS_CHART_VERSION="35.5.1"
SEALED_SECRETS_CHART_VERSION="2.4.0"
VELERO_CHART_VERSION="2.29.7"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml" > "clusters/dev/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/nginx-v${NGINX_CHART_VERSION}.yaml" > "clusters/dev/helm/nginx-v${NGINX_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml" > "clusters/dev/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml" > "clusters/dev/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/velero-v${VELERO_CHART_VERSION}.yaml" > "clusters/dev/helm/velero-v${VELERO_CHART_VERSION}.yaml"
  1. Скопируйте манифесты приложений, предоставленные для каждого компонента в репозитории Starter Kit (вы также можете посмотреть и посмотреть, как структурирован каждый манифест):

Наконец, зафиксируйте изменения и отправьте их в основной репозиторий.

Затем вы создадите развертывание родительского приложения и позволите Argo CD автоматически синхронизировать все приложения Starter Kit с вашим кластером DOKS.

Использование шаблона приложений через интерфейс командной строки Argo CD

В этом разделе вы узнаете, как использовать CLI argocd для создания и использования шаблона app of apps для развертывания всех компонентов Starter Kit в вашем кластере DOKS. Ниже приведена основная концепция:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Сначала вам нужно перенаправить порт Argo CD основного сервера на вашем локальном компьютере в отдельном окне терминала:

ADMIN_USER="admin"
ADMIN_PASSWD="$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)"
argocd login localhost:8080 --username $ADMIN_USER --password $ADMIN_PASSWD --insecure

Затем требуется доступ к серверу API Argo CD для работы argocd CLI. Используя другое окно терминала, вам необходимо аутентифицировать клиент argocd с вашим экземпляром сервера Argo CD:

Output
'admin:login' logged in successfully Context 'localhost:8080' updated

Выходной результат будет похож на:

argocd app create starter-kit-apps \
    --dest-namespace argocd \
    --dest-server https://kubernetes.default.svc \
    --repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
    --path clusters/dev/helm

Затем выполните следующую команду для создания родительского приложения starter-kit-apps (убедитесь, что заменили заполнители <> соответствующим образом):

  • –dest-namespace argocd \
  • –dest-server https://kubernetes.default.svc \
  • Вышеуказанная команда создаст новое приложение Argo CD с именем starter-kit-apps в пространстве имен argocd, настроенное:

Целевой кластер Kubernetes, где развернут Argo CD, потому что параметр --dest-server установлен на https://kubernetes.default.svc.

argocd app sync starter-kit-apps 

Используйте репозиторий GitHub, установленный аргументом --repo, чтобы синхронизировать ваш кластер.

Output
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd sealed-secrets-controller OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd velero OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd ingress-nginx OutOfSync Missing ... ... GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE argoproj.io Application argocd sealed-secrets-controller Synced application.argoproj.io/sealed-secrets-controller created argoproj.io Application argocd ingress-nginx Synced application.argoproj.io/ingress-nginx created argoproj.io Application argocd kube-prometheus-stack Synced application.argoproj.io/kube-prometheus-stack created argoproj.io Application argocd velero Synced application.argoproj.io/velero created argoproj.io Application argocd cert-manager Synced application.argoproj.io/cert-manager created

Сканируйте и применяйте все манифесты приложений, найденные в каталоге clusters/dev/helm (аргумент --path).

Затем вам нужно синхронизировать приложение starter-kit-apps (помните, что Argo CD не синхронизирует ничего по умолчанию, если не указано иное):

argocd app list

Выходной результат будет похож на:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY ... ingress-nginx https://kubernetes.default.svc ingress-nginx default OutOfSync Missing Auto-Prune ... cert-manager https://kubernetes.default.svc cert-manager default OutOfSync Missing Auto-Prune ... kube-prometheus-stack https://kubernetes.default.svc monitoring default OutOfSync Missing Auto-Prune ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default OutOfSync Missing Auto-Prune ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune ...

После завершения вышеуказанной команды вы должны увидеть новое приложение в основной панели управления вашего сервера Argo CD. Пожалуйста, откройте веб-браузер и перейдите по адресу http://localhost:8080. Затем выберите вкладку Applications и кликните на плитку starter-kit-apps (обратите внимание на шаблон app of apps, посмотрев на граф составления):

argocd app sync -l argocd.argoproj.io/instance=starter-kit-apps

Вы также можете проверить новые приложения через CLI:

Вывод выглядит аналогично:

argocd app list

Родительское приложение starter-kit-apps появится как синхронизированное, но дочерние приложения будут не синхронизированы. Затем вы можете либо синхронизировать все через веб-интерфейс, либо через CLI:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS ... ingress-nginx https://kubernetes.default.svc ingress-nginx default Synced Healthy Auto-Prune <none> ... cert-manager https://kubernetes.default.svc cert-manager default Synced Healthy Auto-Prune <none> ... kube-prometheus-stack https://kubernetes.default.svc monitoring default Synced Healthy Auto-Prune <none> ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default Synced Healthy Auto-Prune <none> ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune SyncError ...

Операция синхронизации может занять некоторое время (до 5-10 минут), в зависимости от сложности и количества объектов Kubernetes всех развертываемых приложений.

Через некоторое время, пожалуйста, снова выведите список всех приложений:

argocd app create starter-kit-apps \
  --dest-namespace argocd \
  --dest-server https://kubernetes.default.svc \
  -repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
  --path clusters/dev/helm \
   --sync-policy automated \
  --auto-prune \
  --self-heal
  • Вывод будет похожим на следующий (обратите внимание, что все приложения теперь синхронизированы):
argocd app get velero

Развертывание приложения Velero завершится неудачно и будет оставлено специально в состоянии SyncError как упражнение для читателя, чтобы познакомиться и научиться диагностировать проблемы приложений в Argo CD. Пожалуйста, обратитесь к разделу Подсказки ниже, чтобы узнать, как диагностировать проблемы с приложением Argo CD.
Инициализация родительского приложения — это операция, выполняемая один раз. При последующих изменениях Git для каждого приложения Argo CD обнаружит отклонение и применит необходимые изменения. Argo CD по умолчанию использует механизм опроса для обнаружения изменений в вашем Git-репозитории. Интервал обновления по умолчанию установлен в 3 минуты. Вместо полагания на механизм опроса вы также можете использовать возможности Git-вебхуков. Пожалуйста, посетите официальный сайт документации, чтобы узнать, как создать и настроить Argo CD для использования вебхуков Git.

Output
Name: velero Project: default Server: https://kubernetes.default.svc Namespace: velero URL: https://argocd.example.com/applications/velero Repo: https://vmware-tanzu.github.io/helm-charts Target: 2.27.3 Path: SyncWindow: Sync Allowed Sync Policy: Automated (Prune) Sync Status: OutOfSync from 2.27.3 Health Status: Missing CONDITION MESSAGE LAST TRANSITION SyncError Failed sync attempt to 2.27.3: one or more objects failed to apply (dry run) (retried 5 times). 2022-03-24 12:14:21 +0200 EET GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE velero.io VolumeSnapshotLocation velero default Failed SyncFailed PostSync error validating data: ValidationError(VolumeSnapshotLocation.spec): missing required field "provider" in io.velero.v1.VolumeSnapshotLocation.spec velero.io BackupStorageLocation velero default Failed SyncFailed PostSync error validating data: [ValidationError(BackupStorageLocation.spec.objectStorage): missing required field "bucket" in io.velero.v1.BackupStorageLocation.spec.objectStorage, ValidationError(BackupStorageLocation.spec): missing required field "provider" in io.velero.v1.BackupStorageLocation.spec] ...

Подсказки: Если вы хотите, чтобы родительское приложение синхронизировалось автоматически (и также включило автоматическое восстановление и автоматическое удаление), вы можете использовать следующую команду (не забудьте заменить заполнители <> соответствующим образом):

–dest-namespace argocd \

–dest-server https://kubernetes.default.svc \

–sync-policy automated \

–auto-prune \

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

В случае любых сбоев синхронизации вы всегда можете проверить события Kubernetes для интересующего вас приложения (через argocd app get <application_name>):

Вывод выглядит примерно так:

  • Затем вы узнаете, как использовать app of apps pattern и выполнить те же шаги через графический интерфейс пользователя Argo CD.
  • Использование шаблона App of Apps через веб-интерфейс Argo CD
  • В этом разделе вы узнаете, как использовать веб-интерфейс Argo CD для создания и использования шаблона app of apps для развертывания всех компонентов Starter Kit в вашем кластере DOKS. Ниже приведена иллюстрация основной концепции:

  • Как показано на диаграмме выше, создание нового приложения через веб-интерфейс очень похоже на аналог в командной строке. Единственное отличие заключается в том, что вы будете перемещаться между различными панелями/окнами и использовать операции указания и щелчка. За кулисами Argo CD будет создавать необходимые CRD-объекты приложений и применять изменения к вашему кластеру Kubernetes.

  • Сначала откройте веб-браузер и войдите в веб-консоль Argo CD. Имя пользователя по умолчанию – admin, а пароль по умолчанию можно получить с помощью:

  • После входа вы будете перенаправлены на страницу панели приложений (при первоначальной установке панель приложений пуста). Затем нажмите на кнопку Create Application. Появится новая панель с запросом данных о приложении:
  • Пожалуйста, заполните каждое поле соответствующим образом:

Название приложения: Новое название приложения (например, starter-kit-apps).

Проект: Название проекта, к которому принадлежит это приложение (при использовании Argo CD впервые, можно использовать default).

Политика синхронизации и Опции синхронизации: Настройка политики синхронизации и параметров (например, Manual, Automatic, количество повторов, интервал между повторами и т. д.).

Исходный URL репозитория: Адрес вашего репозитория GitHub – например, https://github.com/<ВАШ_ЛОГИН_GITHUB>/<ИМЯ_РЕПОЗИТОРИЯ_ARGOCD_GITHUB>.git.

Исходный Путь: Путь к каталогу репозитория GitHub, где хранятся манифесты приложения (например, clusters/dev/helm).

Целевой URL кластера: Целевой кластер Kubernetes для синхронизации с вашим репозиторием GitHub (например, https://kubernetes.default.svc для локального кластера, где развернут Argo CD).

Целевое Пространство имен: Пространство имен кластера Kubernetes, которое используется для приложений Argo CD (argocd, обычно).

После заполнения всех данных о приложении нажмите кнопку Создать вверху. На странице панели приложений появится новый плиточный элемент приложения:

Если вы нажмете на плитку приложения, вы сможете наблюдать шаблон приложения, глядя на граф композиции:

Если вы посмотрите на изображение выше, вы заметите, что все приложения помечены как OutOfSync. Следующим шагом будет запуск операции синхронизации на родительском приложении. Затем все дочерние приложения также будут синхронизированы. Пожалуйста, нажмите на кнопку Sync на плитке родительского приложения. На правой стороне появится новая панель (обратите внимание, что все дочерние приложения выбраны внизу):

Оставьте значения по умолчанию, затем нажмите кнопку Synchronize вверху и посмотрите, как Argo CD каскадирует операцию синхронизации на все приложения:

Развертывание приложения Velero завершится с ошибкой и останется специально в состоянии SyncError в качестве упражнения для читателя, чтобы познакомиться с и узнать, как диагностировать проблемы с приложением в Argo CD. Пожалуйста, обратитесь к разделу Подсказки ниже, чтобы узнать, как диагностировать проблемы с приложениями Argo CD.

Если все пройдет успешно, у всех приложений должна быть зеленая рамка, а статус должен быть Healthy и Synced. Процесс инициализации выполняется один раз. При последующих изменениях в Git для каждого приложения Argo CD обнаружит изменения и применит необходимые изменения. По умолчанию Argo CD использует механизм опроса для обнаружения изменений в вашем Git-репозитории. Интервал обновления по умолчанию установлен на 3 минуты. Вместо использования механизма опроса вы также можете воспользоваться возможностями веб-уведомлений Git. Пожалуйста, посетите официальный сайт документации, чтобы узнать, как создать и настроить Argo CD для использования Git веб-уведомлений.

Подсказки:
При необходимости вы можете настроить автоматическую синхронизацию родительского приложения, установив значение поля SYNC POLICY на Automatic. Чтобы включить автоматическое восстановление и автоматическое удаление, отметьте флажки PRUNE RESOURCES и SELF HEAL:

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

Затем щелкните по ссылке сообщения Sync failed, выделенной красным цветом, из раздела LAST SYNC RESULT в заголовке страницы приложения. Появится новая панель, показывающая полезную информацию о том, почему операция синхронизации не удалась:

Application Sets – еще одна мощная функция, предлагаемая Argo CD. ApplicationSet Controller – это подпроект Argo CD, который добавляет автоматизацию приложений с помощью шаблонных определений. Эта функция помогает избежать повторений в ваших манифестах приложений (используйте принцип DRY).

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app
spec:
  generators:
    - list:
        elements:
          - cluster: dev
            url: https://kubernetes.dev.svc
          - cluster: qa
            url: https://kubernetes.qa.svc
          - cluster: prod
            url: https://kubernetes.prod.svc
  template:
    metadata:
      name: '{{cluster}}-app'
    spec:
      project: default
      source:
        repoURL: https://github.com/myrepo/my-applicationset.git
        targetRevision: HEAD
        path: clusters/{{cluster}}/my-apps
      destination:
        server: '{{url}}'
        namespace: argocd

Контроллер ApplicationSet устанавливается наряду с Argo CD (в том же пространстве имен), и он автоматически генерирует приложения Argo CD на основе содержимого нового настраиваемого ресурса ApplicationSet (CR).

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-app
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-applicationset.git
    targetRevision: HEAD
    path: clusters/dev/my-apps
  destination:
    server: https://kubernetes.dev.svc
    namespace: argocd

Примечание:
Начиная с версии 2.3.x Argo CD, вам не нужно устанавливать ApplicationSet Controller отдельно, потому что он является частью основной установки Argo CD. Starter Kit использует версию >= 2.3.1, поэтому вам ничего не нужно изменять.

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

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

Генератор кластера: Использует определенные Argo CD кластеры для шаблонизации приложений.

argocd app delete starter-kit-apps

Генератор Git: Использует файлы/каталоги репозитория Git для шаблонизации приложений.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
...

Типичный CRD ApplicationSet, использующий генератор списка, выглядит следующим образом:

Применение вышеупомянутого ApplicationSet к вашему кластеру Kubernetes приведет к созданию трех приложений Argo CD. Например, приложение для среды dev будет создано следующим образом:

Шаблонные движки очень мощны по своей природе и предлагают множество возможностей. Пожалуйста, посетите основной веб-сайт документации ApplicationSet, чтобы узнать больше об этой функции.

Удаление приложений Argo CD

Удаление (или удаление) приложений, управляемых Argo CD, выполняется путем удаления соответствующего манифеста из исходного репозитория Git. В случае приложений, созданных с использованием шаблона приложений, вам нужно удалить только родительское приложение (либо через интерфейс командной строки, либо через веб-интерфейс). Затем все дочерние приложения будут удалены вместе с ними в рамках процесса.

  • Как удалить родительское приложение starter-kit-apps (включая дочерние приложения) с использованием CLI argocd:
  • Если вы хотите убедиться, что дочерние приложения и все их ресурсы будут удалены при удалении родительского приложения, убедитесь, что добавили соответствующий finalizer в ваше определение приложения:

Source:
https://www.digitalocean.com/community/developer-center/implementing-gitops-using-argo-cd