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 run -dp 8080:8080 -t registry.cn-shanghai.aliyuncs.com/shalousun/springboot:1.4
docker exec -it [containerId] /bin/sh
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
访问一个长时间处理任务(睡眠)
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
{base_url}/benchmark/doc/index.html
{base_url}/benchmark/doc/postman.json
{base_url}/benchmark/doc/OpenApi3.0.json
自动扩容有几种方式
cpu
资源扩容spring boot 2.3+
后,actuator/prometheus
暴露了一些请求指标,例如以指标http_server_requests_seconds
开头的指标。
因此可以利用这些请求指标统计作为HPA
的判读指标。容器镜像默认集成了Arthas
,进入容器后启动Arthas
的命令为:
java -jar /opt/arthas/arthas-boot.jar
应用启用了Spring Boot
云原生的探针检测,从2.3+
版本开始,默认支持支持Kubernetes
探针检测.
就绪探针
curl http://localhost:8080/benchmark/actuator/health/liveness
存活探针
curl http://localhost:8080/benchmark/actuator/health/readiness
Spring Boot
发布可观测监控数据到prometheus
,部署到k8s
环境上完全可以被prometheus
自动拉取指标数据,监控地址
http://localhost:8080/benchmark/actuator/prometheus
常用端点接口
# java 运行信息
http://localhost:8080/benchmark/actuator/info
在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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。