# ArgoCD В данном практическом занятии познакомимся с инструментом доставки приложений - [argocd][]. ## Vagrant Для работы будем использовать следующий `Vagrantfile`: ```ruby Vagrant.configure("2") do |config| config.vm.define "argocd" do |c| c.vm.provider "virtualbox" do |v| v.cpus = 2 v.memory = 4096 end c.vm.box = "ubuntu/lunar64" c.vm.hostname = "argocd" c.vm.network "forwarded_port", guest: 80, host: 8888 c.vm.provision "shell", inline: <<-SHELL apt-get update -q apt-get install -yq docker.io docker-compose-v2 usermod -a -G docker vagrant echo '{"registry-mirrors":["https:\\/\\/mirror.gcr.io"]}' > /etc/docker/daemon.json systemctl restart docker curl -LO https://dl.k8s.io/release/v1.30.0/bin/linux/amd64/kubectl curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64 curl -Lo ./argocd https://github.com/argoproj/argo-cd/releases/download/v2.11.2/argocd-linux-amd64 install -m 755 kubectl kind argocd /usr/local/bin/ SHELL end end ``` Данная конфигурация установит на виртуальную машину [docker][], [kubectl][] и [kind][], с помощью которых будет производиться развертывание и управление кластером [kubernetes][], а также утилита `argocd` для управления [argocd][]. ## Install Создадим новый кластер с помощью утилиты `kind` передав конфигурацию, в которой указаны дополнительные порты для доступа снаружи: ```bash cat < https://github.com/argoproj/argocd-example-apps.git guestbook $ argocd app get guestbook Name: argocd/guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://argo.traefik.me/applications/guestbook Source: - Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: Manual Sync Status: OutOfSync from (d7927a2) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui OutOfSync Missing apps Deployment default guestbook-ui OutOfSync Missing ``` На текущий момент приложение создано, но состояние в кластере не синхронизировано с состоянием git репозитория. Для синхронизации можно выполнить команду: ```console $ argocd app sync guestbook TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE 2024-05-28T21:41:35+00:00 Service default guestbook-ui OutOfSync Missing 2024-05-28T21:41:35+00:00 apps Deployment default guestbook-ui OutOfSync Missing 2024-05-28T21:41:35+00:00 Service default guestbook-ui OutOfSync Missing service/guestbook-ui created 2024-05-28T21:41:35+00:00 apps Deployment default guestbook-ui OutOfSync Missing deployment.apps/guestbook-ui created 2024-05-28T21:41:35+00:00 Service default guestbook-ui Synced Healthy service/guestbook-ui created 2024-05-28T21:41:35+00:00 apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created Name: argocd/guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://argo.traefik.me/applications/guestbook Source: - Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: Manual Sync Status: Synced to (d7927a2) Health Status: Progressing Operation: Sync Sync Revision: d7927a27b4533926b7d86b5f249cd9ebe7625e90 Phase: Succeeded Start: 2024-05-28 21:41:34 +0000 UTC Finished: 2024-05-28 21:41:35 +0000 UTC Duration: 1s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui created apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created ``` Через некоторое время все ресурсы развернутся и будут находиться в статусе `Healthy`: ```console $ argocd app get guestbook Name: argocd/guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://argo.traefik.me/applications/guestbook Source: - Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: Manual Sync Status: Synced to (d7927a2) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui created apps Deployment default guestbook-ui Synced Healthy deployment.apps/guestbook-ui created $ kubectl get deploy,svc,pod NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/guestbook-ui 1/1 1 1 2m33s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/guestbook-ui ClusterIP 10.96.187.88 80/TCP 2m33s NAME READY STATUS RESTARTS AGE pod/guestbook-ui-56c646849b-j7wf2 1/1 Running 0 2m33s ``` Добавим также ресурс `ingress` для доступа к приложению `guestbook-ui`: ```console $ kubectl create ingress guestbook-ui --rule=guestbook.traefik.me/*=guestbook-ui:80 ingress.networking.k8s.io/guestbook-ui created $ curl -s guestbook.traefik.me | grep title Guestbook ``` После чего можем удалить приложение: ```console $ argocd app delete guestbook Are you sure you want to delete 'guestbook' and all its resources? [y/n] y application 'guestbook' deleted $ kubectl get pod No resources found in default namespace. $ curl -s guestbook.traefik.me | grep title 503 Service Temporarily Unavailable ``` ## ArgoCD UI В [argocd][] также есть удобный web интерфейс, который будет доступен по адресу [argo.traefik.me:8888](http://argo.traefik.me:8888/). Авторизуемся в нем под пользователем `admin` и паролем, который получили после инсталляции: ![](img/argocd1.png) После чего проделаем в нем тот же путь, что сделали с помощью `cli`. Нажмем `Create Application` и заполним основные поля: ![](img/argocd2.png) В источнике укажем репозиторий [https://github.com/argoproj/argocd-example-apps.git][argocd-example-apps] и путь до директории `guestbook`: ![](img/argocd3.png) А в качестве `destination` укажем наш текущий кластер и неймспейс `default`: ![](img/argocd4.png) После чего нажмем кнопку `Create` и увидим состояние нашего приложения: ![](img/argocd5.png) ![](img/argocd6.png) Нажав на кнопку `Sync` и далее `Synchronize` запустится синхронизация ресурсов в кластере с git репозиторием: ![](img/argocd7.png) После чего по адресу [guestbook.traefik.me:8888](http://guestbook.traefik.me:8888/) будет доступно данное приложение: ![](img/argocd8.png) [argocd]:https://argo-cd.readthedocs.io/en/stable/ [kubernetes]:https://kubernetes.io/ru/ [docker]:https://docs.docker.com/engine/ [kubectl]:https://kubernetes.io/ru/docs/reference/kubectl/kubectl/ [kind]:https://kind.sigs.k8s.io/ [argocd-example-apps]:https://github.com/argoproj/argocd-example-apps.git