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 overlays/dev
Om met kubectl (>=1.14) deze omgeving te bouwen, kan volstaan worden met het volgende commando:
kubectl apply -k overlays/dev
Transformers
Transformers kunnen worden gebruikt voor taken zoals:
- Labels en annotaties toevoegen of bijwerken.
- Namespaces wijzigen.
- Patches toepassen op resourceconfiguraties.
- Resourceconfiguraties aanpassen met plug-ins of scripts.
Transformers elimineren de noodzaak om dubbele YAML-bestanden voor verschillende omgevingen te onderhouden, waardoor Kubernetes-implementatieworkflows worden gestroomlijnd.
Een voorbeeld van een label-transformer is bijvoorbeeld deze yaml-code:
apiVersion: builtin
kind: LabelTransformer
metadata:
name: label-transformer
labels:
env: development
fieldSpecs:
- kind: Deployment
path: metadata/labels
create: true
- kind: Service
path: metadata/labels
create: true
Dit wordt in labels.yaml geplaatst en in de overlays/dev/kustomization.yaml komt dan een gedeelte ‘transformers’ bij:
bases: - ../../base/mysql - ../../base/wordpress transformers: - labels.yaml patchesStrategicMerge: - service.yaml
Het resultaat zal zijn dat alle resources worden voorzien van het label ‘development’.
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!