Variables in Kustomize are handy helpers from time to time, with these variables I can link some settings together which should share the same value all the time. Without variable I probably need to use some template engine like Jinja2 to do the same trick.
Some examples here.
In my case, there’s a bug in kustomize
as of now(3.6.1) where configMap
object names don’t get properly suffixed in a patch file. The issue is here. I can however use variable to overcome this bug. Imagine in a scenario I have a configMap
in a base template and it will be referenced in a patch file:
# common/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
- name: common
literals:
- TEST=YES
# test/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: test
bases:
- ../base
- ../common
nameSuffix: -raynix
patchesStrategicMerge:
- patch.yaml
# test/patch.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
templates:
spec:
volumes:
- name: common
configMap:
name: common
# this should be linked to the configMap in common/kustomization.yaml but it won't be updated with a hash and suffix.
Using variable can get around this bug. Please see the following example:
# common/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configurations:
- configuration.yaml
configMapGenerator:
- name: common
literals:
- TEST=YES
vars:
- name: COMMON
objref:
apiVersion: v1
kind: ConfigMap
name: common
fieldref:
# this can be omitted as metadata.name is the default fieldPath
fieldPath: metadata.name
# test/kustomization.yaml unchanged
# test/patch.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
templates:
spec:
volumes:
- name: common
configMap:
name: $(COMMON)
# now $(COMMON) will be updated with whatever the real configmap name is
Problem solved 🙂