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 поддерживают контролируемые обновления:
- Обновите тег образа в GitOps-репозитории (например,
mockarty/mockarty:1.1.0) - Закоммитьте и запушьте - GitOps-контроллер обнаружит изменение
- Rolling update - Kubernetes выполнит обновление без простоя
- Проверки состояния - контроллер проверит, что поды здоровы
- Автоматический откат - если проверки не проходят, восстанавливается предыдущая версия
Фиксация версий
Всегда указывайте конкретные версии в продакшене:
# Правильно: фиксированная версия
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