Argo#
Argo — это комплекс инструментов управления GitOps для DropApp.
Argo CD, Argo Workflows, Argo Rollouts и Argo Events - это отдельные инструменты, которые могут быть использованы вместе для создания полноценной системы управления и мониторинга рабочих процессов в DropApp:
Argo CD (Continuous Delivery) - это инструмент для непрерывной доставки приложений в DropApp. Позволяет автоматически развертывать и обновлять приложения в кластере DropApp, основываясь на изменениях в исходном коде или конфигурации.
Argo Workflows - это инструмент для управления рабочими процессами в DropApp. Позволяет создавать, запускать и отслеживать рабочие процессы, состоящие из нескольких контейнеров или задач.
Argo Rollouts - это инструмент для управления обновлениями приложений в DropApp. Позволяет выполнять постепенные обновления приложений, отслеживать их состояние и откатывать изменения в случае необходимости.
Argo Events - это инструмент для мониторинга и управления событиями в DropApp. Позволяет отслеживать события, происходящие в кластере, и автоматически реагировать на них, запуская определенные рабочие процессы или уведомляя администраторов.
Все эти инструменты могут быть использованы вместе для создания комплексной системы управления и мониторинга рабочих процессов в DropApp.
Argo CD#
Argo CD - инструмент для непрерывной доставки приложений, который использует модель GitOps для управления настройками DropApp-кластера. Это означает, что репозиторий Git используется в качестве единственного истинного источника для системы управления доставкой приложений. Argo CD может автоматически обновлять приложения в DropApp-кластере при изменениях в репозитории Git.
Argo CD предоставляет функции:
Автоматизированное развертывание приложений в указанных целевых средах.
Управление конфигурациями: обеспечивает возможность хранения конфигураций приложений в репозитории Git, управление изменениями и версионирование конфигураций.
Поддержка различных инструментов управления конфигурациями: поддерживает различные инструменты, такие как Kustomize, Helm, Jsonnet, plain-YAML, что обеспечивает гибкость в выборе инструментов шаблонизации.
Многокластерное развертывание: позволяет управлять приложениями в нескольких кластерах DropApp.
Интеграция SSO: поддерживает интеграцию с различными протоколами единого входа, такими как OIDC, OAuth2, LDAP, SAML 2.0, а также интеграцию с популярными сервисами авторизации, такими как GitHub, GitLab.
Многозадачность и управление доступом RBAC: обеспечивает возможность определения ролей и политик управления доступом для безопасной авторизации.
Откат к предыдущим конфигурациям: позволяет легко откатываться к предыдущим версиям конфигураций приложений в случае неудачного развертывания.
Мониторинг состояния приложения: предоставляет инструменты для анализа состояния здоровья ресурсов приложения.
Обнаружение и визуализация изменений конфигурации: автоматически обнаруживает и визуализирует конфигурации для удобства отслеживания.
Синхронизация приложений: обеспечивает возможность автоматической или ручной синхронизации приложений с их желаемым состоянием.
Веб-интерфейс и CLI: предоставляет удобный веб-интерфейс и CLI для управления приложениями.
Интеграция с webhook: поддерживает интеграцию с webhooks от популярных сервисов контроля версий, таких как GitHub, BitBucket, GitLab.
Токены доступа: обеспечивает возможность создания и использования токенов доступа для автоматизации операций. Токены предоставляют уровень безопасности, контролируя, какие действия и запросы разрешены для конкретных пользователей или приложений.
Hooks для сложных развертываний: поддерживает hooks (PreSync, Sync, PostSync) для поддержки сложных сценариев развертывания (e.g.blue/green & canary upgrades).
Журнал аудита: ведет журнал событий приложения и вызовов API для целей аудита и отладки.
Метрики Prometheus: предоставляет метрики для мониторинга производительности Argo CD.
Переопределение параметров Helm: поддерживает возможность переопределения параметров Helm непосредственно из репозитория Git. Это может быть полезным, если необходимо настроить значения Helm-чартов для различных окружений или специфических требований.
Установка Argo CD#
Для выполнения данного сценария необходимы права администратора.
Установите Argo CD последовательностью команд:
kubectl create namespace argocd kubectl apply -n argocd -f https://<repoexample.ru>/argoproj/argo-cd/stable/manifests/install.yaml # Укажите актуальный путь до локального репозитория # Создайте новое namespace agrocd, в котором будут расположены сервисы Agro CD и ресурсы приложений.Загрузите интерфейс командной строки Argo CD:
kubectl exec -it -n argo <argocdpod> --argo admin initial-password -n argocd
Сценарии использования Argo CD#
Получение доступа к Argo CD API-серверу#
По умолчанию Argo CD API-сервер не имеет внешнего IP-адреса. Чтобы получить доступ, выберите один из следующих способов предоставления доступа к Argo CD API-серверу:
Измените тип службы argocd-server на LoadBalancer:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'Используйте Ingress, чтобы настроить сеть для Argo CD.
Настройте переадресацию порта kubectl для подключения к API-серверу:
kubectl port-forward svc/argocd-server -n argocd 8080:443Также доступ к API-серверу можно получить, используя
https://localhost:8080.
Авторизация и изменение пароля в Argo CD для управления конфигурациями приложений в DropApp#
Войдите с помощью интерфейса командной строки. Первоначальный пароль для учетной записи admin генерируется автоматически и сохраняется в открытом виде в поле
passwordsecret с именемargocd-initial-admin-secret. Получите этот пароль с помощью argocdCLI:argocd admin initial-password -n argocdПримечание
Удалите
argocd-initial-admin-secretиз namespace Argo CD после изменения пароля. Secret хранит только первоначально сгенерированный пароль в открытом виде, и его можно безопасно удалить в любое время. Он будет воссоздан по запросу Argo CD, если потребуется повторно сгенерировать новый пароль администратора.Используя имя пользователя admin и пароль, указанный выше, войдите в систему по IP-адресу или имени хоста Argo CD:
argocd login <ARGOCD_SERVER>Измените пароль с помощью команды:
argocd account update-passwordВышеприведенная команда используется для обновления пароля учетной записи в Argo CD. Argo CD - это инструмент для управления конфигурациями приложений и их развертываниями в DropApp. Эта команда позволяет обновить пароль учетной записи, используемой для аутентификации Argo CD с кластером DropApp.
Создание и развертывание приложения в Argo CD#
Создайте приложение из репозитория. Установите текущее namespace в Argo CD, выполнив следующую команду:
kubectl config set-context --current --namespace=argocdСоздайте приложение с помощью следующей команды:
argocd app create guestbook --repo https://<repoexample.ru>/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default # Укажите актуальный путь до локального репозиторияЭта команда создает новое приложение в Argo CD. Она использует синтаксис
argocd <команда> <параметры>.Арго CD - это инструмент автоматизации, который упрощает развертывание и управление приложениями в DropApp. Он помогает управлять зависимостями между приложениями, а также обеспечивает безопасность и контроль версий.
В данном случае команда
argocd appсоздает новое приложение с именем guestbook и определяет следующие параметры:repo: ссылка на репозиторий приложения, в данном случаеhttps://<repoexample.ru>.com/argoproj/argocd-example-apps.git;path: путь в репозитории, где находится приложение, в данном случае guestbook;dest-server: URL сервера DropApp, на котором будет развернуто приложение;dest-namespace: namespace, в котором будет развернут контейнер приложения.
После выполнения команды Argo CD создаст новый ресурс для приложения и загрузит его в указанный репозиторий.
Проверьте статус приложения:
argocd app get guestbook Name: guestbook Server: https://kubernetes.default.svc Namespace: default URL: https://<IP-address>/applications/guestbook Repo: https://<repoexample.ru>.com/argoproj/argocd-example-apps.git Target: Path: guestbook Sync Policy: <none> Sync Status: OutOfSync from (1ff8a67) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH apps Deployment default guestbook-ui OutOfSync Missing Service default guestbook-ui OutOfSync MissingСостояние приложения изначально находится в статусе
OutOfSync, так как приложение еще не развернуто, а ресурсы DropApp не созданы.Используйте команду для синхронизации приложения
guestbookв Argo CD:argocd app sync guestbookЗапустится приложение. На данном шаге появилась возможность просмотра компонентов ресурсов, журналов, событий и оценки состояния.
Argo Workflows#
Argo Workflows - контейнерно-нативный механизм рабочих процессов с открытым исходным кодом для оркестровки параллельных заданий на DropApp. Argo Workflows реализован как DropApp CRD (Custom Resource Definition). Также он может выполнять CI и CD pipeline.
Argo Workflows предоставляет набор инструментов и компонентов для создания, запуска и управления рабочими процессами:
Argo CLI(Command Line Interface) - это интерфейс командной строки, который позволяет взаимодействовать с Argo Workflows. С его помощью можно создавать, запускать и управлять рабочими процессами.Argoexec- это инструмент, который позволяет выполнять команды в контейнерах DropApp. Используется для запуска задач внутри рабочих процессов Argo Workflows.Workflow-controller- это компонент, который управляет рабочими процессами в DropApp. Отслеживает состояние рабочих процессов, запускает задачи и обеспечивает их корректное выполнение.
Таким образом, Argo Workflows предоставляет удобный и мощный инструмент для управления рабочими процессами в DropApp, который может быть использован для автоматизации различных задач в кластере.
Установка Argo Workflows#
Для выполнения данного сценария необходимы права администратора.
Создайте namespace в кластере DropApp под названием
argo-workflows:kubectl create namespace argo-workflowsПрименяет манифест из указанного URL-адреса в namespace
argo:kubectl apply -n argo -f https://<repoexample.ru>/argoproj/argo-workflows/releases/download/v<3.5.4>/quick-start-minimal.yaml # Укажите актуальный путь до локального репозиторияЗагрузите интерфейс командной строки Argo Workflows:
kubectl exec -it -n argo <argocdpod> --argo admin initial-password -n argo-workflows
Сценарии использования Argo Workflows#
Внедрение Argo Workflows: настройка и развертывание системы мониторинга и управления рабочими процессами в DropApp#
Для использования Argo Workflows выполните последовательность действий, указанную ниже.
Установите патч аутентификации Argo Server:
kubectl patch deployment \ argo-server \ --namespace argo \ --type='json' \ -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": [ "server", "--auth-mode=server" ]}]'Перенесите пользовательский интерфейс: откройте порт-forward для получения доступа к пользовательскому интерфейсу:
kubectl -n argo port-forward deployment/argo-server 2746:2746Команда
kubectl -n argo port-forward deployment/argo-serverзапускает пересылку порта 2746 на хост-машину для контейнера, который находится в deploymentargo-server. В результате пользовательский интерфейс будет доступен по адресу:https://localhost:2746. Из-за самоподписанного сертификата, может возникнуть ошибка TLS 1.2, которую необходимо подтвердить.Команда
kubectl -n argo port-forward deployment/argo-server 2746:2746открывает локальный порт 2746 в машине и перенаправляет трафик на порт 2746 в pod, который соответствует развертываниюargo-serverв namespaceargo. Это позволяет получить доступ к сервису, предоставляемому argo-server, через локальный порт 2746 на машине.Отправьте пример рабочего процесса (CLI):
argo submit -n argo --watch https://<repoexample.ru>/argoproj/argo-workflows/master/examples/hello-world.yaml # Укажите актуальный путь до локального репозиторияФлаг
--watchиспользованный в синтаксисе команды позволит наблюдать за процессом во время выполнения и статусом его завершения.Перечислите все рабочие процессы, выполнив команду:
argo list -n argoВ приведенном примере имя рабочего процесса имеет префикс
hello-world-, за которым следуют случайные символы. Эти символы используются для присвоения рабочим процессам уникальных имен, помогающих идентифицировать конкретные запуски рабочего процесса. При повторной отправке рабочего процесса, следующий запуск процесса будет иметь другое имя.Просмотрите сведения о запуске рабочего процесса, выполнив команду:
argo get -n argo @latestАргумент
@latest CLI— это ярлык для просмотра последнего выполненного рабочего процесса.Просмотрите журналы рабочего процесса, выполнив команду:
argo logs -n argo @latest
Argo Rollouts#
Argo Rollouts - утилита расширения, которая обеспечивает функциональность управления различными типами событий в DropApp. Может автоматически управлять внедрением обновлений приложений, переключением между версиями приложений и откатом к предыдущим версиям приложений в кластере DropApp.
В данном разделе представлены концепции и функции Argo Rollouts: развертывание, обновление, продвижение и прекращение развертывания.
Сценарий использования Argo Rollouts#
Внедрение Argo Rollouts: настройка и развертывание системы мониторинга и управления обновлениями в DropApp#
Для использования Argo Rollouts выполните последовательность действий, указанную ниже.
Разверните ресурс Argo Rollouts:
spec: replicas: 5 strategy: canary: steps: - setWeight: 20 - pause: {} - setWeight: 40 - pause: {duration: 10} - setWeight: 60 - pause: {duration: 10} - setWeight: 80 - pause: {duration: 10}Выше приведен пример развертывания, который использует постепенную стратегию обновления. Такая стратегия называется canary и состоит из следующих шагов:
установка веса на уровне 20% для нового развертывания. Пауза на 1 секунду;
установка веса на уровне 40% для развертывания. Пауза на 2 секунды;
установка веса на уровне 60% для развертывания. Пауза на 3 секунды;
установка веса на уровне 80% для развертывания. Пауза на 4 секунды.
Для каждого шага можно указать любое значение паузы в миллисекундах.
Выполните следующую команду для начального развертывания и службы:
kubectl apply -f https://<repoexample.ru>/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml # Укажите актуальный путь до локального репозиторияСоздание любого развертывания увеличивает масштаб реплик до 100 % (пропуская все этапы постепенного обновления, анализ и т. д.), поскольку обновление не выполнялось.
Выполните следующую команду, которая содержит информацию о создании сервиса в кластере DropApp:
kubectl apply -f https://<repoexample.ru>/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml # Укажите актуальный путь до локального репозиторияЧтобы визуализировать процесс развертывания во времени, запустите команду
get rollout --watch:kubectl argo rollouts get rollout rollouts-demo --watchВыполните следующую команду, чтобы обновить
rollouts-demoразвертывание контейнера:kubectl argo rollouts set image rollouts-demo \ rollouts-demo=argoproj/rollouts-demo:yellowВ приведенном сценарии deployment имеет версию с именем «yellow».
Как и в случае с развертываниями, любое изменение в поле шаблона pod (
spec.template) приводит к развертыванию новой версии (то есть набора реплик). Обновление развертывания включает в себя изменение спецификации развертывания, обычно изменение поля изображения контейнера с новой версией, а затем применение нового манифестаkubectl apply. Для удобства подключаемый модуль развертывания предоставляет командуset image, которая выполняет эти действия на месте объекта динамического развертывания.Во время развертывания обновления контроллер будет выполнять шаги, определенные в стратегии обновления развертывания. Пример развертывания задает вес трафика 20% и приостанавливает развертывание на неопределенный срок, пока пользователь не предпримет действия для возобновления/продвижения развертывания.
После обновления образа убедитесь, что статус обновления находится в состоянии паузы при помощи команды:
kubectl argo rollouts get rollout rollouts-demo --watchВывод будет следующим:
Name: rollouts demo Namespace default Status: Paused Strategy: Canary Step: 1/8 SetWeight: 20 ActualWeight 20 Images argoj/rollouts-demo:blue (stable) argoj/rollouts-demo:yellow (canary) Replicas: Desired: 5 Current: 5 Updated: 1 Ready: 5 Avalible: 5 ...Когда демонстрационный deployment достигает второго шага, deployment остается в состоянии паузы и имеет 1 из 5 реплик, на которых запущена новая версия шаблона модуля «yellow», и 4 из 5 реплик, на которых запущена старая версия «blue». Это соответствует 20% веса, как определено на
setWeight: 20.Когда deployment достигает шага
pause, deployment остается в состоянии паузы на неопределенный срок, пока не будет возобновлено/продвинуто. Чтобы вручную перевести deployment на следующий шаг, выполните команду плагинаpromote:kubectl argo rollouts promote rollouts-demoПосле продвижения Argo Rollouts продолжит выполнение оставшихся шагов. Остальные шаги развертывания в примере полностью автоматизированы, поэтому deployment в конечном итоге будет выполнять шаги до тех пор, пока полностью не перейдет на новую версию. Просмотрите deployment еще раз, пока не будут выполнены все шаги:
kubectl argo rollouts get rollout rollouts-demo --watchВывод команды будет следующим:
Name: rollouts demo Namespace default Status: Paused Strategy: Canary Step: 8/8 SetWeight: 100 ActualWeight 100 Images argoj/rollouts-demo:yellow (canary) Replicas: Desired: 5 Current: 5 Updated: 5 Ready: 5 Avalible: 5 ...После успешного завершения всех шагов новый набор реплик помечается как «стабильный» (stable) набор реплик. Всякий раз, когда deployment прерывается во время обновления автоматически из-за неудачного анализа или вручную пользователем, deployment возвращается к «стабильной» версии.
Для прерывания развертывания создайте новую версию контейнера с помощью команды
set imageкоманды и подождите, пока deployment снова не достигнет статусаPaused:kubectl argo rollouts set image rollouts-demo \ rollouts-demo=argoproj/rollouts-demo:redВ приведенном примере имя версии контейнера
red.Для прерывания обновления введите следующую команду:
kubectl argo rollouts abort rollouts-demoКогда deployment прерывается, масштабируется «стабильная» версия ReplicaSet (в приведенном примере «yellow» версия) и уменьшаются любые другие версии. Несмотря на то, что «стабильная» версия ReplicaSet может быть запущена и работоспособна, общее развертывание по-прежнему находится в статусе
Degraded. Вывод команды будет следующим:Name: rollouts demo Namespace default Status: Degraded Strategy: Canary Step: 0/8 SetWeight: 0 ActualWeight 0 Images argoj/rollouts-demo:yellow (stable) Replicas: Desired: 5 Current: 5 Updated: 0 Ready: 5 Avalible: 5 ...Чтобы Rollout имел статус
HealthyвместоDegraded, измените желаемое состояние обратно на предыдущую, «стабильную» версию. Обычно это связано с выполнением предыдущей спецификации развертыванияkubectl apply. Запустите командуset image, используя предыдущую версию:kubectl argo rollouts set image rollouts-demo \ rollouts-demo=argoproj/rollouts-demo:yellowУбедитесь в выводе, что развертывание работоспособно и отсутствуют действия в отношении создания новых наборов реплик:
Name: rollouts demo Namespace default Status: Healthy Strategy: Canary Step: 8/8 SetWeight: 100 ActualWeight 100 Images argoj/rollouts-demo:yellow (stable) Replicas: Desired: 5 Current: 5 Updated: 5 Ready: 5 Avalible: 5 ...Если deployment не достигло желаемого состояния (например, было прервано или находится в середине обновления) и был повторно применен «стабильный» манифест, Argo Rollouts определяет это как откат, а не обновление, и осуществляет deployment «стабильного» набора реплик, пропуская шаг анализа.
Примечание
Deployment в этом базовом примере не использовало ingress controller или service mesh provider для маршрутизации трафика. Вместо этого был использован kube-proxy для достижения приблизительного веса обновления, основанного на ближайшем соотношении числа новых и старых реплик. В результате у этого развертывания было ограничение, заключавшееся в том, что оно могло достичь минимального веса обновления только в 20% путем масштабирования 1 из 5 модулей для запуска новой версии. Для большей детализации и дозирования веса обновлений используйте ingress controller.
Argo Events#
Argo Events - это инструмент для обработки событий в DropApp. Позволяет настроить механизмы подписки на различные типы событий в DropApp и принимать соответствующие меры в зависимости от полученного события. Argo Events может использовать другие инструменты для контроля запуска новых приложений, переключения между версиями приложений и обработки событий в кластере DropApp.
Сценарий использования Argo Events#
Внедрение Argo Events: настройка и развертывание системы мониторинга и управления событиями в DropApp#
Для выполнения данного сценария необходимы права администратора.
Для работы с Argo Events выполните следующую последовательность действий.
Создайте namecpace
argo-events:kubectl create namespace argo-eventsРазверните Argo Events SA, ClusterRoles и Controller для Sensor, EventBus и EventSource:
kubectl apply -f https://<repoexample.ru>/argoproj/argo-events/stable/manifests/install.yaml kubectl apply -f https://<repoexample.ru>/argoproj/argo-events/stable/manifests/install-validating-webhook.yaml # Укажите актуальный путь до локального репозиторияРазверните EventBus в DropApp:
kubectl apply -n argo-events -f https://<repoexample.ru>/argoproj/argo-events/stable/examples/eventbus/native.yaml # Укажите актуальный путь до локального репозиторияВнесите следующее содержание в
native.yamlфайл:apiVersion: argoproj.io/v1alpha1 kind: EventBus metadata: name: default spec: nats: native: # Опционально, по умолчанию 3. replicas: 3 # Опционально, стратегия аутентификации имеет статус "none" или "token", по умолчанию "none" auth: token # containerTemplate: # resources: # requests: # cpu: "10m" # metricsContainerTemplate: # resources: # requests: # cpu: "10m" # antiAffinity: false # persistence: # storageClassName: standard # accessMode: ReadWriteOnce # volumeSize: 10Gi
Выше представлена конфигурация EventBus в Argo CD. EventBus - это компонент DropApp, который позволяет отслеживать события и уведомления в кластере. Предоставляет возможность создавать подписки на события и получать уведомления о них.
В данном примере конфигурация EventBus определяет имя EventBus по умолчанию, а также настройки для подключения к NATS. NATS - это брокер сообщений, который используется для передачи событий между компонентами в кластере DropApp.
Настройки для NATS включают количество реплик брокера (3 по умолчанию), тип аутентификации (токен по умолчанию), настройки ресурсов для контейнеров, метрики и Anti-Affinity. Также указана возможность использования хранилища данных (persistence) для хранения логов и журналов событий.