I was looking at the Kustomize variable trick I did a year ago and I think I’ve learned some new tricks worth noting down.
Variables are very handy most of the times, here’s a pattern to define a variable to be used in Kustomize templates and set its value via annotations.
# base/gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: wordpress-gateway
spec:
selector:
istio: ingressgateway
servers:
- hosts:
# the domain name will be set by the variable
- $(DOMAIN)
tls:
mode: SIMPLE
credentialName: $(CERT)
port:
name: https
number: 443
protocol: HTTPS
# base/virtual-service.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: wordpress-vs
spec:
gateways:
- wordpress-gateway
hosts:
# same domain here so no need to repeat the domain name, also the virtual service will always match the gateway
- $(DOMAIN)
http:
- route:
- destination:
host: wordpress
# base/config.yaml, ensure variables are enabled for Istio resources
varReference:
- path: spec/hosts
kind: VirtualService
- path: spec/servers/hosts
kind: Gateway
- path: spec/servers/tls/credentialName
kind: Gateway
# at last the base/kustomize.yaml which defines 2 variables: DOMAIN and CERT
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configurations:
- config.yaml
resources:
- gateway.yaml
- virtual-service.yaml
# the content of deployment isn't given here, any valid deployment resource should do
- deployment.yaml
vars:
- name: DOMAIN
objref:
apiVersion: apps/v1
kind: Deployment
name: wordpress
fieldref:
fieldpath: metadata.annotations.domain
- name: CERT
objref:
apiVersion: apps/v1
kind: Deployment
name: wordpress
fieldref:
fieldpath: metadata.annotations.cert
# the above templates form a base Kustomize template and any Kustomize template extending the above base can have the variables set for real values
# site1/kustomize.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: wordpress-1
bases:
- ../base
commonAnnotations:
domain: site1.blog
cert: site1-blog-certThere you have it: When building the overlay template site1, variable DOMAIN will have the value of site1.blog; and CERT variable will be set to site1-blog-cert.
🙂
