摘要
很多朋友在将自己开发的应用通过kubernetes + docker 部署到集群的时候,经常会走很多弯路,遇到很多坑,作者就是在自己踏遍各个坑后写下了一系列的总结文章,本篇就是讲述如何将你的web应用通过tomcat部署到kubernetes集群中。
很多朋友在将自己开发的应用通过kubernetes + docker 部署到集群的时候,经常会走很多弯路,遇到很多坑,作者就是在自己踏遍各个坑后写下了一系列的总结文章,本篇就是讲述如何将你的web应用通过tomcat部署到kubernetes集群中。
通过kubernetes和docker将本地开发的webapp应用(本例使用的是Springboot maven工程)部署到集群上
1、将tomcat和web应用整合在一起
2、通过docker将整合在一起的tomcat和jdk制作成docker镜像(tomcat和jdk作为一个整体的镜像一部分)
3、通过kubernetes将docker制作好的tomcat镜像和jdk镜像部署到集群中
4、测试部署结果
linux系统:centos 8
docker + kubernetes
注意:没有搭建的参考我的文章进行搭建centos 8 安装 kubernetes 和 docker 最新教程
1、jdk 8u251.tar (linux 版 ,去oracle官方网站上下载:oracle 下载jdk官网 我选择的是jdk-8u251-linux-x64.tar.gz)
2、tomcat8.tar (linux版,去tomcat官方网站上下载:tomcat apatch官网,我选择的是:apache-tomcat-8.5.56.tar.gz)
3、你本地的一个java web项目(只要能在你本地tomcat中成功启动并能访问即可)
4、mysql不管(如果你的应用需要mysql,请移步我的另外一篇文章kubernetes+docker部署mysql、tomcat应用)
解压tomcat,并将war包放入tomcat根目录中的\webapps文件夹中
运行tomcat根目录中的\bin\startup.bat(如果你本地的环境为linux,则运行startup.sh)
等启动完成后,尝试访问你的应用,如能访问,则证明该tomcat和你的应用运行正常
删除tomcat根目录中的\webapps文件夹中你刚刚方进入的war包,只保留tomcat自己解压出的应用文件
将tomcat根目录压缩成 apache-tomcat-8.5.56.tar 压缩文件。此时,要制作docker中镜像的tomcat就准备好了
检查你下载的jdk-8u251-linux-x64.tar(例如,通过oracle下载的jdk压缩文件通常解压后还是一个tar的压缩文件,我们只需要保留解压后的tar文件就可以了)
首先将要制作镜像的apache-tomcat-8.5.56.tar、jdk-8u251-linux-x64.tar上传到你的docker所在的服务器上,例如我放到了如下目录下
在docker服务器上创建docker-jdk-tomcat文件
vi docker-jdk-tomcat
并将以下内容粘贴到上面的文件中
#基本镜像 FROM centos #把你上传的jdk放到docker容器里面的root目录下 ADD jdk-8u251-linux-x64.tar /root #把你上传的Tomcat放到docker容器里面的root目录下 ADD apache-tomcat-8.5.56.tar /root #设置环境变量 ENV JAVA_HOME /root/jdk1.8.0_251 #设置环境变量 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar #设置环境变量 ENV CATALINA_HOME /root/apache-tomcat-8.5.56 #设置环境变量 ENV CATALINA_BASE /root/apache-tomcat-8.5.56 #设置环境变量 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #执行startup.sh并打开日志 ENTRYPOINT /root/apache-tomcat-8.5.56/bin/startup.sh && tail -F /root/apache-tomcat-8.5.56/logs/catalina.out
上面每行都有解释,不再多说,此处需要注意的是:
1、docker-jdk-tomcat 要和上述两个tar文件在同一个目录下(不在同一个目录下请修改上面文件中的tar的路径)
2、上述文件中的内容tar的名字一定要和你自己的tar名字一致
3、环境变量一定要和你自己选的版本一致
在docker-jdk-tomcat所在目录执行以下命令
docker build -f docker-jdk-tomcat -t my-jdk-tomcat:v8 .
注意:
1、docker-jdk-tomcat 为你的dockerfile名称
2、 my-jdk-tomcat:v8 为镜像名称:标签,作用是在docker镜像中做版本标记用
3、运行时一定不要忘了后面的那个.
4、详细命令请参考docker官网文档
制作成功后,查看docker中的镜像列表
docker images
返回结果如下
此时,你本地的应用已经成功成了docker中的一个镜像,此镜像包含 tomcat+jdk
创建命名空间(我使用的是gpf-first)
kubectl create namespace gpf-first
创建tomcat-rc.yaml,并将以下内容粘贴进入
apiVersion: v1 # 描述RC对象的版本是v1 kind: ReplicationController # 我现在在声明RC对象 metadata: # metadata中的是对此RC对象描述信息 name: myweb-tomcat # 此RC对象在gpf-first命名空间中名为myweb-tomcat-1,同一个命名空间中的命名一定是不同的 namespace: gpf-first # 使用gpf-first命名空间 spec: # spec中是对RC对象的具体描述 replicas: 1 # 我要创建5个副本,单位当然是pod selector: # 选择器,用来选择对象的 app: myweb # 我选择了标签为app: myweb的pod template: # 模版,以下用来描述创建的pod的模版 metadata: # 对pod模版描述的元数据 labels: # 给以下的东西打上标签,以让selector来选择 app: myweb # 给pod模版打上app: myweb这样的标签 spec: # 对pod模版的具体描述 containers: # 以下就是要放入pod模版中的容器了 - image: docker.io/my-jdk-tomcat:v8 # 选择镜像 name: myweb # 容器名 imagePullPolicy: Never #不使用远程镜像 resources: # 给该容器分配的资源大小 limits: cpu: "0.5" memory: 1Gi ports: # 容器端口号 - containerPort: 8080 env: # 给该容器设置环境变量,这里就可以将mysql与我们的tomcat连接 - name: MYSQL_SERVICE_HOST value: 'mysql' - name: MYSQL_SERVICE_PORT value: '3306'
注意
1、上面内容中涉及到kubernetes yaml文件的使用,如果不熟悉,请您查询相关资料
2、image的值指向docker中已经打好的你的应用镜像docker.io/my-jdk-tomcat:v8
在tomcat-rc.yaml所在目录执行以下命令
kubectl create -f tomcat-rc.yaml
此时,将会创建一个pod
创建tomcat-service.yaml,并将以下内容粘贴进入
apiVersion: v1 kind: Service # 对象是service metadata: name: myweb # 此对象在命名空间中的名称 namespace: gpf-first # 使用gpf-first命名空间 spec: ports: - name: myweb-svc # 端口名称,Service是必须指定端口名称的 # 重点在于三个端口的区别,容器有端口,Service有端口,node也有真实的端口号,这里我们将这三者关联起来 port: 8080 # Service的端口号 targetPort: 8080 # 容器暴露的端口号 nodePort: 80 # node的真实端口号 selector: app: myweb # Service选择了标签为app: myweb的pod type: NodePort
在tomcat-service.yaml所在目录执行以下命令
kubectl create -f tomcat-service.yaml
此时,将会创建tomcat的服务发现(svc)
我们应该注意到,在tomcat-service.yaml文件,我们定义了对外暴露80的主机端口,因此我们可以通过以下url访问到你的tomcat中的服务
http://你的主机ip/你的应用
至此,成功完成将本地web应用制作成docker应用,并通过kubernetes部署到集群中
欣赏下成果: