GitLab Repo → GitLab CI/CD → AWS ECR → ArgoCD → EKS Cluster
git add .
git commit -m "Update model or code"
git push origin mainЩо може змінитись:
- Код додатку (
predict.py,requirements.txt) - Dockerfile
- Helm чарт (
helm/директорія) - ArgoCD конфігурація (
argocd/application.yaml)
- GitLab автоматично виявляє push в гілки:
main,master, абоdevelop - Запускається pipeline згідно з
.gitlab-ci.yml
Job: build
Кроки виконання:
-
Ініціалізація середовища:
- Запускається Docker-in-Docker (dind) сервіс
- Встановлюється AWS CLI
-
Авторизація в AWS ECR:
aws ecr get-login-password --region eu-central-1 | \ docker login --username AWS --password-stdin $ECR_REGISTRY
- Отримується токен авторизації для ECR
- Виконується Docker login
-
Збірка Docker образу:
docker build -t $IMAGE_TAG .
- Створюється образ з тегом:
fast-api-service:24ffgh24(commit SHA) - Виконується Dockerfile:
- Базовий образ:
python:3.11-slim - Копіюються
requirements.txtтаpredict.py - Встановлюються залежності (FastAPI, uvicorn)
- Базовий образ:
- Створюється образ з тегом:
-
Тегування та публікація в ECR:
docker tag $IMAGE_TAG $ECR_REGISTRY/$IMAGE_TAG docker push $ECR_REGISTRY/$IMAGE_TAG docker tag $IMAGE_TAG $ECR_REGISTRY/$CI_REGISTRY_IMAGE:latest docker push $ECR_REGISTRY/$CI_REGISTRY_IMAGE:latest
- Образ пушиться з двома тегами:
451405121207.dkr.ecr.eu-central-1.amazonaws.com/fast-api-service:24ffgh24(commit SHA)451405121207.dkr.ecr.eu-central-1.amazonaws.com/fast-api-service:latest(latest)
- Образ пушиться з двома тегами:
Результат: Docker образ доступний в AWS ECR
Як працює ArgoCD:
-
ArgoCD Application налаштований:
- Відстежує репозиторій:
https://gitlab.com/your-username/your-repo.git - Гілка:
main - Шлях:
helm/(Helm чарт) - Auto-sync увімкнено з інтервалом перевірки (зазвичай 3 хвилини)
- Відстежує репозиторій:
-
ArgoCD виявляє зміни:
- ArgoCD періодично перевіряє Git репозиторій
- Якщо зміни в
helm/директорії або вargocd/application.yaml:- ArgoCD виявляє новий commit
- Порівнює поточний стан кластера з бажаним станом з Git
-
Auto-sync політика:
prune: true- видаляє ресурси, яких більше немає в GitselfHeal: true- автоматично відновлює стан, якщо хтось змінив його вручнуallowEmpty: false- не дозволяє порожній sync
Процес синхронізації:
-
ArgoCD читає Helm чарт:
- Завантажує
helm/Chart.yaml - Завантажує
helm/values.yaml - Застосовує параметри з
argocd/application.yaml:image.repository: 451405121207.dkr.ecr.eu-central-1.amazonaws.com/fast-api-service image.tag: latest
- Завантажує
-
Генерація Kubernetes manifests:
- ArgoCD виконує
helm templateз параметрами - Генерує Kubernetes ресурси:
- Deployment
- Service
- ServiceAccount
- Ingress (якщо увімкнено)
- HPA (якщо увімкнено)
- ArgoCD виконує
-
Застосування змін до кластера:
- ArgoCD використовує Kubernetes API для застосування змін
- Виконується
kubectl applyдля нових/оновлених ресурсів
Процес оновлення в EKS:
-
Deployment Controller виявляє зміни:
- Kubernetes виявляє нову версію Deployment
- Порівнює поточний стан з бажаним
-
Rolling Update:
- Kubernetes створює нові Pod'и з новим образом
- Новий образ:
451405121207.dkr.ecr.eu-central-1.amazonaws.com/fast-api-service:latest - Старі Pod'и продовжують працювати до готовності нових
-
Readiness Probe:
- Kubernetes перевіряє
/docsendpoint - Коли нові Pod'и готові (readiness probe успішна):
- Трафік переключається на нові Pod'и
- Старі Pod'и завершуються
- Kubernetes перевіряє
-
Результат:
- Сервіс оновлено до нової версії
- Мінімальний downtime (rolling update)
- 2 репліки працюють з новим кодом
Моніторинг процесу:
-
GitLab CI/CD:
- Перевірити статус build job в GitLab UI
- Переконатись, що образ успішно запушено в ECR
-
ArgoCD UI:
- Відкрити ArgoCD dashboard
- Перевірити статус Application
mlops-inference-service - Побачити синхронізацію в реальному часі
-
Kubernetes:
kubectl get pods -n default kubectl get deployment mlops-inference-service -n default kubectl describe deployment mlops-inference-service -n default
-
Тестування сервісу:
kubectl port-forward svc/mlops-inference-service 8000:8000 -n default curl http://localhost:8000/docs curl -X POST http://localhost:8000/predict -H "Content-Type: application/json" -d '{"input": "test"}'
- Змінюється
predict.pyабоrequirements.txt - Push в GitLab → Build job збирає новий образ
- Образ пушиться в ECR з тегом
latest - ArgoCD не виявляє змін в
helm/, але образlatestоновлено - Потрібно оновити Helm чарт або змінити
image.tagв ArgoCD application
Рішення: Оновити argocd/application.yaml з новим тегом або використати commit SHA
- Змінюється конфігурація в
helm/values.yaml(наприклад,replicaCount: 3) - Push в GitLab
- ArgoCD виявляє зміни в
helm/директорії - ArgoCD автоматично синхронізує зміни
- Kubernetes масштабує deployment до 3 реплік
- Змінюється
Dockerfile - Push в GitLab → Build job збирає новий образ
- Образ пушиться в ECR
- ArgoCD використовує образ
latest, тому автоматично підхопить новий образ - Kubernetes виконує rolling update
- Образ з тегом
latestзавжди вказує на останню збірку - Образ з commit SHA дозволяє відкотитись до конкретної версії
- Рекомендується використовувати конкретні теги для production
- ArgoCD auto-sync забезпечує автоматичне оновлення
- Self-heal відновлює стан при ручних змінах
- Prune видаляє застарілі ресурси
- ArgoCD UI показує статус синхронізації
- Kubernetes events показують процес оновлення
- GitLab CI/CD показує статус збірки
- Build job: 2-5 хвилин (залежить від розміру образу)
- ArgoCD sync: 3-5 хвилин (інтервал перевірки + час синхронізації)
- Kubernetes rolling update: 1-3 хвилини (залежить від кількості реплік)
- Загальний час: 6-13 хвилин від push до повного редеплою