写点什么

kubernetes 下的 Nginx 加 Tomcat 三部曲之三

作者:程序员欣宸
  • 2022 年 5 月 11 日
  • 本文字数:3380 字

    阅读完需:约 11 分钟

kubernetes下的Nginx加Tomcat三部曲之三

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


本篇概览

  • 本章是《kubernetes 下的 Nginx 加 Tomcat 三部曲系列》的终篇,今天咱们一起在 kubernetes 环境对下图中 tomcat 的数量进行调整,再修改 tomcat 中 web 工程的源码,并将现有的 tomcat 的 pod 全部替换成新代码构建的结果:

往期章节

  1. 《kubernetes下的Nginx加Tomcat三部曲之一:极速体验》

  2. 《kubernetes下的Nginx加Tomcat三部曲之二:细说开发》

列举步骤

  1. 在线扩容 Tomcat;

  2. 验证扩容结果;

  3. 修改 web 工程源码;

  4. 构建 web 工程的新镜像;

  5. 让 kubernetes 的机器用上 web 工程的 Docker 镜像

  6. 在线更新 Tomcat 的 pod 的镜像;

  7. 验证更新结果;

  8. Nginx&Tomcat 方式和 SpringCloud 方式扩容对比;

kubernetes 环境基本情况

  1. 一个 master,一个 node;

  2. master 的 IP 地址:192.168.119.148;

  3. node1 的 IP 地址:192.168.119.153;

在线扩容 Tomcat

  • 在装好 kubectl 工具的机器上执行 kubectl get pods,查看当前 pod 情况:


root@master:~# kubectl get podsNAME                          READY     STATUS    RESTARTS   AGEng-59b887b8bc-jzcv5           1/1       Running   3          2dtomcathost-7f68566795-8pl29   1/1       Running   3          2dtomcathost-7f68566795-mvg5f   1/1       Running   3          2dtomcathost-7f68566795-trscg   1/1       Running   3          2d
复制代码


  • 如上所示,目前是三个 tomcat 的 pod;

  • 执行扩容命令 kubectl scale deployment tomcathost --replicas=5,将 tomcat 的 pod 从 3 个增加到 5 个,如下:


root@master:~# kubectl scale deployment tomcathost --replicas=5deployment "tomcathost" scaledroot@master:~# kubectl get podsNAME                          READY     STATUS    RESTARTS   AGEng-59b887b8bc-jzcv5           1/1       Running   3          2dtomcathost-7f68566795-8kf76   1/1       Running   0          18stomcathost-7f68566795-8pl29   1/1       Running   3          2dtomcathost-7f68566795-mvg5f   1/1       Running   3          2dtomcathost-7f68566795-tp5xp   1/1       Running   0          18stomcathost-7f68566795-trscg   1/1       Running   3          2d
复制代码


  • tomcat 的 pod 已经增加到 5 个了,创建时间都只有 18 秒;

  • 去 dashboard 页面看以下 tomcathost 这个 deployment 的详情,可以看到 tomcat 数量已经上升到 5 个了,扩容成功:


  • 点击上图红框 1,再点击 tomcathost 这个服务,可以看到上图中的详情;

  • 上图红框 2 中是 5 个 tomcat 的 pod 的容器 IP 地址;

  • 点击上图红框 3 中的每个容器名,可以查看容器详情;

  • 上图红框 4 显示了刚才的扩容事件;

验证扩容结果

  • nginx 服务所在的 node 机器的 IP 地址是 192.168.119.153,所以在浏览器上访问:http://192.168.119.153:30006/getserverinfo ,反复刷新此页面,看到返回的 IP 地址在不断的更新,都是 tomcat 所在 pod 的 IP 地址,5 个都会出现,如下图:



  • 扩容实战就到这里,接下来我们修改 web 工程的源码,验证在线升级的能力;

修改 web 工程源码

  • tomcat 上运行的 web 工程源码,可以 GitHub 下载,地址和链接信息如下表所示:

  • 这个 git 项目中有多个目录,本次的 web 工程源码放在 k8stomcatdemo,如下图红框所示:


  • 打开工程中的 ServerInfo.java,web 接口的源码如下:


