5 Star 13 Fork 6

上官胡闹 / springboot-docker

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

Spring Boot容器化实践和k8s下的部署实践,目前该镜像已经通过阿里云镜像仓库公开。

镜像构建

不分层构建

不分层构建使用的是src/main/docker下的Dockerfile文件。不分层构建就是没有对镜像层做缓存优化。 一般用于Spring Boot 2.3.0以前的版本。

mvn clean package docker:build -DskipTests

分层构建

Spring Boot 2.3.0Spring Boot对镜像构建做了分层优化。

mvn spring-boot:build-image -DskipTests
或者
mvn clean package -DskipTests && docker build -t springboot:3.0.0-tomcat

国内使用spring-boot-maven-plugin来构建镜像时有些问题,可以参考这个issue: https://github.com/frontc/gitalk/issues/108

镜像拉取

docker pull registry.cn-shanghai.aliyuncs.com/shalousun/springboot:1.3

docker中部署

docker run -dp 8080:8080 -t registry.cn-shanghai.aliyuncs.com/shalousun/springboot:1.4

进入docker容器

docker exec -it [containerId] /bin/sh

kubernates中部署

yaml在项目的k8s目录中,该yaml包含deploymentserviceingress创建

//创建
kubectl apply -f deployment.yaml
//删除
kubectl delete -f deployment.yaml

//进入容器
kubectl exec -it [podName] /bin/sh

访问测试

curl [node ip]:30111

返回hello docker,对于1.3后版本会返回hello docker,from v xx

ingress测试,yaml中默认设置的域名是test.com,待在k8s中部署好后,查看pod所在节点的IP,将域名和host加入到 宿主机hosts中。

curl {base_url}/benchmark/ip

返回pod ip,如果启动了多个pod,访问会返回不同的ip,此时说明ingress是生效的。

查看镜像内的时间

curl {base_url}/benchmark/time

测试容器内https请求

curl {base_url}/benchmark/testHttps

测试容器内http请求

curl {base_url}/benchmark/testHttp

测试请求k8s容器中的svc

curl {base_url}/benchmark/test.com

Graceful Test

访问一个长时间处理任务(睡眠)

curl -i {base_url}/benchmark/long-process

杀掉进程服务进程

kill pid

执行杀进程命令后,tomcat容器等待long-process处理完毕才关闭进程

其他更详细的接口请查看API

版本升级

当前该demo在阿里云镜像中心有多个版本,可以利用改demo做升级演示测试,升级测试时修改deployment.yaml中的版本号, 最新的版本是1.4

kubectl apply -f deployment.yaml

升级过程演示是可以利用kubectl rollout status命令来查看升级状态

kubectl rollout status deployment/springboot-docker-deployment

服务回滚

回滚到之前的版本

kubectl rollout undo deployment/springboot-docker-deployment

回顾过程状态查看

kubectl rollout status deployment/springboot-docker-deployment

日志处理

本项目本身也是作为一个基准测试项目,因此可以用于测试Filebeat或者是ilogtail的日志收集功能。 在调试这些日志收集组件的时候难免需要调整程序日志的一些配置去验证采集功能。

日志格式调整

k8s中部署时可以通过修改yaml中的LOGGING_PATTERN_CONSOLE系统环境变量修改日志的打印格式

- name: LOGGING_PATTERN_CONSOLE
  value: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level %logger{36}@%method:%line - %msg%n'

json日志格式

- name: LOGGING_PATTERN_CONSOLE
  value: '{"date":"%d{yyyy-MM-dd HH:mm:ss.SSS}","appname":"${spring.application.name}","thread":"%thread","level":"%level","class":"%logger","msg":"%msg"}%n'

指定日志文件

例如测试sidecar收集的时候不再将日志打印到控制台,而是通过打印到日志文件中,然后再通过Filebeat或者是ilogtail 去采集指定的文件。日志文件的配置变量LOG_PATH

- name: LOGGING_FILE_PATH
  value: /var/log

