Multi-cluster fleet deployment

Met behulp van Fleet kunnen applicaties uitgerold worden vanuit een GitOps repository. Deze pagina legt uit wat de basis van Fleet inhoudt en dit artikel gaat verder in op het uitrollen van een applicatie over meerdere clusters die ook nog eens een verschillende architectuur hebben.

De downstream-clusters (targets) die hiervoor gebruikt worden, zijn:

  • Speeltuin – AMD64 architectuur
  • Raspberry-Pi – ARM64 architectuur

De applicatie die op de clusters deployed worden is een go-applicatie, voor beide architectures zijn images beschikbaar die op Docker Hub staat. Meer informatie over de go-applicatie vind je hier.

De manifests voor het uitrollen van de applicatie staat zoals gezegd in Git en afhankelijk of dit een private of een public repository is, dient voor de private repo een secret aangemaakt te worden met de Personal Access Token voor GitHub. Het commando hiervoor is:

$ kubectl create secret generic github-auth-nico \
  -n fleet-default \
  --type=kubernetes.io/basic-auth \
  --from-literal=username=<username> \
  --from-literal=password=<personal access token>

De namespace ‘fleet-default‘ wordt gebruikt voor de multi-cluster git-repo, voor een single-cluster configuratie zou dat ‘fleet-local‘ zijn.

Voor de verschillende clusters en de wijzigingen ten opzichte van elkaar wordt gebruik gemaakt van kustomize. Er is een base-directory met de default manifests voor de deployment, service en ingress. Om de deployment per cluster aan te passen is er een overlays-directory met hierin aangepaste manifests voor beide clusters voor de deployment. De tree:

.
├── fleet.yaml
├── base
│   ├── deployment.yaml
│   ├── ingress.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── raspberry-pi
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── speeltuin
        ├── deployment.yaml
        └── kustomization.yaml

Tenslotte is er een file genaamd ‘fleet.yaml‘ waarin de downstream clusters als ‘targets’ zijn opgenomen met een verwijzing naar de namespace en de desbetreffende overlays-directories:

---
namespace: go-app

targetCustomizations:
- name: speeltuin
  clusterSelector:
    matchLabels:
      name: speeltuin
  kustomize:
    dir: overlays/speeltuin

- name: raspberry-pi
  clusterName: raspberry-pi
  kustomize:
    dir: overlays/raspberry-pi

Voor de inhoud van de diverse bestanden, zie de git repository: https://github.com/NicoOosterwijk/fleet/tree/main/multi-cluster