基于kuberantes部署web应用
2018-12-05 本文已影响19人
do_young
#背景
有一个轻量级J2EE开发的应用程序,以前是以集群的方式跑在虚拟主机的tocmat上的。现在需要将其应用容器化,并运行在kubernates环境中。
要实现该目标,需要解决以下几个问题:
1.工程的容器化。(包括工程及tomact制作成镜像,并结合起来。)
2.容器化的应用集群部署。
3.将集群服务反向代理为统一访问入口。
该文档对以上问题的解决方式如下:
1.将tomcat与工程分开为独立镜像,工程镜像为initContainers方式附属在tomcat容器上。这样当工程更新时,只需要更新工程镜像本身就好了。
2.使用Deploymen对容器应用的集群部署。
3.使用Service对集群进行反向代理。(使用反向代理的描述不太准确,请客官不要太纠结于这个细节,明白我要表示的浅显的意思就可以了。)
下面是具体的实现步骤
实现步骤
制作tomcat镜像
大家都知道,在docker的官方镜像中就有tomcat的官方镜像,我们可以直接使用
docker pull tomcat:latest#或具体的版本号
命令就要以获取,但基本镜像在使用的时候,根据实际需要,需要做一些简单的改造,这个根据实际的需求来。以下是我基于tocmat的官方镜像进行的一些配置修改的Dockerfile:
FROM tomcat:latest
MAINTAINER doyoung<11790379@qq.com>
ARG DOCUMENT_PATH
ARG UPLOAD_PATH
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" >> /etc/timezone
RUN rm /usr/local/tomcat/bin/catalina.sh
ADD catalina.sh /usr/local/tomcat/bin/
RUN chmod +x /usr/local/tomcat/bin/catalina.sh
RUN rm /usr/local/tomcat/conf/logging.properties
ADD logging.properties /usr/local/tomcat/conf/
WORKDIR /usr/local/tomcat/webapps/
RUN rm /usr/local/tomcat/conf/server.xml
ADD server.xml /usr/local/tomcat/conf/
RUN rm /usr/local/tomcat/conf/web.xml
ADD web.xml /usr/local/tomcat/conf/
VOLUME $DOCUMENT_PATH
VOLUME $UPLOAD_PATH
EXPOSE 8080
EXPOSE 443
然后通过简单的命令就可以生成一个自定义的tomcat镜像了。
docker build -t going/tomcat:latest --build-arg DOCUMENT_PATH=/root/project/go-nifty/document --build-arg UPLOAD_PATH=/root/project/go-nifty/upload .
生成工程镜像
这个只需要使用各种方式,将工程生成war包,然后使用最小的镜像将工程复制到镜像中即可,以下工程生成镜像的Dockerfile
FROM busybox:latest
MAINTAINER doyoung<duyang@going100.com>
ADD ./build/go-nifty.war ./
通过docker命令生成工程镜像
docker build -t going/go-nifty:latest -f DockerfileForQuestion .
部署工程
创建一个xx-deplyment.yaml文件,编辑如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: go-nifty-web-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
tier: go-nifty-web
template:
metadata:
labels:
tier: go-nifty-web
spec:
initContainers:
- image: going/go-nifty:latest
imagePullPolicy: IfNotPresent
name: war
command: ["cp", "/go-nifty.war", "/app"]
volumeMounts:
- mountPath: /app
name: app-volume
containers:
- name: go-nifty-web-containers
image: going/tomcat:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
- containerPort: 443
volumeMounts:
- mountPath: /usr/local/tomcat/webapps
name: app-volume
- mountPath: /root/project/go-nifty/document
name: document
- mountPath: /root/project/go-nifty/upload
name: upload
- mountPath: /usr/local/tomcat/logs
name: logs
volumes:
- name: app-volume
emptyDir: {}
参照以上创建好deployment配置文件以后,就可用使用命令,部署应用了。
kubectl create -f xx-deployment.ymal
创建服务
创建一个xx-service.ymal文件,编辑如下:
apiVersion: v1
kind: Service
metadata:
name: go-nifty-web-service
namespace: default
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
name: go-nifty-web-port
nodePort: 80
- port: 443
targetPort: 443
name: go-nifty-web-https-port
nodePort: 443
selector:
tier: go-nifty-web
通过以上的service配置文件,就可以将应用的服务开放出来了。