🟡 Intermediate

FluxCD — GitOps pre Kubernetes

FluxCD je open-source GitOps nástroj, ktorý automaticky synchronizuje stav Kubernetes klastra s definíciami uloženými v Git repozitári. Je súčasťou CNCF a patrí medzi najpoužívanejšie GitOps riešenia.


Čo je GitOps?

GitOps je operačný model, kde:

  1. Git je single source of truth — všetky konfigurácie sú v repozitári
  2. Deklaratívny popis — definujete požadovaný stav, nie kroky
  3. Automatická synchronizácia — systém priebežne zabezpečuje zhodu stavu
  4. Pull-based model — klaster si sťahuje zmeny z Gitu (nie push z CI)

FluxCD vs ArgoCD

Vlastnosť FluxCD ArgoCD
Architektúra Sada kontrolérov Monolitická aplikácia
UI Weave GitOps (voliteľné) Bohaté vstavaný UI
Multi-tenancy Natívna podpora Cez AppProject
Helm podpora Natívna (HelmRelease) Natívna
Kustomize Natívna (Kustomization) Natívna
Image automation Vstavaná Cez Argo Image Updater
Notifikácie Vstavaný provider systém Cez notifications engine
Zložitosť Nižšia, modulárna Vyššia, ale viac out-of-the-box

Kedy FluxCD: Preferujete modulárnu architektúru, CLI-first prístup, multi-tenant prostredie.

Kedy ArgoCD: Potrebujete bohaté UI, vizuálny prehľad synchronizácie, väčší tím s rôznymi skillami.


Architektúra FluxCD

FluxCD sa skladá z niekoľkých kontrolérov:

  • Source Controller — sleduje Git repozitáre, Helm repozitáre a OCI artefakty
  • Kustomize Controller — aplikuje Kustomize manifesty
  • Helm Controller — spravuje Helm release-y
  • Notification Controller — odosiela a prijíma eventy
  • Image Reflector & Automation — deteguje nové verzie obrazov

Inštalácia

Prerekvizity

# Inštalácia Flux CLI
curl -s https://fluxcd.io/install.sh | bash

# Overenie kompatibility klastra
flux check --pre

Bootstrap s GitHub

flux bootstrap github \
  --owner=moja-organizacia \
  --repository=k8s-gitops \
  --branch=main \
  --path=clusters/production \
  --personal

Tento príkaz:

  1. Vytvorí repozitár (ak neexistuje)
  2. Nainštaluje Flux kontroléry do klastra
  3. Nakonfiguruje synchronizáciu s repozitárom

Základné koncepty

GitRepository — zdroj konfigurácií

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: app-config
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/org/app-config
  ref:
    branch: main
  secretRef:
    name: github-credentials

Kustomization — aplikovanie manifestov

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: app-production
  namespace: flux-system
spec:
  interval: 5m
  path: ./environments/production
  prune: true
  sourceRef:
    kind: GitRepository
    name: app-config
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: frontend
      namespace: production
  timeout: 3m

HelmRelease — Helm charts cez GitOps

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: nginx-ingress
  namespace: ingress-system
spec:
  interval: 10m
  chart:
    spec:
      chart: ingress-nginx
      version: "4.x"
      sourceRef:
        kind: HelmRepository
        name: ingress-nginx
        namespace: flux-system
  values:
    controller:
      replicaCount: 2
      resources:
        limits:
          memory: 256Mi

HelmRepository — zdroj Helm chartov

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: ingress-nginx
  namespace: flux-system
spec:
  interval: 1h
  url: https://kubernetes.github.io/ingress-nginx

Image Automation

FluxCD dokáže automaticky aktualizovať manifesty keď sa objaví nová verzia Docker obrazu.

Image Repository — sledovanie registra

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
  name: myapp
  namespace: flux-system
spec:
  image: ghcr.io/org/myapp
  interval: 5m

Image Policy — pravidlá pre výber verzie

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
  name: myapp
  namespace: flux-system
spec:
  imageRepositoryRef:
    name: myapp
  policy:
    semver:
      range: ">=1.0.0 <2.0.0"

Image Update Automation

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageUpdateAutomation
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 5m
  sourceRef:
    kind: GitRepository
    name: app-config
  git:
    checkout:
      ref:
        branch: main
    commit:
      author:
        name: fluxcdbot
        email: flux@company.com
      messageTemplate: "chore: update image {{range .Changed.Changes}}{{.OldValue}} -> {{.NewValue}}{{end}}"
    push:
      branch: main
  update:
    path: ./environments
    strategy: Setters

V manifeste potom označíte miesta na aktualizáciu:

containers:
  - name: app
    image: ghcr.io/org/myapp:1.2.3 # {"$imagepolicy": "flux-system:myapp"}

Notifikácie

apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Provider
metadata:
  name: slack
  namespace: flux-system
spec:
  type: slack
  channel: deployments
  secretRef:
    name: slack-webhook
---
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
  name: on-call
  namespace: flux-system
spec:
  providerRef:
    name: slack
  eventSeverity: error
  eventSources:
    - kind: Kustomization
      name: "*"
    - kind: HelmRelease
      name: "*"

Štruktúra repozitára

Odporúčaná štruktúra pre multi-environment setup:

k8s-gitops/
├── clusters/
│   ├── production/
│   │   ├── flux-system/          # Flux bootstrap
│   │   ├── infrastructure.yaml   # Kustomization pre infra
│   │   └── apps.yaml             # Kustomization pre aplikácie
│   └── staging/
│       ├── flux-system/
│       ├── infrastructure.yaml
│       └── apps.yaml
├── infrastructure/
│   ├── base/
│   │   ├── ingress-nginx/
│   │   ├── cert-manager/
│   │   └── monitoring/
│   └── overlays/
│       ├── production/
│       └── staging/
└── apps/
    ├── base/
    │   ├── frontend/
    │   └── backend/
    └── overlays/
        ├── production/
        └── staging/

Užitočné CLI príkazy

# Stav synchronizácie
flux get all

# Detail konkrétneho zdroja
flux get kustomizations

# Manuálna synchronizácia
flux reconcile kustomization app-production

# Suspend/resume
flux suspend kustomization app-production
flux resume kustomization app-production

# Logy
flux logs --kind=Kustomization --name=app-production

# Export existujúcich zdrojov
flux export source git app-config > git-source.yaml

Záver

FluxCD je elegantný a modulárny GitOps nástroj, ktorý sa výborne hodí pre tímy preferujúce CLI-first prístup a deklaratívnu konfiguráciu. Vďaka natívnej podpore Kustomize, Helm a image automation pokrýva celý lifecycle nasadzovania aplikácií do Kubernetes.