# Demo: Injecting k8s runtime data into containers In this tutorial, you will learn how to use `kustomize` to declare a variable reference and substitute it in container's 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 resources 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 kustomization.yaml Create a new kustomization with two bases: ``` cat <$DEMO_HOME/kustomization.yaml bases: - wordpress - mysql namePrefix: demo- patchesStrategicMerge: - patch.yaml EOF ``` ### Download patch for WordPress 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 $(WORDPRESS_SERVICE) and $(MYSQL_SERVICE). ### Bind the Variables to k8s Object Fields ``` cat <>$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`. ### Substitution 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 > > ```