From 56809f056ee9d0f72a4a1685c1e641c74a7581b6 Mon Sep 17 00:00:00 2001 From: harry Date: Tue, 15 Sep 2015 17:44:00 +0800 Subject: [PATCH 1/4] Demo a sidecar mode within pod for java users --- examples/javaweb-tomcat-sidecar/README.md | 216 ++++++++++++++++++ .../javaweb-tomcat-sidecar/javaweb-2.yaml | 29 +++ examples/javaweb-tomcat-sidecar/javaweb.yaml | 22 ++ examples/javaweb-tomcat-sidecar/workflow.png | Bin 0 -> 46353 bytes 4 files changed, 267 insertions(+) create mode 100644 examples/javaweb-tomcat-sidecar/README.md create mode 100644 examples/javaweb-tomcat-sidecar/javaweb-2.yaml create mode 100644 examples/javaweb-tomcat-sidecar/javaweb.yaml create mode 100644 examples/javaweb-tomcat-sidecar/workflow.png diff --git a/examples/javaweb-tomcat-sidecar/README.md b/examples/javaweb-tomcat-sidecar/README.md new file mode 100644 index 00000000000..bb2347664a4 --- /dev/null +++ b/examples/javaweb-tomcat-sidecar/README.md @@ -0,0 +1,216 @@ + + + + +WARNING +WARNING +WARNING +WARNING +WARNING + +

PLEASE NOTE: This document applies to the HEAD of the source tree

