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
. Поэтому если используешь другой неймспейс, то нужно указать его в манифесте
Если тебе не нужны 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"
}
]
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 появляется дополнительный кластер
Команда 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
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