K8s em Exemplos: Overlays do Kustomize

Overlays customizam uma base para diferentes ambientes. Base contém config compartilhada. Overlays adicionam patches, réplicas e imagens específicos por ambiente.

directory-structure

Layout padrão: diretório base com manifestos compartilhados, diretório overlays com customizações específicas por ambiente. Cada overlay referencia a base.

k8s/
├── base/
│   ├── kustomization.yaml
│   ├── deployment.yaml
│   └── service.yaml
└── overlays/
    ├── staging/
    │   ├── kustomization.yaml
    │   └── namespace.yaml
    └── production/
        ├── kustomization.yaml
        └── namespace.yaml
base/kustomization.yaml

Kustomization base com recursos compartilhados. Contém a configuração comum que todos ambientes herdam.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml
  - configmap.yaml

commonLabels:
  app.kubernetes.io/name: my-app
overlays/production/kustomization.yaml

Overlay referencia base e adiciona customizações. Contagens de réplicas, imagens e config diferentes por ambiente. Namespace limita escopo de todos recursos.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ../../base
  - namespace.yaml

namespace: production

images:
  - name: my-app
    newTag: v1.5.0

replicas:
  - name: my-app
    count: 5
overlays/production/increase-resources.yaml

Strategic merge patches modificam campos específicos. Primeira seção mostra kustomization.yaml referenciando o patch. Segunda seção é o arquivo de patch em si (increase-resources.yaml). Só especifique o que muda. O resto herda da base.

patches:
  - path: increase-resources.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
        - name: app
          resources:
            requests:
              memory: 1Gi
            limits:
              memory: 2Gi
kustomization-jsonpatch.yaml

JSON patches para modificações precisas. Use op (add, replace, remove) e path para mirar campos exatos. Mais explícito que strategic merge.

patches:
  - target:
      kind: Deployment
      name: my-app
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 10
      - op: add
        path: /metadata/annotations/environment
        value: production
terminal

Deploy diferentes ambientes apontando para o diretório overlay. Compare saída renderizada para ver diferenças entre ambientes.

$ kubectl apply -k overlays/staging
namespace/staging created
configmap/app-config-abc123 created
deployment.apps/my-app created
service/my-app created

$ kubectl apply -k overlays/production
namespace/production created
configmap/app-config-def456 created
deployment.apps/my-app created
service/my-app created

$ diff <(kubectl kustomize overlays/staging) \
       <(kubectl kustomize overlays/production)

Índice | GitHub | Use as setas do teclado para navegar |