Spring Boot 应用
-
基于 Spring Boot 框架的应用,通常会构建成 XXX.jar 文件,执行 java -jar XXX.jar 来运行该应用;
Docker 下的 Spring Boot 应用镜像
-
Docker 环境下,通常用 Maven 的 docker-maven-plugin 插件将应用打包成镜像,例如以 java:8u111-jdk 作为基础镜像再加入 jar 文件,这样容器启动的时候执行 java -jar XXX.jar 就能将应用运行起来了;
传统思路
-
Spring Boot 应用镜像在 kubernetes 声明为 Pod,即可正常运行;
-
但是,这是合适的做法么?去 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
<missing> 12 days ago /bin/sh -c #(nop) ENV JAVA_ALPINE_VERSION... 0 B
<missing> 12 days ago /bin/sh -c #(nop) ENV JAVA_VERSION=8u181 0 B
<missing> 7 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbi... 0 B
<missing> 7 weeks ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/... 0 B
<missing> 7 weeks ago /bin/sh -c { echo '#!/bin/sh'; echo 's... 87 B
<missing> 7 weeks ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0 B
<missing> 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0 B
<missing> 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
<missing> 7 days ago /bin/sh -c set -ex; if [ ! -d /usr/share... 348 MB
<missing> 7 days ago /bin/sh -c #(nop) ENV CA_CERTIFICATES_JAV... 0 B
<missing> 7 days ago /bin/sh -c #(nop) ENV JAVA_DEBIAN_VERSION... 0 B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV JAVA_VERSION=8u181