Управління додатками за допомогою ArgoCD у Kubernetes

На сьогоднішній день автоматизація управління додатками в Kubernetes стає невід'ємною частиною щоденної роботи DevOps-інженерів. У цій статті ми поговоримо про те, як ArgoCD може спростити ваше життя, якщо ви працюєте DevOps-інженером або плануєте ним стати. Завдяки ArgoCD управління додатками стане інтуїтивно зрозумілим процесом.

Що таке ArgoCD і навіщо воно потрібно?
На початку варто визначити саме формальне визначення цього терміну, у офіційній документації написано таке: ArgoCD — це декларативний інструмент безперервної доставки GitOps для Kubernetes.

Якщо ви раніше працювали з Kubernetes, то знаєте, як важливо підтримувати узгодженість між інфраструктурою додатків та їх конфігураціями. Тут на допомогу приходить GitOps — це підхід, за якого сховище Git є єдиним “джерелом правди” для різних конфігурацій додатків. Якщо говорити простими словами, це підхід, який полягає в зберіганні різних конфігураційних файлів, таких як yaml або json, у Git-репозиторії, і цей репозиторій описує загальну настройку та стан всієї інфраструктури.

Уявімо, як довелося б управляти інфраструктурою, якщо б підходу GitOps не існувало. Швидше за все, довелося б самостійно писати складні скрипти та вручну застосовувати манифести. Також, можливо, довелося б використовувати сторонні CI/CD рішення. Усі ці підходи могли б працювати, однак цей процес був би надто трудомістким, а з ростом кількості різних мікросервісів та інфраструктур робота ставала б дуже складною. Тому виникає потреба в автоматизації управління додатками в Kubernetes з використанням підходів GitOps, і саме тут з'являється потреба в ArgoCD.

pic

Принцип роботи ArgoCD

Як працює ArgoCD?
Тепер розглянемо, як працює ArgoCD, почнемо з того, з чого складається цей інструмент. Архітектура ArgoCD включає наступні основні компоненти:

  • API Server;
  • Repository Server;
  • Application Controller.

API Server здійснює управління всім додатком, надаючи інтерфейс REST API для взаємодії через веб-браузер, CLI та інші інструменти. Його завдання включають, наприклад, управління даними доступу та аутентифікацію. Repository Server відповідає за клонування Git-репозиторію, а також за кешування даних локально. Такий підхід прискорює процес синхронізації, оскільки система не запитує інформацію з репозиторію кожного разу. Також цей компонент генерує манифести для Kubernetes, для виконання цієї задачі необхідні такі дані, як URL-адреса репозиторію, ревізія (коміт, тег, гілка), шлях до додатку, а також різні специфічні налаштування шаблону. Application Controller здійснює моніторинг за станом додатків у кластері Kubernetes. Якщо стан, описаний у Git-репозиторії, змінюється, то цей сервіс виконує синхронізацію.

Далі розглянемо основні етапи роботи:

  1. Визначення бажаного стану
  2. Створюються файли конфігурації для Kubernetes, наприклад, YAML;
  3. Ці конфігураційні файли зберігаються в Git-репозиторії, який є “джерелом правди”.
  4. Моніторинг змін
  5. ArgoCD асинхронно порівнює поточний стан кластера з бажаним станом, який описано в Git-репозиторії.
  6. Автоматична синхронізація
  7. Якщо виявлено відмінності, то система автоматично застосовує зміни, якщо налаштовано режим автосинхронізації, в іншому випадку система буде чекати підтвердження від користувача через інтерфейс або CLI для подальшої синхронізації.
    4.
    Візуалізація
  8. ArgoCD надає інтуїтивно зрозумілий веб-інтерфейс, в якому відображаються наступні об'єкти та параметри: Стан додатків; Динамічна візуалізація зв'язків між компонентами додатка; Логи та історія змін.

pic

Візуалізація в ArgoCD

Як почати працювати з ArgoCD?
Для того, щоб почати роботу з цим інструментом, спочатку його потрібно встановити (в даному випадку, швидше за все, розгорнути), це робиться за допомогою наступних команд:

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