+ +If you are using a released version of Kubernetes, you should +refer to the docs that go with that version. + + +The latest 1.0.x release of this document can be found +[here](http://releases.k8s.io/release-1.0/examples/javaweb-tomcat-sidecar/README.md). + +Documentation for other releases can be found at +[releases.k8s.io](http://releases.k8s.io). + +-- + + + + + +## Java Web Application with Tomcat and Sidercar Container + +The following document describes the deployment of a Java Web application using Tomcat. Instead of packaging `war` file inside the Tomcat image or mount the `war` as a volume, we use a sidecar container as `war` file provider. + +### Prerequisites + +https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/prereqs.md + +### Overview + +This sidecar mode brings a new workflow for Java users: + +![](workflow.png?raw=true "Workflow") + +As you can see, user can create a `sample:v2` container as sidecar to "provide" war file to Tomcat by copying it to the shared `emptyDir` volume. And Pod will make sure the two containers compose a "atomic" scheduling unit, which is perfect for this case. Thus, your application version management will be totally seperated from web server management. + +For example, if you gonna change the configurations of your Tomcat: + +``` +docker exec -it /bin/bash +# do your change, and then commit it to a new image +docker commit mytomcat:7.0-dev +``` + +Done! The new Tomcat image **will not** mess up with your `sample.war` file. + +You can also upgrade your app to new version seperately, without creating a new "Tomcat plus app" image (and this image will become huge as unionfs will keep all the old war files in its layers). + +**Why don't put my `sample.war` in a host dir and mount it to tomcat container?** + +You have to **manage the volumes** in this case, for example, when you restart or scale the Pod on another Node, your contents is not ready on that host. + +Generally, we have to set up a distributed file system (NFS at least) volume to solve this (if we do not have GCE PD volume). But seriously, it's a overkill. + +### How To + +In Kubernetes a [_Pod_](../../docs/user-guide/pods.md) is the smallest deployable unit that can be created, scheduled, and managed. Its a collocated group of containers that share an IP and storage volume. + +Here is the config [javaweb.yaml](javaweb.yaml) for Java Web pod: + +NOTE: you should define `war` contaienr **first** as it is the "provider". + + + +``` +apiVersion: v1 +kind: Pod +metadata: + name: javaweb +spec: + containers: + - image: resouer/sample:v1 + name: war + volumeMounts: + - mountPath: /app + name: app-volume + - image: resouer/mytomcat:7.0 + name: tomcat + command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"] + volumeMounts: + - mountPath: /root/apache-tomcat-7.0.42-v2/webapps + name: app-volume + ports: + - containerPort: 8080 + hostPort: 8001 + volumes: + - name: app-volume +``` + + + +The only magic here is the `resouer/sample:v1` image: + +``` +FROM busybox:latest +ADD sample.war sample.war +CMD "sh" "mv.sh" +``` + +And the content inf `mv.sh` is: + +```sh +cp /sample.war /app +tail -f /etc/hosts +``` + +#### Explaination + +1. 'war' container only contains the `war` file of your app +2. 'war' container's CMD try to copy `sample.war` to the `emptyDir` volume path +3. The last line of `tailf -f` is just used to hold the container, as RC does not support one-off task +4. 'tomcat' container will load the `sample.war` from volume path + +What's more, if you don't want to add a build in `mv.sh` script in the `war` container, you can use Pod lifecycle handler to do the copy work, here's a example [javaweb-2.yaml](javaweb-2.yaml): + + + + +``` +apiVersion: v1 +kind: Pod +metadata: + name: javaweb-2 +spec: + containers: + - image: resouer/sample:v2 + name: war + lifecycle: + postStart: + exec: + command: + - "cp" + - "/sample.war" + - "/app" + volumeMounts: + - mountPath: /app + name: app-volume + - image: resouer/mytomcat:7.0 + name: tomcat + command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"] + volumeMounts: + - mountPath: /root/apache-tomcat-7.0.42-v2/webapps + name: app-volume + ports: + - containerPort: 8080 + hostPort: 8001 + volumes: + - name: app-volume +``` + + + +And the `resouer/sample:v2` Dockerfile is quite simple: + +``` +FROM busybox:latest +ADD sample.war sample.war +CMD "tail" "-f" "/etc/hosts" +``` + +#### Explaination + +1. 'war' container only contains the `war` file of your app +2. 'war' container's CMD use `tail` to hold the container, nothing else +3. The `postStart` lifecycle handler will do `cp` after the `war` container is started +4. Again 'tomcat' container will load the `sample.war` from volume path + +Done! Now your `war` container contains nothing except `sample.war`, clean enough. + +### Test It Out + +Create the Java web pod: + +```sh +kubectl create -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml +``` + +Check status of the pod: + +```sh +kubectl get -w po +NAME READY STATUS RESTARTS AGE +javaweb-2 2/2 Running 0 7s +``` + +Wait for the status to `2/2` and `Running`. Then you can visit "Hello, World" on `http://localhost:8001/sample/index.html` + +You can also test `javaweb.yaml` in the same way. + +### Delete Resources + +All resources created in this application can be deleted: + +```sh +kubectl delete -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml +``` + + + + + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/examples/javaweb-tomcat-sidecar/README.md?pixel)]() + diff --git a/examples/javaweb-tomcat-sidecar/javaweb-2.yaml b/examples/javaweb-tomcat-sidecar/javaweb-2.yaml new file mode 100644 index 00000000000..74908189309 --- /dev/null +++ b/examples/javaweb-tomcat-sidecar/javaweb-2.yaml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: Pod +metadata: + name: javaweb-2 +spec: + containers: + - image: resouer/sample:v2 + name: war + lifecycle: + postStart: + exec: + command: + - "cp" + - "/sample.war" + - "/app" + volumeMounts: + - mountPath: /app + name: app-volume + - image: resouer/mytomcat:7.0 + name: tomcat + command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"] + volumeMounts: + - mountPath: /root/apache-tomcat-7.0.42-v2/webapps + name: app-volume + ports: + - containerPort: 8080 + hostPort: 8001 + volumes: + - name: app-volume \ No newline at end of file diff --git a/examples/javaweb-tomcat-sidecar/javaweb.yaml b/examples/javaweb-tomcat-sidecar/javaweb.yaml new file mode 100644 index 00000000000..c29bcd7c481 --- /dev/null +++ b/examples/javaweb-tomcat-sidecar/javaweb.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Pod +metadata: + name: javaweb +spec: + containers: + - image: resouer/sample:v1 + name: war + volumeMounts: + - mountPath: /app + name: app-volume + - image: resouer/mytomcat:7.0 + name: tomcat + command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"] + volumeMounts: + - mountPath: /root/apache-tomcat-7.0.42-v2/webapps + name: app-volume + ports: + - containerPort: 8080 + hostPort: 8001 + volumes: + - name: app-volume \ No newline at end of file diff --git a/examples/javaweb-tomcat-sidecar/workflow.png b/examples/javaweb-tomcat-sidecar/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..7be56d082e6956c230cab02ddaa61bb2970ea4e9 GIT binary patch literal 46353 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

U@2QgD=m)dOyV=JEb1k*D-{lWJ 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 Date: Tue, 22 Sep 2015 17:37:15 +0800 Subject: [PATCH 2/4] Fix scripts in yaml and doc --- examples/javaweb-tomcat-sidecar/README.md | 56 ++++++++++--------- .../javaweb-tomcat-sidecar/javaweb-2.yaml | 4 +- examples/javaweb-tomcat-sidecar/javaweb.yaml | 4 +- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/examples/javaweb-tomcat-sidecar/README.md b/examples/javaweb-tomcat-sidecar/README.md index bb2347664a4..1825bf3bfe9 100644 --- a/examples/javaweb-tomcat-sidecar/README.md +++ b/examples/javaweb-tomcat-sidecar/README.md @@ -45,33 +45,33 @@ This sidecar mode brings a new workflow for Java users: ![](workflow.png?raw=true "Workflow") -As you can see, user can create a `sample:v2` container as sidecar to "provide" war file to Tomcat by copying it to the shared `emptyDir` volume. And Pod will make sure the two containers compose a "atomic" scheduling unit, which is perfect for this case. Thus, your application version management will be totally seperated from web server management. +As you can see, user can create a `sample:v2` container as sidecar to "provide" war file to Tomcat by copying it to the shared `emptyDir` volume. And Pod will make sure the two containers compose an "atomic" scheduling unit, which is perfect for this case. Thus, your application version management will be totally seperated from web server management. -For example, if you gonna change the configurations of your Tomcat: +For example, if you are going to change the configurations of your Tomcat: -``` -docker exec -it /bin/bash -# do your change, and then commit it to a new image -docker commit mytomcat:7.0-dev +```sh +$ docker exec -it /bin/bash +# make some change, and then commit it to a new image +$ docker commit mytomcat:7.0-dev ``` -Done! The new Tomcat image **will not** mess up with your `sample.war` file. +Done! The new Tomcat image **will not** mess up with your `sample.war` file. You can re-use your tomcat image with lots of different war container images for lots of different apps without having to build lots of different images. -You can also upgrade your app to new version seperately, without creating a new "Tomcat plus app" image (and this image will become huge as unionfs will keep all the old war files in its layers). +Also this means that rolling out a new Tomcat to patch security or whatever else, doesn't require rebuilding N different images. -**Why don't put my `sample.war` in a host dir and mount it to tomcat container?** +**Why not put my `sample.war` in a host dir and mount it to tomcat container?** -You have to **manage the volumes** in this case, for example, when you restart or scale the Pod on another Node, your contents is not ready on that host. +You have to **manage the volumes** in this case, for example, when you restart or scale the pod on another node, your contents is not ready on that host. -Generally, we have to set up a distributed file system (NFS at least) volume to solve this (if we do not have GCE PD volume). But seriously, it's a overkill. +Generally, we have to set up a distributed file system (NFS at least) volume to solve this (if we do not have GCE PD volume). But this is generally unnecessary. -### How To +### How To Set this Up -In Kubernetes a [_Pod_](../../docs/user-guide/pods.md) is the smallest deployable unit that can be created, scheduled, and managed. Its a collocated group of containers that share an IP and storage volume. +In Kubernetes a [_Pod_](../../docs/user-guide/pods.md) is the smallest deployable unit that can be created, scheduled, and managed. It's a collocated group of containers that share an IP and storage volume. Here is the config [javaweb.yaml](javaweb.yaml) for Java Web pod: -NOTE: you should define `war` contaienr **first** as it is the "provider". +NOTE: you should define `war` container **first** as it is the "provider". @@ -98,6 +98,7 @@ spec: hostPort: 8001 volumes: - name: app-volume + emptyDir: {} ``` @@ -110,21 +111,21 @@ ADD sample.war sample.war CMD "sh" "mv.sh" ``` -And the content inf `mv.sh` is: +And the contents of `mv.sh` is: ```sh cp /sample.war /app -tail -f /etc/hosts +tail -f /dev/null ``` -#### Explaination +#### Explanation 1. 'war' container only contains the `war` file of your app -2. 'war' container's CMD try to copy `sample.war` to the `emptyDir` volume path -3. The last line of `tailf -f` is just used to hold the container, as RC does not support one-off task +2. 'war' container's CMD tries to copy `sample.war` to the `emptyDir` volume path +3. The last line of `tailf -f` is just used to hold the container, as Replication Controller does not support one-off task 4. 'tomcat' container will load the `sample.war` from volume path -What's more, if you don't want to add a build in `mv.sh` script in the `war` container, you can use Pod lifecycle handler to do the copy work, here's a example [javaweb-2.yaml](javaweb-2.yaml): +What's more, if you don't want to enclose a build-in `mv.sh` script in the `war` container, you can use Pod lifecycle handler to do the copy work, here's a example [javaweb-2.yaml](javaweb-2.yaml): @@ -159,6 +160,7 @@ spec: hostPort: 8001 volumes: - name: app-volume + emptyDir: {} ``` @@ -168,13 +170,13 @@ And the `resouer/sample:v2` Dockerfile is quite simple: ``` FROM busybox:latest ADD sample.war sample.war -CMD "tail" "-f" "/etc/hosts" +CMD "tail" "-f" "/dev/null" ``` -#### Explaination +#### Explanation 1. 'war' container only contains the `war` file of your app -2. 'war' container's CMD use `tail` to hold the container, nothing else +2. 'war' container's CMD uses `tail -f` to hold the container, nothing more 3. The `postStart` lifecycle handler will do `cp` after the `war` container is started 4. Again 'tomcat' container will load the `sample.war` from volume path @@ -185,18 +187,18 @@ Done! Now your `war` container contains nothing except `sample.war`, clean enoug Create the Java web pod: ```sh -kubectl create -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml +$ kubectl create -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml ``` Check status of the pod: ```sh -kubectl get -w po +$ kubectl get -w po NAME READY STATUS RESTARTS AGE javaweb-2 2/2 Running 0 7s ``` -Wait for the status to `2/2` and `Running`. Then you can visit "Hello, World" on `http://localhost:8001/sample/index.html` +Wait for the status to `2/2` and `Running`. Then you can visit "Hello, World" page on `http://localhost:8001/sample/index.html` You can also test `javaweb.yaml` in the same way. @@ -205,7 +207,7 @@ You can also test `javaweb.yaml` in the same way. All resources created in this application can be deleted: ```sh -kubectl delete -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml +$ kubectl delete -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml ``` diff --git a/examples/javaweb-tomcat-sidecar/javaweb-2.yaml b/examples/javaweb-tomcat-sidecar/javaweb-2.yaml index 74908189309..b34d5ab6e26 100644 --- a/examples/javaweb-tomcat-sidecar/javaweb-2.yaml +++ b/examples/javaweb-tomcat-sidecar/javaweb-2.yaml @@ -26,4 +26,6 @@ spec: - containerPort: 8080 hostPort: 8001 volumes: - - name: app-volume \ No newline at end of file + - name: app-volume + emptyDir: {} + diff --git a/examples/javaweb-tomcat-sidecar/javaweb.yaml b/examples/javaweb-tomcat-sidecar/javaweb.yaml index c29bcd7c481..d77f6a727e6 100644 --- a/examples/javaweb-tomcat-sidecar/javaweb.yaml +++ b/examples/javaweb-tomcat-sidecar/javaweb.yaml @@ -19,4 +19,6 @@ spec: - containerPort: 8080 hostPort: 8001 volumes: - - name: app-volume \ No newline at end of file + - name: app-volume + emptyDir: {} + From cf16480add5ec8097591f264427610cd6bef43b1 Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Sat, 26 Sep 2015 02:20:13 +0000 Subject: [PATCH 3/4] Fix wrong comment in console example --- examples/javaweb-tomcat-sidecar/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/javaweb-tomcat-sidecar/README.md b/examples/javaweb-tomcat-sidecar/README.md index 1825bf3bfe9..eb8d96d817d 100644 --- a/examples/javaweb-tomcat-sidecar/README.md +++ b/examples/javaweb-tomcat-sidecar/README.md @@ -49,7 +49,7 @@ As you can see, user can create a `sample:v2` container as sidecar to "provide" For example, if you are going to change the configurations of your Tomcat: -```sh +```console $ docker exec -it /bin/bash # make some change, and then commit it to a new image $ docker commit mytomcat:7.0-dev @@ -186,13 +186,13 @@ Done! Now your `war` container contains nothing except `sample.war`, clean enoug Create the Java web pod: -```sh +```console $ kubectl create -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml ``` Check status of the pod: -```sh +```console $ kubectl get -w po NAME READY STATUS RESTARTS AGE javaweb-2 2/2 Running 0 7s @@ -206,7 +206,7 @@ You can also test `javaweb.yaml` in the same way. All resources created in this application can be deleted: -```sh +```console $ kubectl delete -f examples/javaweb-tomcat-sidecar/javaweb-2.yaml ``` From a8f09114f9283cdae687edd1fdb450c2c0dc7b3b Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Sat, 26 Sep 2015 08:08:04 +0000 Subject: [PATCH 4/4] Fix example test --- examples/examples_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/examples_test.go b/examples/examples_test.go index 8341722d70a..4c3ec1d3aba 100644 --- a/examples/examples_test.go +++ b/examples/examples_test.go @@ -367,6 +367,10 @@ func TestExampleObjectSchemas(t *testing.T) { "../examples/experimental": { "deployment": &experimental.Deployment{}, }, + "../examples/javaweb-tomcat-sidecar": { + "javaweb": &api.Pod{}, + "javaweb-2": &api.Pod{}, + }, } capabilities.SetForTests(capabilities.Capabilities{