Документация GitOps-развертывание (ArgoCD и FluxCD)

GitOps-развертывание (ArgoCD и FluxCD)

Mockarty поддерживает декларативное GitOps-развертывание через Helm-чарты и Kubernetes Operator CRD.


ArgoCD

Предварительные требования

  • ArgoCD установлен в кластере
  • Helm-чарт доступен (OCI-реестр или Git)
  • Доступ kubectl к целевому namespace

Вариант 1: Helm-чарт через ArgoCD Application

Создайте манифест ArgoCD Application:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: mockarty
  namespace: argocd
spec:
  project: default
  source:
    # Вариант A: Git-репозиторий
    repoURL: https://github.com/mockarty/mockarty.git
    targetRevision: main
    path: deploy/helm/mockarty
    helm:
      valueFiles:
        - values.yaml
        # values.minimal.yaml для одной ноды, values.cluster.yaml для HA
      parameters:
        - name: admin.replicaCount
          value: "2"
        - name: admin.env.CLUSTER_MODE
          value: "true"
        - name: resolver.enabled
          value: "true"
        - name: runner.enabled
          value: "true"
  destination:
    server: https://kubernetes.default.svc
    namespace: mockarty
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ServerSideApply=true

Примените:

kubectl apply -f mockarty-argocd-app.yaml

Вариант 2: CRD-оператор через ArgoCD

Если используете оператор Mockarty, сначала разверните CRD и оператор, затем управляйте ресурсами MockartyCluster декларативно:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: mockarty-operator
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/mockarty/mockarty.git
    targetRevision: main
    path: deploy/operator
    directory:
      recurse: false
      include: "bundle.yaml"
  destination:
    server: https://kubernetes.default.svc
    namespace: mockarty-system
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: mockarty-cluster
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/gitops-configs.git
    targetRevision: main
    path: clusters/production/mockarty
  destination:
    server: https://kubernetes.default.svc
    namespace: mockarty
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Ваш GitOps-репозиторий должен содержать манифест MockartyCluster:

# clusters/production/mockarty/cluster.yaml
apiVersion: mockarty.io/v1alpha1
kind: MockartyCluster
metadata:
  name: production
  namespace: mockarty
spec:
  adminNode:
    replicas: 2
    image: mockarty/mockarty:1.0.0
  resolver:
    enabled: true
    replicas: 2
  runner:
    enabled: true
    replicas: 3
  postgresql:
    host: postgres.database.svc
    port: 5432
    credentialsSecretRef:
      name: mockarty-db-credentials

Волны синхронизации ArgoCD

Для правильного порядка используйте аннотации sync-wave:

# Wave 0: Namespace + Secrets
apiVersion: v1
kind: Namespace
metadata:
  name: mockarty
  annotations:
    argocd.argoproj.io/sync-wave: "0"
---
# Wave 1: База данных (если управляется)
# Wave 2: Helm-релиз Mockarty
# Wave 3: Job для создания токенов

Проверки состояния

ArgoCD автоматически мониторит состояние Deployment. Mockarty предоставляет три разных endpoint — подключайте Kubernetes probes к конкретным endpoint, а не к простому /health:

  • /health/live — liveness probe (HTTP 200, пока процесс работает). Подходит для livenessProbe.
  • /health/ready — readiness probe. Проверяет подключение к БД и (если настроено) Redis. Используйте для readinessProbe. Регистрируется только если настроена БД или Redis — иначе fallback на /health/live.
  • /health — комплексный отчёт о состоянии с детализацией по компонентам (БД, Redis, планировщики и т.д.). Предназначен для операторов и дашбордов, не для probes — может возвращать не-200 даже тогда, когда под должен продолжать обслуживать трафик.

Пользовательская проверка в ArgoCD:

resource.customizations.health.mockarty.io_MockartyCluster: |
  hs = {}
  if obj.status ~= nil then
    if obj.status.phase == "Ready" then
      hs.status = "Healthy"
      hs.message = "Кластер работает"
    elseif obj.status.phase == "Deploying" then
      hs.status = "Progressing"
      hs.message = "Кластер разворачивается"
    else
      hs.status = "Degraded"
      hs.message = obj.status.phase
    end
  end
  return hs

