Filters
How to search
  • Plain words find names, texts and examples.
  • "two words" finds the exact phrase.
  • --name or -x finds an option.
  • #word looks only inside commands.
  • @grep finds lessons and labs that use grep.
  • Filters: cat:network · in:labs · in:notes · level:rhcsa · ch:8 · root:yes. Put ! before a word to leave it out. OR between words means one of them.
  • ↑ ↓ to move · Enter to open · Esc to close · / to search

kustomize

Change Kubernetes YAML per environment (dev, test, prod) without templates — base plus overlays.

Level
DevSecOps service
Group
Containers and Kubernetes
Needs root
No
Package
kustomize

What it does

Kustomize starts from a base (plain YAML) and applies overlays: change the namespace, image tag, replicas, labels, or patch any field. Nothing is copied by hand, and the output is plain YAML. It is built into kubectl (kubectl apply -k, kubectl kustomize) and into Argo CD and Flux.

Each folder has a kustomization.yaml that lists resources and changes.

How to write it

kustomize build DIR
kubectl apply -k DIR
kubectl kustomize DIR

Main parts

kustomization.yaml fields

resources
Files or folders to include (also remote Git URLs).
namespace
Put everything in this namespace.
images
Change image names and tags.
replicas
Change replica counts.
patches
Strategic-merge or JSON patches for any field.
labels / commonAnnotations
Add labels / annotations to all objects.
namePrefix / nameSuffix
Change object names.
configMapGenerator / secretGenerator
Make ConfigMaps/Secrets from files (with a hash suffix).
components
Re-usable optional parts.

Options 5

Most used

Commands

build DIR
Print the final YAML.
edit set image NAME=NEW:TAG
Change the image in kustomization.yaml (CI).
edit add resource FILE
Add a resource.
create --autodetect
Create a kustomization.yaml from files.
--enable-helm
Allow helmCharts in build.

Examples 10

$ run as a normal user# run as root (or with sudo)

  1. 1The folder layout

    tree shop
    shop/
    ├── base/
    │   ├── deployment.yaml
    │   ├── service.yaml
    │   └── kustomization.yaml
    └── overlays/
        ├── dev/kustomization.yaml
        └── prod/kustomization.yaml
  2. 2The base

    cat shop/base/kustomization.yaml
    resources:
      - deployment.yaml
      - service.yaml
    labels:
      - pairs: { app: shop }
  3. 3A prod overlay

    cat shop/overlays/prod/kustomization.yaml
    resources: [../../base]
    namespace: shop-prod
    images:
      - name: ghcr.io/s0sta/shop
        newTag: 1.4.0
    replicas:
      - name: shop
        count: 3
    patches:
      - target: { kind: Deployment, name: shop }
        patch: |-
          - op: add
            path: /spec/template/spec/containers/0/resources
            value: { limits: { memory: 512Mi, cpu: 500m } }
  4. 4See and apply the result

    kustomize build shop/overlays/prod | less
    kubectl diff -k shop/overlays/prod
    kubectl apply -k shop/overlays/prod
  5. 5Change the image tag in CI

    cd shop/overlays/prod && kustomize edit set image ghcr.io/s0sta/shop=ghcr.io/s0sta/shop:1.5.0
    git commit -am "shop 1.5.0 to prod" && git push
  6. 6Make a ConfigMap from a file

    cat shop/base/kustomization.yaml
    configMapGenerator:
      - name: shop-config
        files: [app.properties]

    The name gets a hash; pods restart by themselves when the file changes.

  7. 7Scan the final YAML

    kustomize build shop/overlays/prod > prod.yaml && trivy config prod.yaml
  8. 8Use a remote base from Git

    cat kustomization.yaml
    resources:
      - https://github.com/s0sta/platform//apps/shop/base?ref=v1.4.0
  9. 9Add a label and a name prefix to everything

    cat overlays/dev/kustomization.yaml
    resources: [../../base]
    namePrefix: dev-
    labels:
      - pairs: { env: dev }
  10. 10Patch with a small YAML file

    cat overlays/prod/probe.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata: { name: shop }
    spec:
      template:
        spec:
          containers:
            - name: shop
              readinessProbe: { httpGet: { path: /health, port: 8080 } }
    kustomize edit add patch --path probe.yaml

Watch out

  • secretGenerator with real values in Git is not safe; encrypt with SOPS or use External Secrets.
  • The kubectl built-in kustomize can be older than the standalone one.

Files

kustomization.yaml
The file in every base and overlay folder.

Tips to remember

  • Use Helm for third-party apps and Kustomize for your own apps — or Kustomize on top of a rendered chart.

Exit codes

0Success.
1Error.