In this tutorial, you will learn how to use kustomize
to declare a variable reference and substitute it in container's command. Note that, the substitution is not for arbitrary fields, it is only applicable to container env, args and command.
To run WordPress, it's necessary to
- connect WordPress with a MySQL database
- access the service name of MySQL database from WordPress container
First make a place to work:
DEMO_HOME=$(mktemp -d)
MYSQL_HOME=$DEMO_HOME/mysql
mkdir -p $MYSQL_HOME
WORDPRESS_HOME=$DEMO_HOME/wordpress
mkdir -p $WORDPRESS_HOME
Download the resources and kustomization.yaml
for WordPress.
CONTENT="https://raw.githubusercontent.com\
/kubernetes-sigs/kustomize\
/master/examples/wordpress/wordpress"
curl -s -o "$WORDPRESS_HOME/#1.yaml" \
"$CONTENT/{deployment,service,kustomization}.yaml"
Download the resources and kustomization.yaml
for MySQL.
CONTENT="https://raw.githubusercontent.com\
/kubernetes-sigs/kustomize\
/master/examples/wordpress/mysql"
curl -s -o "$MYSQL_HOME/#1.yaml" \
"$CONTENT/{deployment,service,secret,kustomization}.yaml"
Create a new kustomization with two bases,
wordpress
and mysql
:
cat <<EOF >$DEMO_HOME/kustomization.yaml
resources:
- wordpress
- mysql
namePrefix: demo-
patchesStrategicMerge:
- patch.yaml
EOF
In the new kustomization, apply a patch for wordpress deployment. The patch does two things
- Add an initial container to show the mysql service name
- Add environment variable that allow wordpress to find the mysql database
CONTENT="https://raw.githubusercontent.com\
/kubernetes-sigs/kustomize\
/master/examples/wordpress"
curl -s -o "$DEMO_HOME/#1.yaml" \
"$CONTENT/{patch}.yaml"
The patch has following content
apiVersion: apps/v1beta2 kind: Deployment metadata: name: wordpress spec: template: spec: initContainers: - name: init-command image: debian command: - "echo $(WORDPRESS_SERVICE)" - "echo $(MYSQL_SERVICE)" containers: - name: wordpress env: - name: WORDPRESS_DB_HOST value: $(MYSQL_SERVICE) - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password
The init container's command requires information that depends on k8s resource object fields, represented by the placeholder variables
cat <<EOF >>$DEMO_HOME/kustomization.yaml
vars:
- name: WORDPRESS_SERVICE
objref:
kind: Service
name: wordpress
apiVersion: v1
fieldref:
fieldpath: metadata.name
- name: MYSQL_SERVICE
objref:
kind: Service
name: mysql
apiVersion: v1
EOF
WORDPRESS_SERVICE
is from the field metadata.name
of Service wordpress
. If we don't specify fieldref
, the default is metadata.name
. So MYSQL_SERVICE
is from the field metadata.name
of Service mysql
.
Confirm the variable substitution:
kustomize build $DEMO_HOME
Expect this in the output:
(truncated) ... initContainers: - command: - echo demo-wordpress - echo demo-mysql image: debian name: init-command