Фінал GitOps — ArgoCD та деплой у продакшен — Практика
Практичні кроки реалізації для Блоку 12.
Пряма мова: “Все на цій практичній сторінці побудовано так, щоб ви могли слідувати за мною рядок за рядком. Коли бачите блок із командою або промптом, можете копіювати його прямо в термінал або сесію Claude, якщо я явно не скажу, що це лише довідковий матеріал. Порівнюйте свій результат із моїм на екрані, щоб виловлювати помилки відразу, а не накопичувати їх.”
Тривалість: ~30 хвилин Результат: ArgoCD встановлений, підключений до вашого репо, застосунок відкритий публічно, темна тема задеплоєна через GitOps, та моніторинг налаштований з
/loopі/schedule. Гранд-фінал. Передумови: Завершені Блоки 0-11 (k3s-кластер працює, застосунок задеплоєний, CI/CD налаштовано), доступ kubectl з ноутбука, репо ai-coderrank запушене на GitHub
Крок 1: Встановлення ArgoCD на k3s-кластер (~5 хв)
Це останній раз, коли ви вручну виконуєте kubectl apply для деплоїв. Після цього ArgoCD бере все на себе.
Запустіть Claude Code у проєкті ai-coderrank:
cd ~/ai-coderrank
claude
Попросіть Claude допомогти з встановленням ArgoCD:
Help me install ArgoCD on my k3s cluster. Create the argocd namespace and apply
the stable manifests.
Claude згенерує та виконає команди:
# Створення namespace ArgoCD
kubectl create namespace argocd
# Встановлення ArgoCD зі стабільних маніфестів
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Зачекайте, поки поди піднімуться. Попросіть Claude перевірити:
Check if all ArgoCD pods are running in the argocd namespace. Wait until they're
all Ready.
Claude виконає:
kubectl get pods -n argocd -w
Ви маєте побачити поди на кшталт:
argocd-server-xxx— API-сервер та веб-UIargocd-repo-server-xxx— клонує та читає ваші Git-репоargocd-application-controller-xxx— мозок, стежить за driftargocd-redis-xxx— шар кешуванняargocd-applicationset-controller-xxx— управляє ApplicationSetsargocd-notifications-controller-xxx— надсилає нотифікації про sync-подіїargocd-dex-server-xxx— обробляє SSO-автентифікацію
Всі поди мають показувати Running з 1/1 Ready. На k3s-кластері це зазвичай займає 1-2 хвилини.
Що щойно сталося: Ви встановили повноцінну GitOps-платформу доставки. ArgoCD тепер працює всередині вашого Kubernetes-кластера, готовий стежити за Git-репо та синхронізувати зміни. У продакшен-середовищах це та сама інсталяція ArgoCD, що управляє тисячами сервісів. Той самий інструмент, та сама конфігурація, той самий воркфлоу.
Крок 2: Доступ до ArgoCD UI (~3 хв)
Отримайте початковий пароль адміна:
Get the ArgoCD admin password from the cluster secret.
Claude виконає:
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
Скопіюйте пароль. Він знадобиться через мить.
Тепер пробросьте порт ArgoCD-сервера на локальну машину:
kubectl port-forward svc/argocd-server -n argocd 8080:443
Відкрийте браузер і перейдіть на https://localhost:8080. З’явиться попередження про сертифікат — це очікувано для self-signed cert. Прийміть і продовжуйте.
- Логін:
admin - Пароль: рядок, що ви скопіювали вище
Ви маєте побачити дашборд ArgoCD. Наразі він порожній — жодних застосунків. Це скоро зміниться.
Порада: Залиште цей port-forward працювати у окремій вкладці терміналу. Вам знадобиться ArgoCD UI видимим під час роботи над наступними кроками.
Крок 3: Створення конфігурації ArgoCD Application (~3 хв)
Тепер скажемо ArgoCD, за чим стежити. Попросіть Claude:
Create argocd/application.yaml that points ArgoCD at my ai-coderrank GitHub repo.
It should watch the k8s/ directory on the main branch and auto-sync changes to the
default namespace. Enable auto-prune and self-heal.
My GitHub repo is at: https://github.com/YOUR_USERNAME/ai-coderrank.git
Claude створить argocd/application.yaml:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: ai-coderrank
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/YOUR_USERNAME/ai-coderrank.git
targetRevision: main
path: k8s
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Розберемо, що робить кожна секція:
| Поле | Що означає |
|---|---|
source.repoURL |
Git-репо, за яким стежитиме ArgoCD |
source.targetRevision |
Яку гілку відстежувати (main) |
source.path |
Яка директорія містить K8s-маніфести (k8s/) |
destination.server |
K8s-кластер для деплою (локальний кластер) |
destination.namespace |
У який namespace деплоїти |
syncPolicy.automated |
Авто-синхронізація при зміні Git (без ручного апрувлу) |
syncPolicy.automated.prune |
Видаляти ресурси з кластера, якщо їх прибрали з Git |
syncPolicy.automated.selfHeal |
Відкочувати ручні зміни кластера до того, що декларує Git |
Застосуйте:
Apply the ArgoCD application to the cluster.
kubectl apply -f argocd/application.yaml
Це поворотний момент. ArgoCD тепер стежить за вашим репо. Будь-які зміни у директорії
k8s/на гілціmainбудуть автоматично застосовані до кластера. Ви щойно налаштували continuous delivery.
Крок 4: Спостереження за першою синхронізацією (~2 хв)
Переключіться на ArgoCD UI у браузері (https://localhost:8080). Ви маєте побачити застосунок ai-coderrank. Клікніть на нього.
ArgoCD:
- Клонує ваш репо
- Прочитає маніфести у
k8s/ - Порівняє з поточним станом кластера
- Покаже diff
- Застосує відмінності
Якщо ви вже деплоїли застосунок у Блоці 7, ArgoCD має показати стан Synced та Healthy — маніфести в Git відповідають тому, що працює в кластері.
Якщо є відмінності, ви побачите, як ArgoCD синхронізує їх автоматично. Спостерігайте за деревом ресурсів у UI — кожен Deployment, Service та Pod відображається як вузол у візуальному графі.
Попросіть Claude перевірити через CLI:
Check the ArgoCD application sync status for ai-coderrank.
kubectl get application ai-coderrank -n argocd -o jsonpath='{.status.sync.status}'
# Має вивести: Synced
kubectl get application ai-coderrank -n argocd -o jsonpath='{.status.health.status}'
# Має вивести: Healthy
Synced + Healthy = Git відповідає кластеру, і всі ресурси працюють коректно. Це стан, який вам потрібен.
Крок 5: Публічний доступ до застосунку (~5 хв)
Зараз застосунок працює в кластері, але недоступний з інтернету. Виправимо це.
Попросіть Claude:
Help me expose the ai-coderrank app on my droplet's public IP address. My droplet's
IP is YOUR_DROPLET_IP. Set up a NodePort service so I can access
the app from a browser at http://YOUR_DROPLET_IP.
Варіант A: NodePort (рекомендований для цього курсу)
Найпростіший шлях. Жодних додаткових конфігурацій, жодного налаштування Ingress-контролера. Ваш застосунок отримує порт на публічному IP дроплету, і ви можете звернутися до нього з будь-якого браузера.
Claude допоможе оновити Service у k8s/ на NodePort:
apiVersion: v1
kind: Service
metadata:
name: ai-coderrank
namespace: default
spec:
type: NodePort
selector:
app: ai-coderrank
ports:
- port: 3000
targetPort: 3000
nodePort: 30080 # Доступний за http://DROPLET_IP:30080
Доступ через публічний IP: Ваш дроплет DigitalOcean вже має публічний IP. Балансувальник не потрібен. NodePort відкриває застосунок безпосередньо на IP дроплету на порті 30080. Просто переконайтеся, що фаєрвол пропускає його.
Варіант B: Ingress з Traefik (сайдбар — більш просунутий)
k3s поставляється з Traefik як вбудованим Ingress-контролером. Якщо хочете доступ через порт 80 (без номера порту в URL), можете створити Ingress-ресурс. Це опціонально і складніше:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ai-coderrank
namespace: default
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ai-coderrank
port:
number: 3000
З Traefik Ingress застосунок буде доступний за http://YOUR_DROPLET_IP на порті 80 — без номера порту. Це приємний бонус, але не обов’язковий для вправ курсу.
Важливо: Який би варіант ви не обрали, закомітьте зміни Service/Ingress у k8s/ та запуште у Git. Не робіть kubectl apply вручну — дозвольте ArgoCD обробити це. Це GitOps:
Commit the updated service manifest and push it to the main branch. Let ArgoCD
sync it.
git add k8s/
git commit -m "feat: expose ai-coderrank via NodePort for public access"
git push origin main
Переконайтеся, що фаєрвол дроплету пропускає трафік на порт 30080. Попросіть Claude:
Help me check and update the DigitalOcean firewall rules for my droplet to allow
inbound traffic on port 80 and 30080.
Спостерігайте за ArgoCD UI — протягом кількох хвилин він виявить пуш і синхронізує нову конфігурацію Service у кластер.
Крок 6: Пуш темної теми — Великий момент (~3 хв)
Container registry: Цей курс стандартизований на GitHub Container Registry (GHCR). Ваш CI-пайплайн (Блок 10) має пушити образи у
ghcr.io/YOUR_USERNAME/ai-coderrank, а K8s deployment має посилатися на той самий образ. Якщо ви пропустили Блок 10, можете запушити образи вручну черезdocker push ghcr.io/YOUR_USERNAME/ai-coderrank:latest.
Ось він. Момент, до якого будувався весь курс.
Якщо зміни темної теми з Блоку 4 ще не запушені — саме час. Попросіть Claude:
Make sure all the dark theme changes are committed and push everything to the main
branch.
git add .
git commit -m "feat: dark theme implementation from Block 4"
git push origin main
Тепер спостерігайте. Відкрийте ArgoCD UI поруч із терміналом.
- ArgoCD виявляє новий коміт (протягом 3 хвилин за замовчуванням, або миттєво з webhook)
- Клонує оновлений репо
- Порівнює нові маніфести зі станом кластера
- Якщо змінився тег Docker-образу — розгортає нову версію
- Статус змінюється з OutOfSync на Syncing на Synced
Примітка: Якщо ваші K8s-маніфести посилаються на контейнерний образ, що будується CI (з Блоку 10), повний цикл: пуш коду -> GitHub Actions будує образ -> пуш образу в registry -> оновлення тегу образу в
k8s/deployment.yaml-> ArgoCD синхронізує новий образ. Якщо використовуєте фіксований тег, можливо, потрібно його оновити. Попросіть Claude допомогти налаштувати flow оновлення образу.
Крок 7: Відкриття застосунку у браузері (~1 хв)
Відкрийте браузер. Перейдіть на:
http://YOUR_DROPLET_IP:30080
Ви маєте побачити ai-coderrank. З темною темою. На Kubernetes. Задеплоєний через GitOps. Доступний з інтернету.
Зробіть вдих. Ви це побудували.
Якщо не вантажиться, попросіть Claude допомогти з дебагом:
The app isn't loading at http://YOUR_DROPLET_IP:30080. Help me debug — check the
pods, service, NodePort, and firewall rules.
Claude систематично перевірить кожен рівень: чи працюють поди? Чи сервіс маршрутизує правильно? Чи NodePort відкритий? Чи фаєрвол пропускає? Цей методичний дебагінг — саме те, в чому Claude чудовий.
Крок 8: Моніторинг з /loop (~3 хв)
Тепер використаємо Claude Code як інструмент операцій. Команда /loop виконує промпт з повторенням через інтервал — ідеально для моніторингу.
У вашій сесії Claude Code:
/loop 30s check if ArgoCD sync is complete for ai-coderrank and report the sync
status and health
Claude перевірятиме кожні 30 секунд і звітуватиме:
[12:01:30] Sync: Synced | Health: Healthy | Resources: 4/4 running
[12:02:00] Sync: Synced | Health: Healthy | Resources: 4/4 running
[12:02:30] Sync: Synced | Health: Healthy | Resources: 4/4 running
Тепер, в окремому терміналі, зробіть невелику зміну та запуште:
# Змініть кількість реплік або додайте лейбл — щось невелике
git add k8s/
git commit -m "test: verify ArgoCD auto-sync with minor manifest change"
git push origin main
Спостерігайте за виводом /loop. Протягом кількох хвилин ви маєте побачити:
[12:05:00] Sync: OutOfSync | Health: Healthy | Resources: 4/4 running
[12:05:30] Sync: Syncing | Health: Progressing | Resources: updating...
[12:06:00] Sync: Synced | Health: Healthy | Resources: 4/4 running
Ви щойно спостерігали GitOps у реальному часі. Пуш у Git, ArgoCD синхронізує, кластер оновлюється. Жодного ручного втручання. Команда /loop дала вам живий дашборд у терміналі.
Натисніть Ctrl+C (або введіть stop) для зупинки циклу.
Порада:
/loopприймає будь-який інтервал —10s,1m,5m. Використовуйте коротші інтервали для активного моніторингу під час деплоїв, довші — для фонових перевірок.
Крок 8b: Спостережуваність та дебагінг (~5 хв)
Тепер, маючи живий деплой, побудуємо базову практику спостережуваності. Ці команди врятують вас, коли щось піде не так у продакшені.
Логи подів
Перше, що потрібно перевірити, коли щось ламається:
# Логи деплойменту ai-coderrank
kubectl logs deployment/ai-coderrank -n default
# Стеження за логами в реальному часі (як tail -f)
kubectl logs deployment/ai-coderrank -n default -f
# Логи з краш-поду або перезапущеного поду (попередній контейнер)
kubectl logs deployment/ai-coderrank -n default --previous
Попросіть Claude допомогти інтерпретувати логи:
Read the last 50 lines of logs from the ai-coderrank deployment and flag anything
that looks like an error, warning, or unexpected behavior.
Використання ресурсів
Встановіть metrics-server, щоб kubectl top працював на k3s:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Примітка: На k3s може знадобитися додати
--kubelet-insecure-tlsдо аргументів деплойменту metrics-server. Попросіть Claude пропатчити, якщоkubectl topповертає помилки.
Коли metrics-server запуститься (дайте хвилину):
# Використання CPU та пам'яті по подах
kubectl top pods -n default
# Використання CPU та пам'яті по нодах
kubectl top nodes
Це покаже, чи має ваш дроплет s-2vcpu-4gb запас або працює на межі.
Readiness та liveness probes
Перевірте, що ваші K8s-маніфести включають health probes. Попросіть Claude:
Check all deployments in k8s/ for readiness and liveness probes. If any are
missing, add them. Use HTTP GET /health for the web service (or TCP on port 3000
if no health endpoint exists).
Probes кажуть Kubernetes, коли ваш застосунок готовий приймати трафік (readiness) і коли він завис та потребує перезапуску (liveness). Без них K8s не має способу виявити завислий процес.
Health-статус ArgoCD
ArgoCD надає власну модель health поверх Kubernetes:
# Швидка перевірка статусу
kubectl get application ai-coderrank -n argocd
# Детальний health по кожному ресурсу
kubectl get application ai-coderrank -n argocd -o jsonpath='{.status.resources[*].health.status}' | tr ' ' '\n'
ArgoCD UI також показує health для кожного ресурсу у візуальному дереві. Зелений = healthy, жовтий = progressing, червоний = degraded.
Неперервний моніторинг з /loop
Об’єднайте все в моніторинговий цикл:
/loop 1m check ArgoCD sync status, pod health, and resource usage for ai-coderrank.
Report any issues.
Це дає термінальний ops-дашборд, що оновлюється щохвилини. Використовуйте під час деплоїв, після змін конфігурації або коли щось підозрюєте.
Крок 9: Налаштування запланованого health check з /schedule (~3 хв)
/loop чудовий для активного моніторингу, але що робити, коли ви спите? Тут на допомогу приходить /schedule — він створює хмарні задачі, що виконуються за cron-розкладом.
/schedule create "ai-coderrank daily health check" --cron "0 9 * * *" \
--prompt "Check the status of all pods in the default namespace. Verify the \
ai-coderrank service is responding. Check ArgoCD sync status. If anything is \
unhealthy, provide a summary of issues and suggested fixes."
Це створює запланованого агента, що запускається щодня о 9:00 ранку. Він:
- Перевірить статус подів
- Верифікує, що сервіс відповідає
- Перевірить статус синхронізації ArgoCD
- Звітує про проблеми
Перегляньте заплановані задачі:
/schedule list
Та перевірте вивід останнього запуску:
/schedule show "ai-coderrank daily health check"
Кейси використання окрім health checks: Нічні сканування безпеки (
/scheduleпромпт, що перевіряє CVE у залежностях). Щотижневі звіти по вартості. Щоденний аналіз логів. Будь-яка повторювана операційна задача, яку ви зазвичай автоматизували б cron job + скриптом, може бути запланованим агентом Claude.
Крок 10: Віддалене керування — моніторинг з телефону (~2 хв)
Остання функція для фіналу. Claude Code підтримує віддалене керування для тієї самої сесії, в якій ви вже працюєте — ідеально для збереження контексту деплою на телефоні.
З поточної сесії Claude Code відкрийте сесію для віддаленого доступу:
/remote-control ai-coderrank-rollout
Це дасть URL та QR-код. Відкрийте URL у браузері телефону або в Claude-додатку. Тепер у вас доступ до тієї самої сесії Claude Code, з тією самою історією та контекстом поточного розгортання, з телефону.
Спробуйте:
- З телефону попросіть Claude перевірити статус подів
- З телефону попросіть Claude перевірити статус синхронізації ArgoCD
- З телефону запустіть
/loop 1mдля спостереження за кластером
Це дійсно корисно на практиці. Ви пушите деплой з ноутбука, закриваєте кришку та моніторите розгортання з телефону, поки йдете за кавою. Якщо щось піде не так — ви можете дослідити та навіть виконувати команди, все з мобільного браузера.
Коли це важливо: П’ятничний вечірній деплой. Ви пушите зміну, запускаєте
/loopдля моніторингу, потім йдете до поїзда. З телефону ви спостерігаєте, як розгортання завершується. Ноутбук не потрібен. Це операційний спокій.
Чекпоінт: Великий майлстоун
Підіб’ємо підсумки того, що ви щойно зробили:
Інфраструктура:
- ArgoCD працює на k3s
argocd/application.yamlз’єднує ваш репо з кластером- Авто-синхронізація з self-healing та pruning увімкнена
- NodePort відкриває застосунок публічно на порті 30080
Воркфлоу:
- Пуш у Git -> ArgoCD синхронізує -> застосунок оновлюється автоматично
- Жодного ручного
kubectl apply - Повний аудит-трейл у git-історії
Моніторинг:
/loopдля моніторингу синхронізації в реальному часі/scheduleдля щоденних health checks- Віддалене керування для моніторингу з будь-якого пристрою
Застосунок:
- ai-coderrank із темною темою
- Живий в інтернеті на публічному IP дроплету
- Задеплоєний та керований повністю через GitOps
Ви почали цей курс із claude та порожнього терміналу. Тепер у вас повний, сучасний, production-grade пайплайн розробки та деплою. Код -> CI -> GitOps -> Live.
Надішліть URL другу. Серйозно. Покажіть їм. Ви це побудували.
Troubleshooting
ArgoCD показує статус “Unknown” Репо може бути приватним. Потрібно додати креденшали:
kubectl -n argocd create secret generic repo-ai-coderrank \
--from-literal=url=https://github.com/YOUR_USER/ai-coderrank.git \
--from-literal=username=YOUR_USER \
--from-literal=password=YOUR_GITHUB_TOKEN
kubectl -n argocd label secret repo-ai-coderrank argocd.argoproj.io/secret-type=repository
Попросіть Claude допомогти згенерувати GitHub personal access token зі скоупом repo.
ArgoCD показує “Degraded” health Зазвичай означає, що поди crashlooping. Перевірте:
kubectl get pods -n default
kubectl logs deployment/ai-coderrank -n default
Попросіть Claude діагностувати логи. Типові проблеми: відсутні змінні середовища, неправильний тег образу, невідповідність портів.
Застосунок не відкривається за публічним IP Перевірте ланцюжок: Под працює? -> Service маршрутизує? -> NodePort відкритий? -> Фаєрвол відкритий?
kubectl get pods -n default
kubectl get svc -n default # Перевірте, що NodePort 30080 у списку
curl http://localhost:30080 # Тест з самого дроплету
# Перевірте фаєрвол у консолі DO або через doctl — порт 30080 має бути дозволений
ArgoCD синхронізація повільна За замовчуванням ArgoCD полить кожні 3 хвилини. Можна форсувати синхронізацію:
kubectl -n argocd patch application ai-coderrank \
--type merge -p '{"metadata":{"annotations":{"argocd.argoproj.io/refresh":"hard"}}}'
Або налаштувати GitHub webhook для миттєвої синхронізації.
Бонусні завдання
Завдання 1: Синхронізація через webhook Налаштуйте GitHub webhook, щоб ArgoCD синхронізувався миттєво при пуші, а не полив кожні 3 хвилини. Попросіть Claude допомогти з URL webhook та секретом.
Завдання 2: Ролбек через Git
Зробіть ламаючу зміну (неправильний тег образу), запуште, спостерігайте, як ArgoCD деплоїть зламану версію. Потім git revert коміту, запуште знову, спостерігайте, як ArgoCD ролбечить. Весь ролбек — git-операція. Жодного kubectl rollout undo.
Завдання 3: Додайте нотифікації ArgoCD
Налаштуйте нотифікації ArgoCD, щоб надсилати Slack-повідомлення або email при завершенні чи фейлі синхронізації. Попросіть Claude допомогти з конфігурацією ConfigMap argocd-notifications-cm.
Завдання 4: Мультисередовище
Створіть структуру директорій k8s/staging/ та k8s/production/. Створіть два ArgoCD Application — по одному на кожну директорію. Попросіть Claude допомогти реструктурувати маніфести.
Яка подорож. Ви пройшли від
claudeдо GitOps. Від читання коду до деплою його наживо в інтернет. Від одного інструменту до цілої екосистеми. Наступний і останній блок — просунуті патерни та що далі. Але якби ви зупинилися просто зараз, у вас уже був би повний, production-ready воркфлоу. Відмінна робота.
Готові перевірити засвоєне?
Пройти квіз →