FluxCD

Предварительные требования

  • Flux v2 установлен (flux bootstrap)
  • Git-репозиторий для состояния кластера
  • Sealed Secrets или SOPS для управления секретами

Вариант 1: Helm Release

Создайте ресурсы Flux в вашем GitOps-репозитории:

# infrastructure/mockarty/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mockarty
---
# infrastructure/mockarty/source.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: mockarty
  namespace: flux-system
spec:
  interval: 5m
  url: https://github.com/mockarty/mockarty.git
  ref:
    branch: main
---
# infrastructure/mockarty/release.yaml
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: mockarty
  namespace: mockarty
spec:
  interval: 10m
  chart:
    spec:
      chart: deploy/helm/mockarty
      sourceRef:
        kind: GitRepository
        name: mockarty
        namespace: flux-system
  values:
    admin:
      replicaCount: 2
      env:
        CLUSTER_MODE: "true"
    resolver:
      enabled: true
      replicaCount: 2
    runner:
      enabled: true
      replicaCount: 2
    postgresql:
      enabled: true
      auth:
        password: "${DB_PASSWORD}"
  valuesFrom:
    - kind: Secret
      name: mockarty-helm-values
      optional: true

Вариант 2: CRD-оператор

# infrastructure/mockarty-operator/kustomization.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: mockarty-operator
  namespace: flux-system
spec:
  interval: 10m
  path: ./deploy/operator
  prune: true
  sourceRef:
    kind: GitRepository
    name: mockarty
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: mockarty-operator
      namespace: mockarty-system
---
# clusters/production/mockarty-cluster.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: mockarty-cluster
  namespace: flux-system
spec:
  dependsOn:
    - name: mockarty-operator
  interval: 10m
  path: ./clusters/production/mockarty
  prune: true
  sourceRef:
    kind: GitRepository
    name: fleet-config

Управление секретами через SOPS

Зашифруйте учетные данные базы данных:

sops --encrypt --age age1... secrets.yaml > secrets.enc.yaml
# secrets.enc.yaml (до шифрования)
apiVersion: v1
kind: Secret
metadata:
  name: mockarty-db-credentials
  namespace: mockarty
type: Opaque
stringData:
  DB_DSN: "postgres://mockarty:password@postgres:5432/mockarty?sslmode=disable"
  FIRST_ADMIN_PASSWORD: "your-admin-password"

Настройте расшифровку Flux:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: mockarty
spec:
  decryption:
    provider: sops
    secretRef:
      name: sops-age

Уведомления

Настройте уведомления Flux о событиях развертывания:

apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
  name: mockarty-alerts
  namespace: flux-system
spec:
  providerRef:
    name: slack
  eventSeverity: error
  eventSources:
    - kind: HelmRelease
      name: mockarty
      namespace: mockarty

Стратегия обновления

ArgoCD и FluxCD поддерживают контролируемые обновления:

  1. Обновите тег образа в GitOps-репозитории (например, mockarty/mockarty:1.1.0)
  2. Закоммитьте и запушьте - GitOps-контроллер обнаружит изменение
  3. Rolling update - Kubernetes выполнит обновление без простоя
  4. Проверки состояния - контроллер проверит, что поды здоровы
  5. Автоматический откат - если проверки не проходят, восстанавливается предыдущая версия

Фиксация версий

Всегда указывайте конкретные версии в продакшене:

# Правильно: фиксированная версия
image: mockarty/mockarty:1.2.3

# Неправильно: плавающий тег
image: mockarty/mockarty:latest

Рекомендуемая структура каталогов

gitops-repo/
  infrastructure/
    mockarty/
      namespace.yaml
      source.yaml           # GitRepository / HelmRepository
      release.yaml           # HelmRelease / ArgoCD Application
      secrets.enc.yaml       # Зашифрованные секреты (SOPS)
  clusters/
    production/
      mockarty/
        cluster.yaml         # MockartyCluster CR (при использовании оператора)
        kustomization.yaml
    staging/
      mockarty/
        cluster.yaml
        kustomization.yaml