Flux Repository Structure¶
Work in progress
This document is a work in progress.
TL;DR Quick Start¶
If you're familiar with Kustomize and how it operates within the Flux ecosystem this will provide a quick overview:
.
└── kubernetes/
├── clusters/
│ ├── production/ # One folder per cluster.
│ │ ├── flux-system/ # Folder containing flux-system manifests.
│ │ │ ├── ... # Flux component resource manifests.
│ │ │ └── kustomization.yaml # Generated kustomization per cluster bootstrap.
│ │ └── kustomization.yaml # Kustomization per cluster referring all manifests in core and namespace directory.
│ └── staging/
│ ├── flux-system/
│ │ ├── ...
│ │ └── kustomization.yaml
│ └── kustomization.yaml
├── core/
│ ├── base/
│ │ └── .../ # One folder per resource type and/or app with its core dependency with prune disabled.
│ │ └── application/ # One folder per application with core manifests.
│ │ └── kustomization.yaml # Kustomization per core application.
│ └── overlays/
│ ├── production/
│ │ ├── kustomization.yaml # Kustomization per cluster referencing each core app required.
│ │ └── patch.yaml # Optional patch for each environment.
│ └── staging/
│ ├── kustomization.yaml
│ └── patch.yaml
└── namespaces/
├── base/
│ └── namespace/ # One folder per namespace containing base resources.
│ ├── namespace.yaml # Namespace manifest.
│ ├── kustomization.yaml # Kustomization per namespace referring all manifests in this current directory.
│ └── application/ # Folder per app containing manifests and patches for each application.
│ └── kustomizaiton.yaml # Kustomization per app referring all manifests in this directory.
└── overlays/
├── production/
│ ├── kustomization.yaml # Kustomization per cluster referencing each namespace and app required.
│ └── patch.yaml # Optional patch for each environment.
└── staging/
├── kustomization.yaml
└── patch.yaml
Repository Structure Breakdown¶
This Git repository contains the following directories:
- clusters dir contains the Flux configuration per cluster.
- core dir contains cluster resources that are core prerequisites to the cluster.
- namespaces dir contains namespaces and application workloads per cluster.
.
├── clusters/
│ ├── production
│ └── staging
├── core/
│ ├── base
│ └── overlays/
│ ├── production
│ └── staging
└── namespaces/
├── base
└── overlays/
├── production
└── staging
The clusters/ dir contains configuration for each cluster definition and the infrastructure as code for each relevant cluster where applicable.
The core/ dir contains all resources that are prerequisites to namespaces and workloads, this includes resources: CRDs, certain applications like Istio and Gatekeeper that must exist prior to other workloads, and crossplane resources that provisions infrastructure.
The namespaces/ configuration is structured into:
- namespaces/base/ dir contains namespaces and application workload resources.
- namespaces/overlays/production/ dir contains the production cluster values and references what base components to deploy.
- namespaces/overlays/staging/ dir contains the stating cluster values and references what base components to deploy.
.
└── namespaces/
├── base/
│ └── namespace/
│ ├── namespace.yaml
│ ├── kustomization.yaml
│ └── application/
│ ├── helmrelease.yaml
│ └── kustomizaiton.yaml
└── overlays/
├── production/
│ ├── kustomization.yaml
│ └── patch.yaml
└── staging/
└── ...
In namespaces/base/ dir will be a hierarchy of all namespace/ dirs which will contain application resources. Each cluster overlay includes each namespace and/or application which is explicitly referenced; The base application configuration is defined with the following values:
apiVersion: helm.toolkit.fluxcd.io/v2beta2
kind: HelmRelease
metadata:
name: metallb
namespace: network-system
spec:
interval: 5m
chart:
spec:
chart: metallb
version: 2.0.4
sourceRef:
kind: HelmRepository
name: bitnami-charts
namespace: flux-system
interval: 10m
values:
configInline:
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.150-192.168.1.155
In namespaces/overlays/production/ dir we have a Kustomize patch file(s) with the production cluster specific values:
apiVersion: helm.toolkit.fluxcd.io/v2beta2
kind: HelmRelease
metadata:
name: metallb
namespace: network-system
spec:
values:
configInline:
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.150-192.168.1.155
Note that whilst using Kustomize we can overwrite default values; in this example the default MetalLB address pool will be patched in the production cluster to a unique pool.