Spring Boot应用在kubernetes的sidecar设计与实战,mysql分表分库技术实现
但是,这是合适的做法么?去K8S官网需要一些理论上的指导吧;
寻找官方的理论依据
官方文档地址:https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/
其中对Pod中多个容器的关系描述如下:
上图红框中提到一个容器基于共享资源对外提供服务,另一个"sidecar"容器负责更新这些共享资源;
在Kubernetes中文社区的文档中也对此作了阐述,地址是:http://docs.kubernetes.org.cn/312.html
在提到Pod中的sidecar模式时,官方文档用到"relatively advanced"来形容,进一步证实了当下该模式的正确性,如下图:
具体的实现模型如下图:
Spring Boot应用的sidecar设计
根据kubernetes官方文档的指导,再结合SpringBoot应用的特点,我设计出的sidecar部署方式如下:
该应用的业务服务被封装在一个Pod定义中,该Pod由两个容器组成;
绿色容器是来自OpenJDK 官方镜像:openjdk:8u181-jre-alpine3.8,用docker history命令查看体积,几十兆不算大:
[root@localhost work]# docker history openjdk:8u181-jre-alpine3.8
IMAGE CREATED CREATED BY SIZE COMMENT
2e01f547f003 12 days ago /bin/sh -c set -x && apk add --no-cache … 78.6 MB
12 days ago /bin/sh -c #(nop) ENV JAVA_ALPINE_VERSION… 0 B
12 days ago /bin/sh -c #(nop) ENV JAVA_VERSION=8u181 0 B
7 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbi… 0 B
7 weeks ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/… 0 B
7 weeks ago /bin/sh -c { echo ‘#!/bin/sh’; echo 's… 87 B
7 weeks ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0 B
7 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0 B
7 weeks ago /bin/sh -c #(nop) ADD file:25c10b1d1b41d46… 4.41 MB
之所以要用jre-alpine版本,是因为8u181-jdk版本相比之下大了很多,如下所示:
[root@localhost work]# docker history openjdk:8u181-jdk
IMAGE CREATED CREATED BY SIZE COMMENT
954739b8bdfb 7 days ago /bin/sh -c /var/lib/dpkg/info/ca-certifica… 355 kB
7 days ago /bin/sh -c set -ex; if [ ! -d /usr/share… 348 MB
7 days ago /bin/sh -c #(nop) ENV CA_CERTIFICATES_JAV… 0 B
7 days ago /bin/sh -c #(nop) ENV JAVA_DEBIAN_VERSION… 0 B
3 weeks ago /bin/sh -c #(nop) ENV JAVA_VERSION=8u181 0 B
3 weeks ago /bin/sh -c #(nop) ENV JAVA_HOME=/docker-j… 0 B
3 weeks ago /bin/sh -c ln -svT "/usr/lib/jvm/java-8-op… 33 B
3 weeks ago /bin/sh -c { echo ‘#!/bin/sh’; echo 's… 87 B
3 weeks ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0 B
3 weeks ago /bin/sh -c apt-get update && apt-get insta… 2.21 MB
3 weeks ago /bin/sh -c apt-get update && apt-get insta… 142 MB
3 weeks ago /bin/sh -c set -ex; if ! command -v gpg >… 7.8 MB
3 weeks ago /bin/sh -c apt-get update && apt-get insta… 23.2 MB
3 weeks ago /bin/sh -c #(nop) CMD [“bash”] 0 B
3 weeks ago /bin/sh -c #(nop) ADD file:b3598c18dc39584… 101 MB
红色容器的镜像是用Spring Boot应用构建出来的,稍后再详细整个过程;
在kubernetes环境,这两个容器会挂载同一个Volume,红色容器将jar放在此处,绿色容器使用此处的jar;
红色容器用来提供jar,没有进程需要保持运行状态,很适合设置为Init Container类型;
绿色容器的java进程是长久运行的;
以上就是整体设计思路,接下来咱们就来实战吧,分三步完成:
实战步骤列举
本次实战分为以下几部分组成:
开发Spring Boot应用;
制作Docker镜像,做两个版本,以便验证升级;
编写yaml文件;
在kubernetes环境部署,验证;
升级版本,验证;
环境和版本信息
编译构建的jdk和运行的jre都用1.8版本;
maven:3.3.3;
spring boot:2.1.0.RELEASE;
docker:1.13.1;
kubernetes:1.12.2;
本次实战一共有四台CentOS7机器,基本信息如下:
| hostname | IP地址 | 身份 | 配置 |
| :-- | :-- | :-- | :-- |
| localhost | 192.168.119.157 | master,主控节点 | 双核,2G内存 |
| node1 | 192.168.119.156 | node,一号业务节点 | 双核,4G内存 |
| node2 | 192.168.119.159 | node,二号业务节点 | 双核,2G内存 |
| maven | 192.168.119.155 | 负责编译构建Spring Boot应用 | 双核,2G内存 |
kubernetes环境由localhost、node1、node2三台机器组成,maven负责编译构建、生成镜像、上传到镜像仓库等操作;
开发Spring Boot应用
这是个简单的Spring Boot应用,对外提供一个http接口,返回一个字符串;
您可以选择直接从GitHub下载这个工程的源码,地址和链接信息如下表所示:
| 名称 | 链接 | 备注 |
| :-- | :-- | :-- |
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个文件夹,本章源码在springbootsidecardemo这个文件夹下,如下图红框所示:
您也可以随本文一起来开发这个应用:
应用名为springbootsidecardemo,是用maven构建的,JDK使用1.8,Spring Boot版本2.1.0.RELEASE;
应用的pom.xml如下,为了构建Docker镜像使用了docker-maven-plugin插件,该插件具体的配置请参照下面的注释:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
4.0.0
com.bolingcavalry
springbootsidecardemo
0.0.1
jar
springbootsidecardemo
Demo project for Spring Boot sidecard demo in K8S
org.springframework.boot
spring-boot-starter-parent
2.1.0.RELEASE
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
app
org.springframework.boot
spring-boot-maven-plugin
com.spotify
docker-maven-plugin
0.4.12
bolingcavalry/${project.artifactId}
${project.version}
busybox
/
${project.build.directory}
app.jar
上面的配置有一处需要注意,就是基础镜像的选择(就是baseImage节点中的内容),我用了busybox,用它是因为够小,来看docker镜像仓库中的描述,地址是https://hub.docker.com/_/busybox/:
看到这里,可能会有朋友问"为什么不用scratch?它比busybox更小",scratch虽小,但不带基本的shell命令,例如cp命令,而后容器启动时要用cp命令对文件做复制操作,因此只能选择busybox了;
- Controller类的代码也很简单:
package com.bolingcavalry.springbootsidecardemo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
@Description: 一个最普通的Controller,hello接口返回一个字符串并带上当前时间
@author: willzhao E-mail: zq2599@gmail.com
@date: 2018/11/6 14:15
*/
@RestController
public class HelloController {
@RequestMapping(value = “/hello”)
public String hello(){
return "Hello version 1.0 " + new Date();
}
}
制作应用的Docker镜像
请确保您当前环境的maven和Docker都已经OK了;
在应用的pom.xml所在目录执行如下命令即可构建Docker镜像:
mvn clean package -U -DskipTests docker:build
构建成功的控制台输出如下:
[INFO] Building image bolingcavalry/springbootsidecardemo
[INFO] Building image bolingcavalry/springbootsidecardemo
Step 1/2 : FROM busybox
—> 59788edf1f3e
Step 2/2 : ADD /app.jar //
—> 8105c9ac033b
Removing intermediate container fdc62513abf6
Successfully built 8105c9ac033b
[INFO] Built bolingcavalry/springbootsidecardemo
[INFO] Tagging bolingcavalry/springbootsidecardemo with 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.354 s
[INFO] Finished at: 2018-11-06T05:07:08-08:00
[INFO] Final Memory: 42M/225M
[INFO] ------------------------------------------------------------------------
- 构建成功后用docker history命令查看镜像,如下,三个layer组成:
root@maven:~# docker history bolingcavalry/springbootsidecardemo:0.0.1
IMAGE CREATED CREATED BY SIZE COMMENT
8105c9ac033b 46 minutes ago /bin/sh -c #(nop) ADD file:909ca8e9c8898cd… 16.6 MB
59788edf1f3e 4 weeks ago /bin/sh -c #(nop) CMD [“sh”] 0 B
4 weeks ago /bin/sh -c #(nop) ADD file:63eebd629a5f755… 1.15 MB
- 去工程的target目录下看看构建的app.jar文件,如下所示,也是16兆,所以这个镜像已经被做到最小了,相对于以前那种JAVA环境+jar文件的镜像,这个镜像更易于下载和上传:
root@maven:/usr/local/work/github/blog_demos/springbootsidecardemo/target# ls -al
total 16276
drwxr-xr-x 9 root root 4096 Nov 6 05:08 .
drwxr-xr-x 5 root root 4096 Nov 6 05:29 …
-rw-r–r-- 1 root root 16621351 Nov 6 05:08 app.jar
-rw-r–r-- 1 root root 4432 Nov 6 05:08 app.jar.original
drwxr-xr-x 3 root root 4096 Nov 6 05:08 classes
drwxr-xr-x 2 root root 4096 Nov 6 05:08 docker
drwxr-xr-x 3 root root 4096 Nov 6 05:08 generated-sources
drwxr-xr-x 3 root root 4096 Nov 6 05:08 generated-test-sources
drwxr-xr-x 2 root root 4096 Nov 6 05:08 maven-archiver
drwxr-xr-x 3 root root 4096 Nov 6 05:08 maven-status
drwxr-xr-x 3 root root 4096 Nov 6 05:08 test-classes
执行docker push命令,将镜像推送到镜像仓库中,我这里是推送到了hub.docker.com,您可以根据实际情况来执行,例如私有仓库、阿里云等都可以,当然了,如果当前机器就是K8S的机器就不用推送了,毕竟此镜像就是在K8S环境用的;
如果觉得推送到仓库太慢,或者从仓库下载太慢,也可以使用文件导入导出的方式,具体操作如下:
#将镜像导出为tar文件
docker save 2e01f547f003 > 1.tar
###将tar文件还原为镜像
docker load < 1.tar
###还原后的镜像的名称和tag都不对,要用tag命令来设置
docker tag 8105c9ac033b bolingcavalry/springbootsidecardemo:0.0.1
制作应用升级版的Docker镜像
为了验证K8S下的应用升级,做好tag为0.0.1的镜像之后,我们改动应用代码,把pom.xml中的版本改成0.0.2,然后再做个镜像,这样稍后在K8S就能验证Pod升级了;
修改HelloController.java的源码,hello方法返回的字符串,之前是Hello version 1.0,现在改成Hello version 2.0;
修改pom.xml中的version节点,之前是0.0.1,现在改成0.0.2,由于我们已配置了镜像tag就是工程版本,因此新构建的镜像tag会是0.0.2;
再次执行maven命令构建,然后推送到镜像仓库;
此时我们有两个镜像了:
root@maven:~# docker images | grep sidecar
bolingcavalry/springbootsidecardemo 0.0.2 f6ba01c33388 11 hours ago 17.8 MB
bolingcavalry/springbootsidecardemo 0.0.1 8105c9ac033b 11 hours ago 17.8 MB
Spring Boot应用在kubernetes的sidecar设计与实战,mysql分表分库技术实现相关推荐
- mysql如何根据业务分表设计_mysql分表分库的应用场景和设计方式
很多朋友在论坛和留言区域问mysql在什么情况下才需要进行分库分表,以及采用何种设计方式才是最优的选择,根据这些问题,小编为大家整理了关于MySQL分库分表的应用场景和最优的设计方式举例. 一. 分表 ...
- 基于spring boot的邮件微服务消息中间件设计与实现 毕业论文+系统功能图v1.0.vsdx+项目源码
下载地址:https://download.csdn.net/download/m0_63680064/36065411 项目介绍: 基于spring boot的邮件微服务消息中间件设计与实现 毕业论 ...
- spring boot、mybatis集成druid数据库连接池,实现mysql cluster HA负载均衡访问
spring boot.mybatis集成druid数据库连接池,实现mysql cluster HA负载均衡访问 1.原理实现介绍 本质来说使用连接池是为了节省创建.关闭数据库连接的资源消耗,从而提 ...
- Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证
Springboot快速搭建oauth2 内存版身份认证 环境准备 点击[Create New Project]创建一个新的项目 项目环境配置 配置Thymeleaf 搭建oauth2认证,加入两个依 ...
- spring boot电商系统前端界面设计与浏览器兼容性研究 毕业设计-附源码231058
摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于电商系统前端界面设计与浏览器兼容性研究当然也不能排除在外,随着网络技术的不断成熟,带动了电商系统前 ...
- 基于 java Spring Boot 框架的人事管理系统的设计与实现 附完整代码+论文+ppt
内容摘要: 人事管理在政府机关和企事业单位中占有极其重要的地位,各部门岗位之间协作和工效的提高,是人事管理的基本要求.本设计旨在实现微型人事管理信息系统,功能主要由人事在线通信.员工资料.人事信息管理 ...
- 基于Spring Boot+Vue博客系统的设计与实现(附源码)
摘要 中文博客第一次映入眼帘是在2002年,那时候的个人终端还是人们眼中的香饽饽,随着科技的不断进步和制造业的蓬勃发展,个人计算机终端开始逐渐变得普及,实现了人手一台电脑,在这种趋势中,博客系统走入了 ...
- 基于Spring Boot的学生志愿者管理系统的设计与实现
摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题.针对学生志愿者管理等问题 ...
- Payment Spring Boot 1.0.2.RELEASE 发布,接入微信支付分、先享卡功能
Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子:https ...
- Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | didispace.com/ ...
最新文章
- 绘制你的世界:探索构图和真实的深度感
- 【UGV】Mec 麦轮版小车驱动程序示例
- 论文笔记:Autoregressive Tensor Factorizationfor Spatio-temporal Predictions
- java 重载 返回_java – 返回方法重载
- c 字符串转数字_C语言实现十进制转216进制、十六进制转十进制
- linux 复制指定目录下的全部文件到另一个目录中,linux cp 文件夹
- Docker-基本概念(镜像和容器)
- 归并排序(二路、递归)
- Python学习笔记:演示多根继承
- 从电子电路到嵌入式系统(开篇)
- 关于配置tomcat多版本同eclipse的配置问题
- Docker和K8S对比
- 手机浏览器一键跳转微信加好友的方法
- 为什么Redis 单线程却能支撑高并发?
- 【学习笔记】英文科技论文常见英语句式积累
- 科技战疫志愿精神如何延续?腾讯的答案是……
- 通过Bellman算子理解动态规划
- 一句话就能把你逗乐的经典笑话
- tensorflow学习:定义变量
- 移动设备上“精灵图”的制作