Demo a sidecar mode within pod for java users
This commit is contained in:
parent
7e72f549df
commit
20f6894667
|
@ -0,0 +1,216 @@
|
|||
<!-- BEGIN MUNGE: UNVERSIONED_WARNING -->
|
||||
|
||||
<!-- BEGIN STRIP_FOR_RELEASE -->
|
||||
|
||||
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
|
||||
width="25" height="25">
|
||||
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
|
||||
width="25" height="25">
|
||||
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
|
||||
width="25" height="25">
|
||||
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
|
||||
width="25" height="25">
|
||||
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
|
||||
width="25" height="25">
|
||||
|
||||
<h2>PLEASE NOTE: This document applies to the HEAD of the source tree</h2>
|
||||
|
||||
If you are using a released version of Kubernetes, you should
|
||||
refer to the docs that go with that version.
|
||||
|
||||
<strong>
|
||||
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).
|
||||
</strong>
|
||||
--
|
||||
|
||||
<!-- END STRIP_FOR_RELEASE -->
|
||||
|
||||
<!-- END MUNGE: UNVERSIONED_WARNING -->
|
||||
|
||||
## 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:
|
||||
|
||||

|
||||
|
||||
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 <tomcat_container_id> /bin/bash
|
||||
# do your change, and then commit it to a new image
|
||||
docker commit <tomcat_container_id> 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".
|
||||
|
||||
<!-- BEGIN MUNGE: javaweb.yaml -->
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
<!-- END MUNGE: EXAMPLE -->
|
||||
|
||||
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):
|
||||
|
||||
|
||||
<!-- BEGIN MUNGE: 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
|
||||
```
|
||||
|
||||
<!-- END MUNGE: EXAMPLE -->
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
|
||||
[]()
|
||||
<!-- END MUNGE: GENERATED_ANALYTICS -->
|
|
@ -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
|
|
@ -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
|
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
Loading…
Reference in New Issue