diff --git a/kustomize/projects/helloWorld/kustomization.yaml b/kustomize/projects/helloWorld/kustomization.yaml index 297fe43..5d40179 100644 --- a/kustomize/projects/helloWorld/kustomization.yaml +++ b/kustomize/projects/helloWorld/kustomization.yaml @@ -6,7 +6,7 @@ metadata: # Example configuration for the webserver # at https://github.com/monopole/hello commonLabels: - app: hello1 + app: hello2 resources: - deployment.yaml diff --git a/kustomize/projects/wordpress/README.md b/kustomize/projects/wordpress/README.md new file mode 100644 index 0000000..fd7e0f7 --- /dev/null +++ b/kustomize/projects/wordpress/README.md @@ -0,0 +1,149 @@ +# 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. 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 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, +`wordpress` and `mysql`: + + +``` +cat <$DEMO_HOME/kustomization.yaml +resources: +- wordpress +- mysql +namePrefix: demo- +patches: +- path: 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/v1 +> kind: Deployment +> metadata: +> name: wordpress +> spec: +> template: +> spec: +> initContainers: +> - name: init-command +> image: debian +> command: ["/bin/sh"] +> args: ["-c", "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: +> - args: +> - -c +> - echo demo-wordpress; echo demo-mysql +> command: +> - /bin/sh +> image: debian +> name: init-command +> +> ``` diff --git a/kustomize/projects/wordpress/kustomization.yaml b/kustomize/projects/wordpress/kustomization.yaml new file mode 100644 index 0000000..847dc85 --- /dev/null +++ b/kustomize/projects/wordpress/kustomization.yaml @@ -0,0 +1,19 @@ +resources: +- wordpress +- mysql +patches: +- path: patch.yaml +namePrefix: demo- + +vars: +- name: WORDPRESS_SERVICE + objref: + kind: Service + name: wordpress + apiVersion: v1 +- name: MYSQL_SERVICE + objref: + kind: Service + name: mysql + apiVersion: v1 + diff --git a/kustomize/projects/wordpress/mysql/deployment.yaml b/kustomize/projects/wordpress/mysql/deployment.yaml new file mode 100644 index 0000000..d8c4419 --- /dev/null +++ b/kustomize/projects/wordpress/mysql/deployment.yaml @@ -0,0 +1,35 @@ +apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 +kind: Deployment +metadata: + name: mysql + labels: + app: mysql +spec: + selector: + matchLabels: + app: mysql + strategy: + type: Recreate + template: + metadata: + labels: + app: mysql + spec: + containers: + - image: mysql:5.6 + name: mysql + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-pass + key: password + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + volumes: + - name: mysql-persistent-storage + emptyDir: {} diff --git a/kustomize/projects/wordpress/mysql/kustomization.yaml b/kustomize/projects/wordpress/mysql/kustomization.yaml new file mode 100644 index 0000000..bc664d1 --- /dev/null +++ b/kustomize/projects/wordpress/mysql/kustomization.yaml @@ -0,0 +1,4 @@ +resources: +- deployment.yaml +- service.yaml +- secret.yaml diff --git a/kustomize/projects/wordpress/mysql/secret.yaml b/kustomize/projects/wordpress/mysql/secret.yaml new file mode 100644 index 0000000..cd9335f --- /dev/null +++ b/kustomize/projects/wordpress/mysql/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: mysql-pass +type: Opaque +data: + # Default password is "admin". + password: YWRtaW4= diff --git a/kustomize/projects/wordpress/mysql/service.yaml b/kustomize/projects/wordpress/mysql/service.yaml new file mode 100644 index 0000000..aa3f970 --- /dev/null +++ b/kustomize/projects/wordpress/mysql/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: mysql + labels: + app: mysql +spec: + ports: + - port: 3306 + selector: + app: mysql diff --git a/kustomize/projects/wordpress/patch.yaml b/kustomize/projects/wordpress/patch.yaml new file mode 100644 index 0000000..f00a953 --- /dev/null +++ b/kustomize/projects/wordpress/patch.yaml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress +spec: + template: + spec: + initContainers: + - name: init-command + image: debian + command: ["/bin/sh"] + args: ["-c", "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 diff --git a/kustomize/projects/wordpress/wordpress/deployment.yaml b/kustomize/projects/wordpress/wordpress/deployment.yaml new file mode 100644 index 0000000..6f9dc03 --- /dev/null +++ b/kustomize/projects/wordpress/wordpress/deployment.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 +kind: Deployment +metadata: + name: wordpress + labels: + app: wordpress +spec: + selector: + matchLabels: + app: wordpress + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress + spec: + containers: + - image: wordpress:4.8-apache + name: wordpress + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - name: wordpress-persistent-storage + mountPath: /var/www/html + volumes: + - name: wordpress-persistent-storage + emptyDir: {} diff --git a/kustomize/projects/wordpress/wordpress/kustomization.yaml b/kustomize/projects/wordpress/wordpress/kustomization.yaml new file mode 100644 index 0000000..a944d00 --- /dev/null +++ b/kustomize/projects/wordpress/wordpress/kustomization.yaml @@ -0,0 +1,3 @@ +resources: +- deployment.yaml +- service.yaml diff --git a/kustomize/projects/wordpress/wordpress/service.yaml b/kustomize/projects/wordpress/wordpress/service.yaml new file mode 100644 index 0000000..6be89be --- /dev/null +++ b/kustomize/projects/wordpress/wordpress/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: wordpress + labels: + app: wordpress +spec: + ports: + - port: 80 + selector: + app: wordpress + type: LoadBalancer diff --git a/manifests/kustomize/projects/helloWorld/helloWorld.yaml b/manifests/kustomize/projects/helloWorld/helloWorld.yaml new file mode 100644 index 0000000..60cc1ce --- /dev/null +++ b/manifests/kustomize/projects/helloWorld/helloWorld.yaml @@ -0,0 +1,64 @@ +apiVersion: v1 +data: + altGreeting: Good Morning! + enableRisky: "false" +kind: ConfigMap +metadata: + labels: + app: hello2 + name: the-map +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: hello2 + name: the-service +spec: + ports: + - port: 8666 + protocol: TCP + targetPort: 8080 + selector: + app: hello2 + deployment: hello + type: LoadBalancer +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: hello2 + name: the-deployment +spec: + replicas: 3 + selector: + matchLabels: + app: hello2 + deployment: hello + template: + metadata: + labels: + app: hello2 + deployment: hello + spec: + containers: + - command: + - /hello + - --port=8080 + - --enableRiskyFeature=$(ENABLE_RISKY) + env: + - name: ALT_GREETING + valueFrom: + configMapKeyRef: + key: altGreeting + name: the-map + - name: ENABLE_RISKY + valueFrom: + configMapKeyRef: + key: enableRisky + name: the-map + image: monopole/hello:1 + name: the-container + ports: + - containerPort: 8080 diff --git a/manifests/kustomize/projects/wordpress/mysql/mysql.yaml b/manifests/kustomize/projects/wordpress/mysql/mysql.yaml new file mode 100644 index 0000000..fa12948 --- /dev/null +++ b/manifests/kustomize/projects/wordpress/mysql/mysql.yaml @@ -0,0 +1,55 @@ +apiVersion: v1 +data: + password: YWRtaW4= +kind: Secret +metadata: + name: mysql-pass +type: Opaque +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: mysql + name: mysql +spec: + ports: + - port: 3306 + selector: + app: mysql +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: mysql + name: mysql +spec: + selector: + matchLabels: + app: mysql + strategy: + type: Recreate + template: + metadata: + labels: + app: mysql + spec: + containers: + - env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + key: password + name: mysql-pass + image: mysql:5.6 + name: mysql + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - mountPath: /var/lib/mysql + name: mysql-persistent-storage + volumes: + - emptyDir: {} + name: mysql-persistent-storage diff --git a/manifests/kustomize/projects/wordpress/wordpress.yaml b/manifests/kustomize/projects/wordpress/wordpress.yaml new file mode 100644 index 0000000..76858f4 --- /dev/null +++ b/manifests/kustomize/projects/wordpress/wordpress.yaml @@ -0,0 +1,114 @@ +apiVersion: v1 +data: + password: YWRtaW4= +kind: Secret +metadata: + name: demo-mysql-pass +type: Opaque +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: mysql + name: demo-mysql +spec: + ports: + - port: 3306 + selector: + app: mysql +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: wordpress + name: demo-wordpress +spec: + ports: + - port: 80 + selector: + app: wordpress + type: LoadBalancer +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: mysql + name: demo-mysql +spec: + selector: + matchLabels: + app: mysql + strategy: + type: Recreate + template: + metadata: + labels: + app: mysql + spec: + containers: + - env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + key: password + name: demo-mysql-pass + image: mysql:5.6 + name: mysql + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - mountPath: /var/lib/mysql + name: mysql-persistent-storage + volumes: + - emptyDir: {} + name: mysql-persistent-storage +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: wordpress + name: demo-wordpress +spec: + selector: + matchLabels: + app: wordpress + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress + spec: + containers: + - env: + - name: WORDPRESS_DB_HOST + value: demo-mysql + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + key: password + name: demo-mysql-pass + image: wordpress:4.8-apache + name: wordpress + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - mountPath: /var/www/html + name: wordpress-persistent-storage + initContainers: + - args: + - -c + - echo demo-wordpress; echo demo-mysql + command: + - /bin/sh + image: debian + name: init-command + volumes: + - emptyDir: {} + name: wordpress-persistent-storage diff --git a/manifests/kustomize/projects/wordpress/wordpress/wordpress.yaml b/manifests/kustomize/projects/wordpress/wordpress/wordpress.yaml new file mode 100644 index 0000000..a7b9b02 --- /dev/null +++ b/manifests/kustomize/projects/wordpress/wordpress/wordpress.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: wordpress + name: wordpress +spec: + ports: + - port: 80 + selector: + app: wordpress + type: LoadBalancer +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: wordpress + name: wordpress +spec: + selector: + matchLabels: + app: wordpress + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress + spec: + containers: + - image: wordpress:4.8-apache + name: wordpress + ports: + - containerPort: 80 + name: wordpress + volumeMounts: + - mountPath: /var/www/html + name: wordpress-persistent-storage + volumes: + - emptyDir: {} + name: wordpress-persistent-storage