GitOps с ArgoCD в продакшене: Полное руководство по автоматизации развёртывания

DevOps

Почему 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 как качества шлюзы.

Попробуйте эти локальные браузерные инструменты — регистрация не требуется →

#GitOps#ArgoCD#Kubernetes#持续交付#Argo Rollouts#Sealed Secrets#多集群#渐进式交付