NOTE: This guide is for using kustomize in kubectl which uses a old version of kustomize this means your writing a lot of deprecated codes like using bases.
Kustomize is a standalone tool to customize Kubernetes objects through a kustomization file. It has been part of kubectl since v1.14 These examples are based on using the built in version of kubectl but it is strongly suggested to migrate away and use the latest version.
Run kustomization file
To apply or delete a set of manifests you use the -k command
kubectl apply -k k8s/my-app/overlays/production/
View generated output of kustomization
To view the manifest that gets generated from kustomize you can the below command pointing at the the base or overlays/env folder
kubectl kustomize k8s/my-app/overlays/production/
base settings
Below are examples of the base kustomization file
resources
This is the most basic usage of kustomization. Allowing you to deploy a namespace and other manifests at the same time
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: confluence
resources:
- ./namespace.yml
- ./storage.yml
- ./deployment.yml
- ./service.yml
overlays settings
Below are examples of overlays for various manifests and options.
image or tag
Update the tag of the image pulled via overlay:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
images:
- name: nginx
newTag: 1.19
You could also update the image as well via if you say need to use a different repository
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
images:
- name: nginx # note this is the image: tag not the name of the container
newName: <NEW ECR PATH>/nginx
newTag: 3.4.5
patchesStrategicMerge
If you need to update a value of a manifest file from the base, the easist way is to create a new file in the overlays/env folder and reference it via patchesStrategicMerge.
The file will need to re-create the yml down to the value you are overwriting for example:
deployment example
A common issue will be updating the env variables for the pods in a deplyment for each overlay this can be done via creating a file (Below could is called: db-deployment.yml) containing your env settings like:
apiVersion: apps/v1
kind: Deployment
metadata:
name: confluence
spec:
template:
spec:
containers:
- name: app
env:
- name: ATL_JDBC_URL
value: "jdbc:postgresql://my-prod-rds-server:5432/db"
- name: ATL_JDBC_USER
value: "postgres"
and then add a patchesStrategicMerge section to kustomization.yml and reference the file db-deployment.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
patchesStrategicMerge:
- db-deployment.yml
service example
Another example would be updating the arn for a certificate in each overlay. Again you would simply create a new file in overlays/env folder (In this example its called arn-serivce.yml)
arn-service.yml will copy all yml from the base serivce but ignore all other values that are set so would look like:
apiVersion: v1
kind: Service
metadata:
name: dos
namespace: dos
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:eu-west-2:xx:certificate/xxx
Again you would update kustomization.yml in the overlays/env to reference the new resource
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
patchesStrategicMerge:
- arn-service.yml
config-maps
You can either write the configmap into the kustomization file or keep it in an external file. I prefer the later:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
patchesStrategicMerge:
- config-map.yml