Tilbake

Luke 9

Magne SkjeretSanta hat

🎄 Flux og GitOps

Av Magne Skjeret

Hva er Flux egentlig?

Flux er som en utrettelig robotassistent som holder øye med Git-repoet ditt og sørger for at Kubernetes-clusteret alltid ser ut slik som koden i repoet sier det skal. Det er litt som å ha en person som konstant sjekker at alle møblene i huset står der de skal, og flytter dem tilbake hvis noen har rota.

Hvorfor GitOps og Flux?

GitOps handler om å bruke Git som én eneste kilde til sannhet (single source of truth) for hvordan infrastrukturen din skal se ut. Alt som kjører i Kubernetes-clusteret ditt er beskrevet i Git, og endringer rulles ut ved å commite til repoet.

Problemet med tradisjonell deployment

Tradisjonelt ville man ofte:

  1. Kjøre kubectl apply fra laptopen sin

  2. Eller sette opp CI/CD som pusher til Kubernetes API

Dette krever at du åpner brannmuren og eksponerer Kubernetes API-et.

Dette er ikke alltid trygt! 🔒

Flux sin smarte løsning

Flux snur hele flyten på hodet. I stedet for at noe utenfor clusteret pusher endringer inn (push-basert), så poller Flux repoet fra innsiden av clusteret (pull-basert):

Fordeler:

  • ✅ Ingen åpning i brannmuren

  • ✅ Kubernetes API er ikke eksponert

  • ✅ Alt er definert i Git

  • ✅ Automatisk synkronisering

  • ✅ Lett å rulle tilbake (bare revert commiten!)

Slik fungerer Flux

1. Bootstrap Flux

Første steg er å installere Flux i clusteret ditt. Dette gjøres én gang:

flux bootstrap github \
  --owner=GITHUB_USER \
  --repository=manifests \
  --branch=main \
  --path=./clusters/production

Dette installerer Flux og setter opp en kobling mellom Git-repoet ditt og clusteret. Den deployer kun fra valgt path.

2. GitRepository - holder øye med Git

GitRepository er Flux sin måte å holde øye med et Git-repo på:

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 5m  # Sjekk repoet hvert 5. minutt
  url: https://github.com/myorganization/manifests
  ref:
    branch: main

Flux vil nå laste ned innholdet fra repoet hvert 5. minutt og lagre det som en "artifact" (en slags snapshot).

3. Kustomization - gjør endringer

En Kustomization forteller Flux hvilke filer som skal legges til i clusteret:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 10m
  path: ./clusters/production  # Mappen i repoet
  prune: true  # Fjern ressurser som ikke lenger er i Git
  sourceRef:
    kind: GitRepository
    name: manifests

Når Flux finner nye endringer, legger den automatisk disse til clusteret. Hvis du sletter en fil fra Git, vil Flux også slette ressursen fra clusteret (hvis prune: true).

4. Avhengigheter mellom deployments

Du kan definere at noen ting må deployes før andre:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: flux-system
  namespace: flux-system
spec:
  dependsOn:
    - name: infra  # Vent til infrastruktur er klar
  interval: 10m
  path: ./manifests/portal
  sourceRef:
    kind: GitRepository
    name: manifests

Nå vil Flux vente med å deploye manifests/portal til infra er ferdig deployet.

Helm Charts med Flux

Flux har fantastisk støtte for Helm charts! Ofte vil du bruke Helm charts fra eksterne repositories (som Prometheus, Grafana, PostgreSQL osv.).

HelmRepository - hvor Helm charts ligger

Først definerer du hvor Helm chart-repoet ligger:

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: prometheus-community
  namespace: flux-system
spec:
  interval: 1h  # Sjekk for nye chart-versjoner hver time
  url: https://prometheus-community.github.io/helm-charts

HelmRelease - installer et Helm chart

Så bruker du HelmRelease for å faktisk installere et chart:

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: prometheus
  namespace: monitoring
spec:
  interval: 15m
  chart:
    spec:
      chart: kube-prometheus-stack  # Navnet på chartet
      version: ">=79.0.0 <80.0.0"   # Versjon (kan bruke ranges!)
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
  values:
    # Her kan du overstyre Helm values
    prometheus:
      prometheusSpec:
        retention: 30d
        storageSpec:
          volumeClaimTemplate:
            spec:
              resources:
                requests:
                  storage: 50Gi

Hva skjer her?

  1. Flux laster ned kube-prometheus-stack chart fra Helm-repoet

  2. Den installer chartet i monitoring namespacet

  3. Values fra values: seksjon overstyrer default-verdiene i chartet

  4. Flux sjekker hvert 15. minutt om det har kommet nye versjoner som matcher >=79.0.0 <80.0.0

Auto-upgrade med SemVer

En av de kuleste tingene med Flux er at du kan bruke SemVer ranges:

version: "1.x"  # Oppgrader automatisk til alle 1.x versjoner
version: ">=1.2.0 <2.0.0"  # Oppgrader innenfor dette ranget

Flux vil automatisk oppdage nye versjoner og deploye dem!

Sjekk status med Flux CLI

Flux kommer med et CLI-verktøy som gjør det lett å sjekke status:

# Se alle GitRepository-kilder
flux get sources git

# Se alle Kustomizations
flux get kustomizations

# Se alle HelmReleases
flux get helmreleases

# Tvinge synkronisering med en gang
flux reconcile kustomization portal --with-source

# Se hva Flux holder på med (live!)
flux logs --follow

Oppsummering

Flux gjør GitOps enkelt:

  • 🔄 Automatisk synkronisering mellom Git og Kubernetes

  • 🔒 Ingen eksponering av Kubernetes API utover (pull, ikke push)

  • 📦 Førsteklasses støtte for Helm charts

  • 🎯 Avhengighetsstyring mellom deployments

  • 🔄 Automatisk rollback ved feil

  • 🚀 Auto-upgrade av Helm charts med SemVer

Med Flux kan dere trygt holde alle Kubernetes-manifestene deres i Git, og Flux sørger for at clusteret alltid er i sync. Endringer deployes ved å pushe til Git - ikke noe behov for å åpne brannmurer eller eksponere API-er! 🎉

ForrigeNeste