Spring Boot应用在kubernetes的sidecar设计与实战

在Kubernetes中文社区的文档中也对此作了阐述,地址是:http://docs.kubernetes.org.cn/312.html

在这里插入图片描述

在提到Pod中的sidecar模式时,官方文档用到"relatively advanced"来形容,进一步证实了当下该模式的正确性,如下图:

在这里插入图片描述

具体的实现模型如下图:

在这里插入图片描述

Spring Boot应用的sidecar设计

根据kubernetes官方文档的指导,再结合SpringBoot应用的特点,我设计出的sidecar部署方式如下:

在这里插入图片描述

  1. 该应用的业务服务被封装在一个Pod定义中,该Pod由两个容器组成;

  2. 绿色容器是来自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

  1. 红色容器的镜像是用Spring Boot应用构建出来的,稍后再详细整个过程;

  2. 在kubernetes环境,这两个容器会挂载同一个Volume,红色容器将jar放在此处,绿色容器使用此处的jar;

  3. 红色容器用来提供jar,没有进程需要保持运行状态,很适合设置为Init Container类型;

  4. 绿色容器的java进程是长久运行的;

以上就是整体设计思路,接下来咱们就来实战吧,分三步完成:

实战步骤列举

本次实战分为以下几部分组成:

  1. 开发Spring Boot应用;

  2. 制作Docker镜像,做两个版本,以便验证升级;

  3. 编写yaml文件;

  4. 在kubernetes环境部署,验证;

  5. 升级版本,验证;

环境和版本信息

  1. 编译构建的jdk和运行的jre都用1.8版本;

  2. maven:3.3.3;

  3. spring boot:2.1.0.RELEASE;

  4. docker:1.13.1;

  5. 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这个文件夹下,如下图红框所示:

在这里插入图片描述

您也可以随本文一起来开发这个应用:

  1. 应用名为springbootsidecardemo,是用maven构建的,JDK使用1.8,Spring Boot版本2.1.0.RELEASE;

  2. 应用的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了;

  1. 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镜像

  1. 请确保您当前环境的maven和Docker都已经OK了;

  2. 在应用的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] ------------------------------------------------------------------------

  1. 构建成功后用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

  1. 去工程的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

  1. 执行docker push命令,将镜像推送到镜像仓库中,我这里是推送到了hub.docker.com,您可以根据实际情况来执行,例如私有仓库、阿里云等都可以,当然了,如果当前机器就是K8S的机器就不用推送了,毕竟此镜像就是在K8S环境用的;

  2. 如果觉得推送到仓库太慢,或者从仓库下载太慢,也可以使用文件导入导出的方式,具体操作如下:

#将镜像导出为tar文件

docker save 2e01f547f003 > 1.tar

###将tar文件还原为镜像

docker load < 1.tar

###还原后的镜像的名称和tag都不对,要用tag命令来设置

docker tag 8105c9ac033b bolingcavalry/springbootsidecardemo:0.0.1

制作应用升级版的Docker镜像

  1. 为了验证K8S下的应用升级,做好tag为0.0.1的镜像之后,我们改动应用代码,把pom.xml中的版本改成0.0.2,然后再做个镜像,这样稍后在K8S就能验证Pod升级了;

  2. 修改HelloController.java的源码,hello方法返回的字符串,之前是Hello version 1.0,现在改成Hello version 2.0;

  3. 修改pom.xml中的version节点,之前是0.0.1,现在改成0.0.2,由于我们已配置了镜像tag就是工程版本,因此新构建的镜像tag会是0.0.2;

  4. 再次执行maven命令构建,然后推送到镜像仓库;

  5. 此时我们有两个镜像了:

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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Java核心知识

  • Spring全家桶(实战系列)

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

  • 其他电子书资料

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
rc=“https://i-blog.csdnimg.cn/blog_migrate/135528de49b0901c0341b5911b0f1aba.jpeg” alt=“img” style=“zoom: 33%;” />

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

[外链图片转存中…(img-IdlIrlaX-1713296938339)]

Java核心知识

  • Spring全家桶(实战系列)

[外链图片转存中…(img-GBr6PdHL-1713296938339)]

  • 其他电子书资料

[外链图片转存中…(img-NLzFpO28-1713296938339)]

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-UvHAej9H-1713296938340)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值