Skip to main content

Helm charts

All Helm code lives under k8s/helm/charts/. There are two layers:

k8s/helm/charts/
├── symfony/ ← app chart
├── php-generic/ ← app chart
├── node-generic/ ← app chart
├── sveltekit/ ← app chart
└── components/ ← reusable subcharts
├── tasks/
├── database/
├── redis/
├── external-secret/
├── traefik-ingress/
└── pdb/

App charts

An app chart is what a project deploys. It defines the main workload (Deployment / StatefulSet) and pulls in components as dependencies.

ChartUse case
symfonySymfony PHP applications
php-genericGeneric PHP apps
node-genericGeneric Node.js apps
sveltekitSvelteKit frontends

A project picks one app chart and only writes a values file. See Publishing a project.

Components (subcharts)

A component is a reusable Helm subchart. App charts depend on them via Chart.yaml; a project enables what it needs in its values file.

ComponentWhat it produces
component-tasksCronJobs, worker Deployments, and manual (suspended) CronJobs
component-databaseMySQLApp CRD (Percona)
component-redisRedis Deployment + Service
component-external-secretInfisical SecretStore + ExternalSecret
component-traefik-ingressTraefik Ingress
component-pdbPodDisruptionBudget

Shared globals

App charts and components communicate through Helm globals under the global: key. A project values file sets these once and every subchart that needs them reads from the same place.

global:
projectSlug: my-project # used by external-secret + database
environmentSlug: staging # used by external-secret + database
secretName: app-secrets # used by app + tasks + database
nameOverride: app # the workload's name
image: # the application image
repository: registry.gitlab.com/...
tag: abc123-staging
pullPolicy: IfNotPresent
imagePullSecrets: # pull secrets for the image
- name: gitlab-auth-credentials

A project values file typically only overrides projectSlug, environmentSlug, and image: — the rest defaults are good.