Docker+k8s+微服务部署方案
写在前面
1.关于docker+k8s的的搭建方法及过程,请参考前一篇博客
2.我们使用的架构是duboo的架构模式。所有的应用除tomcat和jar以外都启动到虚拟机上。
使用容器启动tomcat
因为使用容器启动项目,必须要有进程跑在前台,不然容器run起来后会自动退出。所以我们对tomcat的官方镜像进行了二次的build并做了自己的一些配置。
tomcat的官方镜像启动容器后,tomcat的日志是放到了前台打印出来了,并且无法做日志切割。容器退出后日志随之丢失。我们来解决这两个问题。
问题一: 日志切割
首先在容器中编译安装cronolog工具。但是安装cronolog之前需要系统安装gcc软件,tomcat官方提供的镜像很干净,并没有gcc需要我们首先先安装一下gcc 同时还要安装一下make。
问题二:解决日志输出在前台的问题。
tomcat官方镜像启动容器的方式是catalina.sh run的方式来启动的。这样启动log直接输出在前台,可以保证容器不退出。但是我们目的是把日志放到本地。
我们给tomcat的换一种启动方式,自己写一个start.sh的脚本,内容如下:
#!/bin/shsh /usr/local/tomcat/bin/startup.shtail -f /usr/local/tomcat/bin/catalina.sh
因为如果直接使用startup.sh 方式启动tomcat,会导致前台没有进程在运行,会导致容器退出,所以我们后面加一条tail -f的命令。tail那个文件随便写一个就行了。
这样能确保了tomcat的日志即做了日志切割同时又保存在了后台。
Dockerfile的文件内容如下:
FROM tomcat:7.0-slimLABEL maintainer="ZhiYu Xin<[email protected]>"ADD ./catalina.sh /usr/local/tomcat/bin/ADD ./cronolog-1.6.2.tar.gz /opt/ADD ./start.sh /usr/local/tomcat/bin/WORKDIR /opt/cronolog-1.6.2RUN echo "deb http://ftp.us.debian.org/debian/ jessie main contrib non-free" >> \ /etc/apt/sources.list && echo "deb-src http://ftp.us.debian.org/debian/ jessie main contrib non-free" \ >> /etc/apt/sources.list && apt-get update -y && apt-get install -y gcc-4.8 g++-4.8 g++-4.8-multilib make && \ ./configure && make && make install && chmod a+x /usr/local/tomcat/bin/start.shEXPOSE 8080ENTRYPOINT ["/bin/sh", "/usr/local/tomcat/bin/start.sh" ]
问题三:如何把容器输出的日志直接存放到docker的宿主机上。
我们需要在启动容器的时候,给容器挂载一个volume到/usr/local/tomcat/logs目录下就可以了。
启动容器之前最好在本地创建出对应的目录来。
启动容器的yml内容如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: tomcat labels: app: tomcatspec: replicas: 1 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: #声明一个volume以供后面使用 volumes: - name: "tomcat-log" hostPath: path: "/data" containers: - name: tomcat1 image: xinsir8/tomcat:v1 ports: - containerPort: 8080 # 挂载一个volume volumeMounts: # 挂载到哪个目录 - mountPath: /usr/local/tomcat/logs name: tomcat-log # 资源限制 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
问题四:如何解决网络问题,nginx调度和tomcat的通讯,tomcat和jar的通讯等。
其实很简单解决这个问题,我们创建一个service就能解决这个问题了。创建service的yml文件内容如下
apiVersion: v1kind: Servicemetadata: # service的名字 name: tomcat-servicespec: # service的类型,类型包括但不限于【NodePort、ClusterIP、NodePort、LoadBalancer】 type: NodePort ports: # 容器的端口 - port: 8080 # 映射后的端口 nodePort: 31003 selector: # 这个服务会被应用到标签为app等于tomcat的所有容器上 app: tomcat