@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET)    public String getUserInfoWithRequestParam(){        return String.format("server : %s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));    }
复制代码


  • 修改返回的字符串内容,在前面加上"From new version,":


@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET)    public String getUserInfoWithRequestParam(){        return String.format("From new version, server : %s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));    }
复制代码

构建 web 工程的新镜像

  • 修改 pom.xml 中的工程版本,从<font color="blue>0.0.1-SNAPSHOT 改为<font color="blue>0.0.3,如下所示:


<groupId>com.bolingcavalry</groupId>  <artifactId>k8stomcatdemo</artifactId>  <version>0.0.3</version>  <packaging>jar</packaging>  <name>k8stomcatdemo</name>
复制代码


  • 在 pom.xml 所在目录执行 mvn clean package -DskipTests docker:build,会编译构建工程,并且在本地制作好镜像文件,如下:

root@maven:/usr/local/work/k8s/k8stomcatdemo# docker imagesREPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZEbolingcavalry/k8stomcatdemo                             0.0.3               5f2d27eafd1b        17 seconds ago      658 MBbolingcavalry/k8stomcatdemo                             latest              5f2d27eafd1b        17 seconds ago      658 MB
复制代码


让 kubernetes 的机器用上 web 工程的 Docker 镜像

  • 现在的镜像只存在于开发和构建 web 工程的电脑上,为了让 kubernetes 的 node 机器能用上这个镜像,可以用以下几种方式实现:


  1. 用 docker push 命令将本机镜像推送到 hub.docker.com 网站,这样其他机器都可以通过 docker pull 命令取得了,我就是用的这种方法,需要在 hub.docker.com 上注册,下图是正在 push 中:

  2. 用 docker save 命令导出镜像文件,再用 docker load 命令导入;

  3. kubernetes 所在机器安装 java 和 maven 环境,将工程在这里编译构建;

  4. 使用 docker 私有仓库,例如搭建局域网私有仓库或者阿里云私有仓库,参考《maven构建docker镜像三部曲之三:推送到远程仓库(内网和阿里云)》

在线更新 Tomcat 的 pod 的镜像

  • 在 kubernetes 上执行以下命令,即可升级镜像,当前的 5 个 tomcat 的 pod 会被销毁,然后用新的镜像创建 pod:


kubectl set image deployment/tomcathost tomcathost=bolingcavalry/k8stomcatdemo:0.0.3
复制代码


  • 控制台提示的信息如下:


root@maven:/usr/local/work/k8s/k8stomcatdemo# kubectl set image deployment/tomcathost tomcathost=bolingcavalry/k8stomcatdemo:0.0.3deployment "tomcathost" image updated
复制代码


  • 此刻反复执行 kubectl get pod,会看到新容器创建,旧容器正在被销毁,如下:

root@maven:/usr/local/work/k8s/k8stomcatdemo# kubectl get podNAME                          READY     STATUS              RESTARTS   AGEng-59b887b8bc-jzcv5           1/1       Running             3          2dtomcathost-6dfc87dc8b-9bkfv   1/1       Running             0          50stomcathost-6dfc87dc8b-h6gx4   0/1       ContainerCreating   0          50stomcathost-6dfc87dc8b-ht2d8   1/1       Running             0          18stomcathost-6dfc87dc8b-pfb56   1/1       Running             0          10stomcathost-6dfc87dc8b-x8pnn   1/1       Running             0          14stomcathost-7f68566795-8pl29   0/1       Terminating         3          2dtomcathost-7f68566795-trscg   0/1       Terminating         3          2d
复制代码

Nginx&Tomcat 方式和 SpringCloud 方式扩容对比

  • 在之前的文章中,我们实战了 SpringCloud 环境下服务提供方的扩容,由于是“注册 &发现”的方式,扩容只需要往 SpringCloud 环境添加 provider 机器,不需要做什么设置,请求就会被落到新的 provider 上,相关实战的地址如下:


  1. 《Docker下的Spring Cloud三部曲之一:极速体验》

  2. 《Docker下的Spring Cloud三部曲之二:细说Spring Cloud开发》

  3. 《Docker下的Spring Cloud三部曲之三:在线横向扩容》

  • 在 Nginx 加 Tomcat 环境中,如果不是在 kubernetes 环境,我们增加 Tomcat 之后需要修改 Nginx 配置,否则到达 Nginx 的请求不会被转发到新的机器上去,幸运的是 kubernete 帮我们解决了这个问题,扩容缩容都只需要控制副本数即可,不用修改 Nginx 配置了;

  • doceker-compose 虽然可以修改副本数,但是 Nginx 的配置仍然需要修改,否则新创建的 Tomcat 容器都有自己的 IP 地址,Nginx 还是感知不到;

  • 至此,kubernetes 下的 Nginx 加 Tomcat 三部曲就全部结束了,希望能在您的 kubernetes 实战中有所帮助;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 刚刚阅读数: 2
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
kubernetes下的Nginx加Tomcat三部曲之三_Java_程序员欣宸_InfoQ写作社区