在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插件,该插件具体的配置请参照下面的注释:
<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
现在镜像已经OK,该准备部署到kubernetes环境了;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
现在镜像已经OK,该准备部署到kubernetes环境了;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-x0nStykZ-1714962707215)]
[外链图片转存中…(img-Wuxkk39s-1714962707216)]
[外链图片转存中…(img-iydmV5GW-1714962707216)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!