GitOps с ArgoCD в продакшене: Полное руководство по автоматизации развёртывания
Почему GitOps — Стандарт Развёртывания Kubernetes в 2026 Году
Развёртывание Kubernetes прошло путь от ручного kubectl до CI/CD-пайплайнов и далее до GitOps. В 2026 году GitOps является стандартом де-факто для развёртывания Kubernetes. Главная причина проста: Git — Единственный Источник Истины.
Традиционный CI/CD использует «модель push» — системе CI необходимы учётные данные кластера для отправки изменений через kubectl apply. Это создаёт риски безопасности, отклонения состояния и сложности аудита. GitOps использует «модель pull» — агент внутри кластера непрерывно отслеживает Git-репозиторий и автоматически применяет заявленное состояние.
| Особенность | Традиционный CI/CD | GitOps |
|---|---|---|
| Модель развёртывания | Push | Pull |
| Источник состояния | Система CI | Git-репозиторий |
| Учётные данные кластера | У CI | В кластере |
| Отклонение состояния | Сложно обнаружить | Автообнаружение и исправление |
| Аудиторский след | Логи CI | История Git |
| Откат | Перезапуск пайплайна | git revert |
| Мультикластер | Сложно | Единое управление |
| Экстренные изменения | kubectl (без аудита) | Git PR (аудитируется) |
| Кривая обучения | Низкая | Средняя |
Архитектура и Основные Концепции ArgoCD
Архитектура
┌─────────────────────────────────────────────────────┐
│ Git Repository │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ app.yaml │ │ helm/ │ │ kustomize│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────┬──────────────────────────────┘
│ git clone/pull
┌──────────────────────▼──────────────────────────────┐
│ ArgoCD Controller │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Repo Server │ │ App Controller│ │
│ └──────────────┘ └──────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ kubectl apply
┌──────────────────────▼──────────────────────────────┐
│ Kubernetes Cluster │
└─────────────────────────────────────────────────────┘
Полная Настройка: Установка, Конфигурация, Первое Приложение
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.13.0/manifests/install.yaml
kubectl wait --for=condition=available --timeout=300s deployment/argocd-server -n argocd
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
kubectl port-forward svc/argocd-server -n argocd 8080:443
Первое Приложение
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/my-app-manifests.git
targetRevision: main
path: overlays/production
destination:
server: https://kubernetes.default.svc
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- CreateNamespace=true
- ServerSideApply=true
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 3m
Управление Мультикластером
argocd cluster add production-cluster --name prod-us-east
argocd cluster add production-cluster-eu --name prod-eu-west
ApplicationSet для Мультикластера
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-app-multi-cluster
namespace: argocd
spec:
generators:
- clusters:
selector:
matchLabels:
environment: production
template:
metadata:
name: 'my-app-{{name}}'
spec:
project: production
source:
repoURL: https://github.com/myorg/my-app-manifests.git
targetRevision: main
path: overlays/production
destination:
name: '{{name}}'
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
Прогрессивная Доставка с Argo Rollouts
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.7.0/install.yaml
Конфигурация Rollout
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app
namespace: my-app
spec:
replicas: 10
strategy:
canary:
steps:
- setWeight: 10
- pause: { duration: 5m }
- setWeight: 20
- pause: { duration: 5m }
- analysis:
templates:
- templateName: success-rate
- setWeight: 50
- pause: { duration: 10m }
- setWeight: 100
canaryService: my-app-canary
stableService: my-app-stable
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: myorg/my-app:v2.0.0
ports:
- containerPort: 8080
Шаблон Анализа
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
namespace: my-app
spec:
metrics:
- name: success-rate
interval: 60s
count: 5
successCondition: result[0] >= 0.99
provider:
prometheus:
address: http://prometheus.monitoring:9090
query: |
sum(rate(http_requests_total{app="my-app",status!~"5.."}[1m]))
/
sum(rate(http_requests_total{app="my-app"}[1m]))
Управление Секретами с Sealed Secrets
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl create secret generic my-app-secret \
--from-literal=db-password='super-secret-password' \
--namespace my-app \
--dry-run=client -o yaml > secret.yaml
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
Резервное Копирование Сертификата Sealed Secrets
kubectl get secret -n kube-system sealed-secrets-key -o yaml > sealed-secrets-key-backup.yaml
ArgoCD vs Flux vs Spinnaker
| Критерий | ArgoCD | Flux | Spinnaker |
|---|---|---|---|
| Язык | Go | Go | Java/Kotlin |
| UI | Отличный | Базовый | Отличный |
| Мультикластер | Нативно | Нативно | Нативно |
| RBAC | Детальный | Базовый | Детальный |
| Прогрессивная доставка | Argo Rollouts | Flagger | Нативно |
| Управление секретами | Sealed Secrets | SOPS | Halyard |
| Кривая обучения | Средняя | Низкая | Высокая |
| Потребление ресурсов | Среднее | Низкое | Высокое |
| Лучше всего для | Средние-крупные команды | Малые команды | Крупные предприятия |
5 Распространённых Ошибок
1. Авто-синхронизация Вызывает Инциденты в Продакшене
spec:
syncPolicy:
automated:
prune: false
selfHeal: false
2. Игнорирование Resource Hooks
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
3. Слишком Много Приложений Вызывает Проблемы Производительности
data:
status.processors: "20"
task.result.workers: "10"
4. Сертификат Sealed Secrets Не Резервирован
kubectl get secret -n kube-system sealed-secrets-key -o yaml > backup.yaml
5. Плохая Структура Git-репозитория
├── clusters/
│ ├── production/
│ │ ├── apps/
│ │ └── infrastructure/
│ └── staging/
├── helm-charts/
├── kustomize/
│ ├── base/
│ └── overlays/
└── argocd/
├── projects/
└── applicationsets/
10 Устранение Неполадок
| № | Симптом | Возможная Причина | Решение |
|---|---|---|---|
| 1 | Приложение всегда OutOfSync | Изменения в Git не запускают sync | Проверить Webhook и syncPolicy |
| 2 | Sync не удаётся | Неверный формат манифеста | argocd app diff my-app |
| 3 | Ошибка загрузки образа | Отсутствуют учётные данные registry | Настроить imagePullSecrets |
| 4 | Ошибка подключения мультикластера | Недостаточный RBAC | Проверить ServiceAccount argocd-manager |
| 5 | Ошибка рендеринга Helm Chart | Проблема ссылки Values | Проверить с помощью helm template |
| 6 | Ресурсы неожиданно удалены | prune: true неправильно настроен | Проверить syncPolicy.prune |
| 7 | Rollout завис | Метрики Analysis не выполнены | kubectl argo rollouts get rollout my-app |
| 8 | Ошибка расшифровки SealedSecret | Несоответствие сертификата | Убедиться в совпадении сертификата контроллера |
| 9 | Таймаут подключения к Git | Ограничение Network Policy | Проверить NetworkPolicy и прокси |
| 10 | OOM | Слишком много Applications | Увеличить ресурсы repo-server |
argocd app get my-app
argocd app sync my-app --dry-run
argocd app diff my-app
kubectl logs -n argocd deployment/argocd-application-controller
Рекомендуемые Инструменты
- JSON-форматер: Используйте /ru/json/format для форматирования конфигураций ArgoCD Application
- Base64-кодер: Используйте /ru/encode/base64 для кодирования/декодирования данных Secret
- Калькулятор хешей: Используйте /ru/encode/hash для проверки целостности конфигурационных файлов
Итог: GitOps использует Git как единственный источник истины, решая проблемы безопасности и согласованности традиционного CI/CD через «модель pull». ArgoCD — самый зрелый инструмент GitOps для Kubernetes в 2026 году, в сочетании с Argo Rollouts для прогрессивной доставки, Sealed Secrets для управления секретами и ApplicationSet для управления мультикластером. Ключевые практики: используйте авто-синхронизацию с осторожностью в продакшене, резервируйте сертификаты Sealed Secrets, правильно организуйте структуру Git-репозитория и используйте Analysis Templates как качества шлюзы.
Попробуйте эти локальные браузерные инструменты — регистрация не требуется →