输入到文件则想要修改日志打印格式可以添加LOGGING_PATTERN_FILE

- name: LOGGING_PATTERN_CONSOLE
  value: '{"date":"%d{yyyy-MM-dd HH:mm:ss.SSS}","appname":"${spring.application.name}","thread":"%thread","level":"%level","class":"%logger","msg":"%msg"}%n'

日志级别调整

可以在运行时动态的改变日志级别,用postman或者curl都可完成。

curl -X POST -H 'Content-Type: application/json; charset=utf-8' -i 'http://localhost:8080/benchmark/actuator/loggers/com.benchmark.springboot' --data '{"configuredLevel":"debug"}'

调整后查看日志级别

curl http://localhost:8080/benchmark/actuator/loggers/com.benchmark.springboot

日志测试接口

普通日志打印

curl http://localhost:8080/benchmark/log

异常日志打印

curl http://localhost:8080/benchmark/exp

灰度部署测试

首先部署旧版应用

kubectl apply -f https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-deployment.yaml
# 测试
curl  http://canary.example.com/benchmark/

部署灰度版本

kubectl apply -f https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-deployment.yaml
kubectl apply -f https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-ingress.yaml
# 测试灰度
curl -s -H "new: always" http://canary.example.com/benchmark/

将灰度正式转成上线产品

# 删除灰度发布的ingress
kubectl delete -f https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-ingress.yaml
kubectl apply -f https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-to-prod-ingress.yaml

当然也可以先把部署模板下载到机器上方便管理

wget https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-deployment.yaml
wget https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-deployment.yaml
wget https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-ingress.yaml
wget https://gitee.com/devin-alan/springboot-docker/raw/tomcat/k8s/springboot-docker-canary-to-prod-ingress.yaml

API接口文档

  • 本项目启动后可查看html5文档,更多的接口说明可查看文档,文档访问路径为
{base_url}/benchmark/doc/index.html
  • 如果要查看项目接口postman collection的json文件可以访问
{base_url}/benchmark/doc/postman.json
  • 如果要查看OpenApi 3.0的接口文档可以访问
{base_url}/benchmark/doc/OpenApi3.0.json

Autoscaling

自动扩容有几种方式

  • 基于cpu资源扩容
  • 基于内存使用情况扩容
  • 基于请求等操作的指标暴露 在spring boot 2.3+后,actuator/prometheus暴露了一些请求指标,例如以指标http_server_requests_seconds开头的指标。 因此可以利用这些请求指标统计作为HPA的判读指标。

Arthas

容器镜像默认集成了Arthas,进入容器后启动Arthas的命令为:

java -jar /opt/arthas/arthas-boot.jar

Health Check

应用启用了Spring Boot云原生的探针检测,从2.3+版本开始,默认支持支持Kubernetes探针检测.

就绪探针

curl http://localhost:8080/benchmark/actuator/health/liveness

存活探针

curl http://localhost:8080/benchmark/actuator/health/readiness

Publishes Prometheus-style metrics

Spring Boot发布可观测监控数据到prometheus,部署到k8s环境上完全可以被prometheus自动拉取指标数据,监控地址

http://localhost:8080/benchmark/actuator/prometheus

Endpoint

常用端点接口

# java 运行信息
http://localhost:8080/benchmark/actuator/info

jvm参数变更

k8s/springboot-docker-deployment下可以变更参数,例如:

- name: JAVA_OPTS
  value: -server -Xmx512m -Xms512m -Djava.awt.headless=true

如果启用zgc,如果自己测试内存比较小,不要将-Xmx-Xms设置一样,否则会OOM,例如改成:

- name: JAVA_OPTS
  value: -server -Xmx512m -Xms256m -Djava.awt.headless=true
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

使用jenkins 构建springboot docker镜像的demo 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/devin-alan/springboot-docker.git
git@gitee.com:devin-alan/springboot-docker.git
devin-alan
springboot-docker
springboot-docker
tomcat

搜索帮助

14c37bed 8189591 565d56ea 8189591