Перед тим, як вводити ці команди, необхідно переконатися, що кластер Kubernetes запущений. Також ці команди без проблем можна виконати в середовищі minikube, що я й робив, тому не дивуйтеся, якщо на моїх скріншотах ви побачите слово "minikube" перед командою. Після застосування цього yaml-файлу в середовищі Kubernetes запустяться необхідні ресурси, такі як Deployment, Service, ConfigMap та інші. Також необхідно встановити утиліту CLI для ArgoCD, щоб зручніше працювати з цим інструментом через консоль, це можна зробити наступними командами:

curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64  
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd  
rm argocd-linux-amd64

За замовчуванням ArgoCD Web UI доступний через сервіс argocd-server, щоб отримати до нього доступ, можна виконати проброс порту, для цього використовується наступна команда:

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

Тепер веб-інтерфейс ArgoCD доступний за адресою: https://localhost:8080.

pic

Веб-інтерфейс, форма входу

За замовчуванням створюється обліковий запис з ім'ям користувача “admin”, а пароль за замовчуванням — це ім'я пода, щоб дізнатися пароль, потрібно виконати наступну команду:

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

Далі підключається репозиторій, але перед цим його необхідно створити. У цій статті для демонстрації буде представлений простий репозиторій з конфігурацією сервера Nginx.
Його структура буде виглядати ось так:

example_repo/  
├── manifests/  
│ ├── deployment.yaml  
│ ├── service.yaml

Вміст deployment.yaml:

apiVersion: apps/v1  
kind: Deployment  
metadata:  
 name: nginx  
 labels:  
 app: nginx  
spec:  
 replicas: 2  
 selector:  
 matchLabels:  
 app: nginx  
 template:  
 metadata:  
 labels:  
 app: nginx  
 spec:  
 containers:  
 - name: nginx  
 image: nginx:latest  
 ports:  
 - containerPort: 80

Вміст service.yaml:

apiVersion: v1  
kind: Service  
metadata:  
 name: nginx  
spec:  
 selector:  
 app: nginx  
 ports:  
 - protocol: TCP  
 port: 80  
 targetPort: 80  
 type: ClusterIP

Щоб додати репозиторій в ArgoCD, необхідно виконати наступну команду:

argocd repo add https://github.com/lezchook/example_repo --server localhost:8080

Або можна зробити те саме через веб-інтерфейс. Для цього переходимо за адресою https://localhost:8080, входимо, переходимо до розділу Settings, потім в Repositories і вибираємо Connect Repo, у ньому вказуємо URL на наш репозиторій.

pic

Репозиторій успішно підключено!

Тепер можна створити новий додаток, для цього потрібно виконати наступну команду:

argocd app create nginx-app \  
--repo https://github.com/lezchook/example_repo \  
--path manifests \  
--dest-server https://  
--dest-namespace default

Або аналогічно можна зробити через веб-інтерфейс. Для цього переходимо до розділу Applications і вибираємо New Application, в поля вводимо дані, як вказано в команді.

Тепер потрібно синхронізувати створений додаток з маніфестами, які вказані в репозиторії. Для цього потрібно виконати наступну команду:

argocd app sync nginx-app

Аналогічно через графічний інтерфейс можна вибрати створений додаток nginx-app і натискати на кнопку Sync.

pic

Додаток успішно створено та синхронізовано!

pic

Візуалізація розгорнутого додатку

Все готово, тепер залишається тільки перевірити, що все успішно розгорнулося і працює. Для цього виконуємо наступні команди:

kubectl get pods -l app=nginx  
kubectl get svc nginx

pic

Сервіси успішно розгорнуті

Як видно, всі сервіси успішно розгорнуті та працюють! Для повної впевненості можна зробити проброс портів з localhost:8081 на 80, на якому працює Nginx, щоб остаточно перевірити, що все працює коректно.

pic

Nginx успішно працює!

Висновок
Як ви бачите, ArgoCD — це чудова технологія, яка спрощує життя DevOps-інженера. Сподіваюся, що ця стаття була для вас корисною, і ви будете застосовувати ArgoCD у своїх робочих завданнях. Дякую за увагу!

Корисна документація
1. https://argo-cd.readthedocs.io/en/stable/
2. https://argo-cd.readthedocs.io/en/latest/getting_started/

Перекладено з: Управление приложениями с помощью ArgoCD в Kubernetes

Leave a Reply

Your email address will not be published. Required fields are marked *