《kubernetes-1.8.0》14-examples-javaweb-tomcat-sidecar

《kubernetes-1.8.0》14-examples-javaweb-tomcat-sidecar

《kubernetes 1.8.0 测试环境安装部署》

时间:2017-12-04

一、tomcat在k8s中的几种部署方式:

一般而言tomcat在k8s中部署应用有以下两种方式:

  • 加载本地宿主机上war包的方式:加载tomcat镜像,并在yaml文件中定义hostPathvolume,在镜像启动时,预先将本地宿主机上的war包加载到容器中的文件系统,后续启动tomcat进程加载该war包。这种方式的几个问题很突出,首先要保证群集中有可能启动该tomcat容器的node节点上都必须存在war包,否则镜像启动加载将找不到对应的war包(可以采用共享文件系统glusterfs,nfs等等,结合上亲和性部署降低负责性),其次更新复杂,一致性维护困难,需要维护多个node上的war包,不能随镜像自动升级。
  • 将war包做到tomcat镜像中去:找一个tomcat版本,写dockerfile,将war包打包进去。但这样做就将中间件和应用打包在一起,导致镜像过大,无法拆分,后续升级不方便的因素。

二、tomcat sidecar mode:

kubernetes官网的example给了一个解决方案叫做 sidecar mode

简单说明一下:

这种模式将中间件版本和war包分离,放在一个pod里的两个不同容器,充分利用pod内container之间的volume及网络的共享实现war包的加载:

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 separated from web server management.

如你所见,用户能够创建一个sample:v2的容器,作为sidecar通过拷贝war包到共享的emptyDir volume方式提供war包给tomcat。pod将确定两个容器分别为原子级别的调度单元,很适合这种场景。因此,你的应用版本管理与web服务管理奖完全的分离。

三、kubernetes上提供的example:

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
    emptyDir: {}
  • 两个containerswar-来自镜像resouer/sample:v1tomcat-来自镜像resouer/mytomcat:7.0
    *volumes:定义了一个名字叫app-volume的emptydir类型的volume,该volumepod内的两个container之间共享,分别被挂载到 war/app目录以及tomcat/root/apache-tomcat-7.0.42-v2/webapps目录:
  • resouer/sample:v1:该镜像是寄语busybox做的,dockerfile超级简单(后续自己的war包可参考):
  • 另外 hostport好像不管用了,参考javaweb-2.yaml的配置
FROM busybox:latest
ADD sample.war sample.war
ADD mv.sh mv.sh
CMD "sh" "mv.sh"
  • mv.sh就做了这个事情:
cp /sample.war /app
tail -f /dev/null
  • 将 sample.war 拷到/app目录下,tail -f /dev/null 就是为了container活着

  • 后续需要维护的是sample images,新的应用版本发布的时候更新该镜像,然后rolling update。


如果不想把mv.sh 放到 sample镜像内,可以利用pod lifecycle handlerpoststart阶段执行相应命令:

* javaweb-2.yaml*

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: javaweb-2
spec:
  replicas: 1
  selector:
    matchLabels:
      name: javaweb-2
  template:
    metadata:
      labels:
        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
      volumes:
      - name: app-volume
        emptyDir: {}
---
kind: Service
apiVersion: v1
metadata:
  name: javaweb-2-service
spec:
  selector:
    name: javaweb-2
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 38002
  type: NodePort
  • resouer/sample:v2 Dockerfile is quite simple
FROM busybox:latest
ADD sample.war sample.war
CMD "tail" "-f" "/dev/null"

加载这个yaml:

kubectl create -f javaweb-2.yaml

测试访问:

本系列其他内容:

  • 01-环境准备

  • 02-etcd群集搭建

  • 03-kubectl管理工具

  • 04-master搭建

  • 05-node节点搭建

  • 06-addon-calico

  • 07-addon-kubedns

  • 08-addon-dashboard

  • 09-addon-kube-prometheus

  • 10-addon-EFK

  • 11-addon-Harbor

  • 12-addon-ingress-nginx

  • 13-addon-traefik

参考资料

https://github.com/kubernetes/examples/tree/master/staging/javaweb-tomcat-sidecar

你可能感兴趣的:(kubernetes,1.8.0)