Info
Content

Getting Started

1. Install Argo CD

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

Эти команды создают новый неймспейс argocd где будет жить Argo CD

Установочный манифест включает ClusterRoleBinding который ссылается на неймспейс argocd. Поэтому если используешь другой неймспейс, то нужно указать его в манифесте

Screenshot_2021_02_02-12_49_03-2022-09-08-at-15crb.png

Если тебе не нужны UI, SSO, multi-cluster, то можно установить только core-компоненты:

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

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

  • Follow the instructions to configure a certificate (and ensure that the client OS trusts it)
  • Configure the client OS to trust the self signed certificate
  • Use the --insecure flag on all Argo CD CLI operations in this guide

При использовании core версии используй argocd login --core для настройки CLI и скипай шаги 3-5

2. Download Argo CD CLI

Скачай нужный бинарь с https://github.com/argoproj/argo-cd/releases/latest
Более детализированные инструкции по установке можно найти в https://argo-cd.readthedocs.io/en/stable/cli_installation/

Под Mac, Linux и WSL можно использовать Homebrew:

brew install argocd

3. Access The Argo CD API Server

По умолчанию Argo CD API сервер не экспозится наружу через какой-либо внешний адрес. Чтобы получить доступ к нему используй одну из следующих техник:

Service Type Load Balancer

Измени тип сервиса argocd-server с ClusterIP на LoadBalancer:

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

(yc-test:default) vandud@macbook: ~ [0] ? kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
service/argocd-server patched

(yc-test:default) vandud@macbook: ~ [0] ? yc load-balancer network-load-balancer list
+----------------------+----------------------------------------------+-------------+----------+----------------+------------------------+--------+
|          ID          |                     NAME                     |  REGION ID  |   TYPE   | LISTENER COUNT | ATTACHED TARGET GROUPS | STATUS |
+----------------------+----------------------------------------------+-------------+----------+----------------+------------------------+--------+
| enpdlstm2kb4dsan9c07 | k8s-92249e6140a0fea320a9088fd76c933dc6cac2f4 | ru-central1 | EXTERNAL |              2 | enpfj6q1vkpcbp8qcdto   | ACTIVE |
+----------------------+----------------------------------------------+-------------+----------+----------------+------------------------+--------+

(yc-test:default) vandud@macbook: ~ [0] ? yc load-balancer network-load-balancer get --id enpdlstm2kb4dsan9c07 --format json | jq '.listeners'
[
  {
    "name": "http",
    "address": "158.160.5.94",
    "port": "80",
    "protocol": "TCP",
    "target_port": "32749",
    "ip_version": "IPV4"
  },
  {
    "name": "https",
    "address": "158.160.5.94",
    "port": "443",
    "protocol": "TCP",
    "target_port": "30809",
    "ip_version": "IPV4"
  }
]

Screenshot_2021_02_02-12_49_03-2022-09-08-at-17service-type-ld.png

Ingress

Следуй инструкции по ингрессу чтобы настроить его

Port Forwarding

port-forwarding может быть использован для коннекта к api серверу без экспозинга его наружу

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

API сервер будет доступен на https://localhost:8080


(yc-test:default) vandud@macbook: ~ [0] ? kubectl port-forward svc/argocd-server -n argocd 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

(yc-test:default) vandud@macbook: ~ [0] ? argocd login localhost:8080
WARNING: server certificate had error: x509: “Argo CD” certificate is not trusted. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'localhost:8080' updated

(yc-test:default) vandud@macbook: ~ [0] ? argocd cluster list
SERVER                          NAME        VERSION  STATUS   MESSAGE                                                  PROJECT
https://kubernetes.default.svc  in-cluster           Unknown  Cluster has no applications and is not being monitored.

4. Login Using The CLI

Пароль для пользователя admin генерируется автоматически и хранится в секрете argocd-initial-admin-secret

(yc-test:default) vandud@macbook: ~ [0] ? kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath={.data.password} | base64 -d
LjOCyPoDNuZ0j6Ry

Можно удалить этот секрет после того как изменишь админский пароль. Секрет нужен только для того чтобы ты мог получить автосгенерированный начальный пароль (этот секрет нужен только для отображения автосгенерированного пароля, хэш этого пароля хранится в argocd-secret)


Изменил админский пароль через вебню и argocd-cli отвалился:

(yc-test:default) vandud@macbook: ~ [0] ? argocd cluster list
FATA[0000] Failed to establish connection to localhost:8080: dial tcp [::1]:8080: connect: connection refused

Логинимся с новым паролем:

(yc-test:default) vandud@macbook: ~ [0] ? argocd login localhost:8080
WARNING: server certificate had error: x509: “Argo CD” certificate is not trusted. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'localhost:8080' updated

О том как сбросить пароль - https://github.com/argoproj/argo-cd/blob/master/docs/faq.md#i-forgot-the-admin-password-how-do-i-reset-it

