Kustomization

Installatie

Installeren van kustomization op een MacBook:

brew install kustomize

Kustomization wordt vaak gebruikt om meerdere wijzigingen door te voeren op een deployment zonder de bestaande source-bestanden te wijzigen. Door het ‘mergen’ van overlay bestanden kan een deployment aangepast worden om deze vervolgens met de wijzigingen te deployen in Kubernetes.

De basis (source) bestanden staan in een zgn. base directory en de wijzigingen worden in een overlays directory geplaatst, bijvoorbeeld:

|-- base
|   |-- mysql
|   |   |-- deployment.yaml
|   |   |-- secret.yaml
|   |   `-- service.yaml 
    `-- wordpress
|       |-- deployment.yaml
|       `-- service.yaml
`-- overlays
    `-- dev
        `-- service.yaml

Base

Om de base bestanden te gebruiken om een Kubernetes omgeving te maken, voegen we een kustomization.yaml bestand toe aan de base directory met de volgende inhoud:

bases:
- ./wordpress
- ./mysql 

Om deze te deployen met kubectl (>=1.14) kan het volgende commando gebruikt worden:

kubectl apply -k base

In de base/mysql/service.yml staat het volgende:

apiVersion: v1
kind: Service
metadata:
   name: mysql
   labels:
     app: mysql
spec:
   ports:
     - port: 3306
   selector:
     app: mysql

en in base/wordpress/service.yaml staat:

apiVersion: v1
kind: Service
metadata:
   name: wordpress
   labels:
     app: wordpress
spec:
   ports:
     - port: 80
   selector:
     app: wordpress
   type: LoadBalancer

Overlays

Aangezien een type ‘LoadBalancer’ niet beschikbaar is op een lokale (minikube) cluster in onze development omgeving, willen we dit wijzigen naar type ‘NodePort’. Hiervoor maken we een overlay-bestand overlays/dev/service.yaml met de volgende inhoud:

apiVersion: v1
kind: Service
metadata:
   name: wordpress
spec:
   type: NodePort
---
apiVersion: v1
kind: Service
metadata:
   name: mysql
spec:
   type: NodePort

Zoals je ziet hoeven we niet de hele inhoud van de service te gebruiken, slechts de wijzigingen die we willen doorvoeren. We gebruiken metadata.name alleen om aan te geven welke service we willen wijzigen.

Kustomization

Om de wijzigingen van de overlay/dev te mergen met de base hebben we kustomization.yaml bestanden nodig. De eerste komt in overlays/dev en bevat de volgende inhoud om aan te geven welke bases we willen gebruiken en welke patches we willen mergen:

bases:
- ../../base/mysql
- ../../base/wordpress
patchesStrategicMerge:
- service.yaml 

Vervolgens maken we kustomization.yaml bestanden in de base/mysql en de base/wordpress directories waarin aangegeven wordt welke resources gewijzigd dienen te worden met de overlays.

Voor base/mysql/kustomization.yaml:

resources:
- deployment.yaml
- service.yaml
- secret.yaml 

Voor base/wordpress/kustomization.yaml:

resources:
- deployment.yaml
- service.yaml 

We geven het volgende commando om de manifests te bekijken:

kustomize build overlay/dev

Om met kubectl (>=1.14) deze omgeving te bouwen, kan volstaan worden met het volgende commando:

kubectl apply -k overlays/dev

HELM

Met kustomize kunnen ook helm charts ge-deployed worden. Een voorbeeld in de base directory voor een awx-operator helm chart in kustomization.yaml waarbij via values.yaml extra instellingen gemaakt kunnen worden:

helmCharts:
- name: awx-operator
  repo: oci://url-van-repostory/oci-charts
  version: 0.25.1
  releaseName: awx-operator
  includeCRDs: true
  valuesFile: values.yaml

in de overlays kan een extra helm configuratie ingevoerd worden , bv met een specifieke versie en namespace:

helmCharts:
- name: awx-operator
  repo: oci://url-van-repostory/oci-charts
  version: 0.25.5
  namespace: awx-namespace
  valuesFile: values.yaml

Happy kustomizing!