# springboot-docker **Repository Path**: mall-micro-service/springboot-docker ## Basic Information - **Project Name**: springboot-docker - **Description**: 使用jenkins 构建springboot docker镜像的demo - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: tomcat - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2024-10-26 - **Last Updated**: 2024-10-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README `Spring Boot`容器化实践和`k8s`下的部署实践,目前该镜像已经通过阿里云镜像仓库公开。 # 镜像构建 ## 不分层构建 不分层构建使用的是`src/main/docker`下的`Dockerfile`文件。不分层构建就是没有对镜像层做缓存优化。 一般用于`Spring Boot 2.3.0`以前的版本。 ``` mvn clean package docker:build -DskipTests ``` ## 分层构建 在`Spring Boot 2.3.0`后`Spring 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`包含`deployment`、`service`、`ingress`创建 ``` //创建 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`系统环境变量修改日志的打印格式 ```yaml - name: LOGGING_PATTERN_CONSOLE value: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level %logger{36}@%method:%line - %msg%n' ``` json日志格式 ```yaml - 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` ```yaml - name: LOGGING_FILE_PATH value: /var/log ``` 输入到文件则想要修改日志打印格式可以添加`LOGGING_PATTERN_FILE` ```yaml - name: LOGGING_PATTERN_FILE 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`下可以变更参数,例如: ```yaml - name: JAVA_OPTS value: -server -Xmx512m -Xms512m -Djava.awt.headless=true ``` 如果启用zgc,如果自己测试内存比较小,不要将`-Xmx`和`-Xms`设置一样,否则会`OOM`,例如改成: ```yaml - name: JAVA_OPTS value: -server -Xmx512m -Xms256m -Djava.awt.headless=true ```