kubernetes 下的 Nginx 加 Tomcat 三部曲之二:细说开发
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《kubernetes 下的 Nginx 加 Tomcat 三部曲》的第二章,在《kubernetes 下的 Nginx 加 Tomcat 三部曲之一:极速体验》一文我们快速部署了 Nginx 和 Tomcat,达到以下效果:
本文我会详细说明在 kubernetes 部署上述网络服务时,需要做哪些具体的工作;
列举步骤
需要以下操做才能在 kubernetes 上部署 Nginx 加 Tomcat 的服务:
开发 Tomcat 上的 web 工程和 Docker 镜像;
让 kubernetes 的机器用上 web 工程的 Docker 镜像;
开发 Tomcat 对应的 deployment 脚本;
开发 Tomcat 对应的 service 脚本;
开发 Nginx 对应的 Docker 镜像;
让 kubernetes 的机器用上 Nginx 的 Docker 镜像
开发 Nginx 对应的 deployment 脚本;
开发 Nginx 对应的 service 脚本;
开发启动上述 pod 和 service 的脚本;
开发停止并清除上述 pod 和 service 的脚本
脚本文件下载
本次体验所需的 deployment 和 service 资源是通过脚本创建的,这个脚本可以通过 GitHub 下载,地址和链接信息如下表所示:
这个 git 项目中有多个目录,本次所需的资源放在 k8s_nginx_tomcat_resource,如下图红框所示:
下到的 k8stomcatcluster20180201.tar 是个压缩包,复制到可以执行 kubectl 命令的 ubuntu 电脑上,然后解压开,是个名为 k8stomcatcluster 的文件夹;
Spring boot 的 web 工程源码下载
GitHub 下载,地址和链接信息如下表所示:
这个 git 项目中有多个目录,本次的 web 工程源码放在 k8stomcatdemo,如下图红框所示:
接下来我们开始实战开发吧;
开发环境
本次实战开发环境的具体信息如下:
操作系统:Ubuntu16;
Docker 版本:17.03.2-ce;
JDK:1.8.0_151;
maven:3.3.3;
Tomcat 上的 web 工程和 Docker 镜像
web 工程用来提供 http 服务,返回当前机器的 IP 地址给浏览器,完整源码请参照前面下载的 k8stomcatdemo 工程,这里我们还是重新创建一次;
创建一个 springboot 工程,pom.xml 内容如下:
可以看到这是个普通的 springboot 的 web 工程,唯一不同的是多了一个 maven 插件:docker-maven-plugin,使用该插件我们可以将 maven 工程制作成 docker 镜像;
整个工程只有一个 Controller,开通一个 http 接口,将当前服务器 IP 地址返回,源码如下:
以上就是工程的关键源码;
在 pom.xml 所在目录执行 mvn clean package -DskipTests docker:build,会编译构建工程,并且在本地制作好镜像文件,如下:
想了解更多 maven 制作 docker 镜像的细节,请看《maven构建docker镜像三部曲之二:编码和构建镜像》
让 kubernetes 的机器用上 web 工程的 Docker 镜像
现在的镜像只存在于开发和构建 web 工程的电脑上,为了让 kubernetes 的 node 机器能用上这个镜像,可以用以下几种方式实现:
用 docker push 命令将本机镜像推送到 hub.docker.com 网站,这样其他机器都可以通过 docker pull 命令取得了,我就是用的这种方法,需要在 hub.docker.com 上注册;
用 docker save 命令导出镜像文件,再用 docker load 命令导入;
kubernetes 所在机器安装 java 和 maven 环境,将工程在这里编译构建;
使用 docker 私有仓库,例如搭建局域网私有仓库或者阿里云私有仓库,参考《maven构建docker镜像三部曲之三:推送到远程仓库(内网和阿里云)》;
Tomcat 对应的 deployment 脚本
用 yaml 文件将详情配置好,再用 kubectl 命令执行这个配置就能创建 pod,这个 web 应用镜像的配置文件名为 tomcat.yaml,内容如下:
将上述脚本的几个关键点列举一下:
version 用 extensions/v1beta1;
kind 用 Deployment,支持升级镜像和滚动升级;
使用的镜像 bolingcavalry/k8stomcatdemo:0.0.1-SNAPSHOT,是我从本地 push 到 hub.docker.com 上去的;
创建的容器对外暴露了 8080 端口;
Tomcat 对应的 service 脚本
创建了 tomcat 的 pod 之后,为了能在 kubernetes 环境中给其他 service 使用,需要将这些 pod 包装为 service,这里是通过 tomcat-svc.yaml 文件来配置的,内容如下:
将上述脚本的几个关键点列举一下:
服务对应的 pod 是 tomcathost;
type 用 ClusterIP,为内部 service 调用提供统一 IP 地址;
服务对外暴露了 pod 的 8080 端口;
Nginx 对应的 Docker 镜像
定制的 Nginx 镜像和 Nginx 官方镜像相比,唯一的区别就是 nginx.conf 文件不同,我们用的 nginx.conf 内容如下:
以上配置中,新增的 upstream 对应的 IP 地址是 tomcathost,这是 tomcat 的 service 名称,在 Nginx 运行的时候,通过 tomcathost 就能访问到 tomcat 的 Pod;
制作 Docker 镜像的 Dockerfile 文件内容如下,每行都有注释就不再多说了:
将 nginx.conf 和 Dockerfile 放在同一个目录,然后执行命令 docker build -t bolingcavalry/nginx-with-tomcat-host:0.0.1 .,就能构建镜像文件了,如下:
让 kubernetes 的机器用上 Nginx 的 Docker 镜像
这一步和之前的 web 工程的镜像放到 kubernetes 一样,有多种方式,我用的还是通过 docker push 推送到 hub.docker.com 网站,再在 kubernetes 上 pull 下来;
Nginx 对应的 deployment 脚本
用 yaml 文件将详情配置好,再用 kubectl 命令执行这个配置就能创建 pod,这个 web 应用镜像的配置文件名为 nginx.yaml,内容如下:
以上配置中有几点要注意:
使用镜像是刚才创建的 nginx 镜像 bolingcavalry/nginx-with-tomcat-host:0.0.1;
pod 容器创建后,对外暴露 80 端口;
Nginx 对应的 service 脚本
通过 service 定义的 yaml 文件 nginx-svc.yam,将前面创建的 nginx 的 pod 包装为 service:
以上配置中有几点要注意:
type 使用 NodePort,这样可以通过节点机器的 IP 访问此 service;
将节点机器的 30006 端口和 pod 的 80 端口绑定,因此,外部访问节点 IP+30006 端口就能访问到此 Nginx 服务了;
启动上述 pod 和 service 的脚本
接下来我们创建一个 shell 脚本 start_all.sh,将上述的 tomcat 和 nginx 的 pod 以及 service 全部创建和启动:
如上所示,通过 kubectl create -f 加文件名,就能创建好 yaml 文件中定义的 pod 和 service;
停止并清除上述 pod 和 service 的脚本
创建一个 shell 脚本 stop_all.sh,能够将上述的 tomcat 和 nginx 的 pod 以及 service 全部清除掉:
如上所示,其实就是通过 kubectl delete 命令将指定的 pod 和 service 资源删除;
以上就是在 kubernetes 搭建整个 Nginx 加 Tomcat 环境的所有资源,您就可以用这些像《kubernetes下的Nginx加Tomcat三部曲之一:极速体验》文中那样去搭建和体验 kubernetes 下的 Nginx 加 Tomcat;
下一章,我们会在此环境的基础上实战 Tomcat 服务的扩容,并修改 web 工程的代码,再创建新的镜像,并且将 kubernetes 环境下在线升级新的 web 工程服务;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/83af514b6906abdd74f684659】。文章转载请联系作者。
评论