(yc-test:default) vandud@macbook: ~ [0] ? python3 -c "import bcrypt; print(bcrypt.hashpw(b'newpassword', bcrypt.gensalt()).decode())"
$2b$12$nDQh4.w6Xrn5gKMt1O/AnuKCELoHwj.89TmeWc2ODWcIbYD7m2qbm

(yc-test:default) vandud@macbook: ~ [0] ? kubectl -n argocd patch secret argocd-secret   -p '{"stringData": {
    "admin.password": "$2b$12$nDQh4.w6Xrn5gKMt1O/AnuKCELoHwj.89TmeWc2ODWcIbYD7m2qbm",
    "admin.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'
secret/argocd-secret patched

Еще более простой вариант сброса пароля: удалить из секрета argocd-secret поля admin.password и admin.passwordMtime и рестартануть argocd-server
Он сгенерит новый пароль и положит его в argocd-initial-admin-secret


Далее можно залогиниться в CLI

(yc-test:default) vandud@macbook: ~ [0] ? argocd login 158.160.5.94
WARNING: server certificate had error: x509: “Argo CD” certificate is not trusted. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '158.160.5.94' updated

Если API сервер не доступен напрямую (через Ingress или LB) то можно использовать PortForward. Можно передавать ключ --port-forward-namespace argocd каждой argocd команде или засунуть этот ключ в переменную окружения ARGOCD_OPTS

(yc-test:default) vandud@macbook: ~ [0] ? argocd --port-forward --port-forward-namespace argocd login --username admin --password "$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath={.data.password} | base64 -d)"
'admin:login' logged in successfully
Context 'port-forward' updated

Подкоманда login требует еще и флаг --port-forward, если его не указывать то она будет требовать хостнейм api сервера

(yc-test:default) vandud@macbook: ~ [0] ? export ARGOCD_OPTS='--port-forward-namespace argocd'

(yc-test:default) vandud@macbook: ~ [0] ? argocd --port-forward login --username admin --password "$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath={.data.password} | base64 -d)"
'admin:login' logged in successfully
Context 'port-forward' updated

(yc-test:default) vandud@macbook: ~ [0] ? argocd cluster list
SERVER                          NAME        VERSION  STATUS   MESSAGE                                                  PROJECT
https://kubernetes.default.svc  in-cluster           Unknown  Cluster has no applications and is not being monitored.

Изменить пароль через CLI можно так:

(yc-test:default) vandud@macbook: ~ [0] ? argocd account update-password
*** Enter password of currently logged in user (admin):
*** Enter new password for user admin:
*** Confirm new password for user admin:
Password updated
Context 'port-forward' updated

5. Register A Cluster To Deploy Apps To (Optional)

Этот шаг позволяет зарегистрировать внешний кластер в Argo CD (когда нужно деплоить во внешние кластеры)
При внутреннем деплое (когда Argo CD задеплоен в тот же кластер в который нужно деплоить приложения) используется https://kubernetes.default.svc как K8s Api server

Следующей командой можно просмотреть текущие контексты из твоего kubeconfig:

kubectl config get-contexts -o name

Выбери нужный и подставь в argocd cluster add CONTEXTNAME:

(yc-test:default) vandud@macbook: ~ [0] ? argocd cluster add ifree-test-k8s
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `ifree-test-k8s` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0001] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0001] ClusterRole "argocd-manager-role" updated
INFO[0001] ClusterRoleBinding "argocd-manager-role-binding" updated
FATA[0002] Failed to establish connection to port-forward:443: dial tcp: lookup port-forward on 172.27.192.2:53: server misbehaving

У меня возникла ошибка с резолвингом имени port-forward потому что у меня выбран контекст port-forward

(yc-test:default) vandud@macbook: ~ [0] ? argocd context
CURRENT  NAME            SERVER
         localhost:8080  localhost:8080
         158.160.5.94    158.160.5.94
*        port-forward    port-forward

Переключаем контекст на кластер с Argo CD сервером
И подключаем к этому Argo CD серверу внешний кластер K8s

(yc-demo-main-cluster:default) vandud@macbook: ~ [0] ? argocd cluster add yc-demo-main-cluster
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `yc-demo-main-cluster` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0002] ServiceAccount "argocd-manager" created in namespace "kube-system"
INFO[0002] ClusterRole "argocd-manager-role" created
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" created
Cluster 'https://51.250.94.51' added

После этого в интерфейсе Argo CD появляется дополнительный кластер
Screenshot_2021_02_02-12_49_03-2022-09-08-at-19extcluster.png

Команда argocd cluster add CONTEXT создает ServiceAccount (argocd-manager) в указанном внешнем кластере в неймспейсе kube-system и биндит этот service account на admin-level ClusterRole
Argo CD будет использовать токен этого сервис аккаунта для управления кластером

6. Create An Application From A Git Repository

Репозиторий https://github.com/argoproj/argocd-example-apps содержит приложение guestbook (папка guestbook) с помощью которого будет продемонстрирована работа Argo CD

Creating Apps Via CLI

(yc-demo-main-cluster:default) vandud@macbook: ~ [0] ? argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace guestbook
application 'guestbook' created

Creating Apps Via UI

Screenshot_2021_02_02-12_49_03-2022-09-08-at-19appviaui.png

7. Sync (Deploy) The Application

Syncing via CLI

Создаем приложение, видим его в общем списке и видим статус - OutOfSync:

(yc-demo-main-cluster:default) vandud@macbook: ~ [0] ? argocd app create guestbook-2 --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace guestbook
application 'guestbook-2' created

(yc-demo-main-cluster:default) vandud@macbook: ~ [0] ? argocd app list
NAME         CLUSTER                         NAMESPACE  PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS                REPO                                                 PATH       TARGET
guestbook    https://kubernetes.default.svc  guestbook  default  Synced     Healthy  <none>      <none>                    https://github.com/argoproj/argocd-example-apps.git  guestbook
guestbook-2  https://kubernetes.default.svc  guestbook  default  OutOfSync  Healthy  <none>      SharedResourceWarning(2)  https://github.com/argoproj/argocd-example-apps.git  guestbook

Подробнее приложение можно просмотреть через get:

(yc-demo-main-cluster:default) vandud@macbook: ~ [0] ? argocd app get guestbook-2
Name:               guestbook-2
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          guestbook
URL:                https://158.160.5.94/applications/guestbook-2
Repo:               https://github.com/argoproj/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        OutOfSync from  (53e28ff)
Health Status:      Healthy

CONDITION              MESSAGE                                                                    LAST TRANSITION
SharedResourceWarning  Deployment/guestbook-ui is part of applications guestbook-2 and guestbook  2022-09-08 20:03:34 +0300 MSK
SharedResourceWarning  Service/guestbook-ui is part of applications guestbook-2 and guestbook     2022-09-08 20:03:34 +0300 MSK


GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
       Service     guestbook  guestbook-ui  OutOfSync  Healthy
apps   Deployment  guestbook  guestbook-ui  OutOfSync  Healthy

Чтобы синхронизировать нужно использовать команду sync:

(yc-demo-main-cluster:default) vandud@macbook: ~ [0] ? argocd app sync guestbook-2
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
2022-09-08T20:07:40+03:00   apps  Deployment   guestbook          guestbook-ui  OutOfSync  Healthy
2022-09-08T20:07:40+03:00            Service   guestbook          guestbook-ui  OutOfSync  Healthy
2022-09-08T20:07:40+03:00            Service   guestbook          guestbook-ui    Synced  Healthy
2022-09-08T20:07:40+03:00            Service   guestbook          guestbook-ui    Synced   Healthy              service/guestbook-ui configured
2022-09-08T20:07:40+03:00   apps  Deployment   guestbook          guestbook-ui  OutOfSync  Healthy              deployment.apps/guestbook-ui configured
2022-09-08T20:07:40+03:00   apps  Deployment   guestbook          guestbook-ui    Synced  Healthy              deployment.apps/guestbook-ui configured

Name:               guestbook-2
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          guestbook
URL:                https://158.160.5.94/applications/guestbook-2
Repo:               https://github.com/argoproj/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to  (53e28ff)
Health Status:      Healthy

Operation:          Sync
Sync Revision:      53e28ff20cc530b9ada2173fbbd64d48338583ba
Phase:              Succeeded
Start:              2022-09-08 20:07:40 +0300 MSK
Finished:           2022-09-08 20:07:40 +0300 MSK
Duration:           0s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH   HOOK  MESSAGE
       Service     guestbook  guestbook-ui  Synced  Healthy        service/guestbook-ui configured
apps   Deployment  guestbook  guestbook-ui  Synced  Healthy        deployment.apps/guestbook-ui configured

Команда sync получает манифесты из репозитория и делает для них kubectl apply


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

(yc-test:default) vandud@macbook: ~ [0] ? kubectl -n argocd get applications
NAME          SYNC STATUS   HEALTH STATUS
guestbook     Synced        Healthy
guestbook-2   OutOfSync     Healthy
(yc-test:default) vandud@macbook: ~ [0] ? argocd app sync guestbook-2 --async
(yc-test:default) vandud@macbook: ~ [0] ? kubectl -n argocd get applications
NAME          SYNC STATUS   HEALTH STATUS
guestbook     OutOfSync     Healthy
guestbook-2   Synced        Healthy
(yc-test:default) vandud@macbook: ~ [0] ? argocd app sync guestbook --async
(yc-test:default) vandud@macbook: ~ [0] ? kubectl -n argocd get applications
NAME          SYNC STATUS   HEALTH STATUS
guestbook     Synced        Healthy
guestbook-2   OutOfSync     Healthy

Syncing via UI

Для синхронизации через UI нужно просто нажать кнопку

No Comments
Back to top