大纲
整体架构图如下,在k8s集群内部部署promentheus 用于收集各个业务服务的运行时JVM状态
springboot使用my-docker-demo-sp-user 这个项目
my-docker-demo-sp-user中已经存在两个接口 /cpu 、/memory 用于消耗cpu 和 内存 用于后续状态监控报警
@RequestMapping("/memory")public String memery() {System.out.println(list.size());new Thread(()->{while(true){list.add(new String[1024][1024]);System.out.println("加数据");}}).start();return "ok\n\n";}public String cpu(@RequestParam("s") int s) {int cpu = Runtime.getRuntime().availableProcessors();.... 省略for (int i=0;i
制作镜像注意用到4个文件
相关文件在 my-docker-demo-sp-user/deploy 文件夹下
注意Dockerfile 使用-javaagent 暴露metrics 端口为12345
ENTRYPOINT ["java","-javaagent:jmx_prometheus_javaagent-0.17.2.jar=12345:config.yml", "-jar","my-docker-demo-sp-user.jar"]
docker 镜像制作参考文章 《docker创建java镜像文件总结 快速上手》
推送镜像到阿里云私库
docker tag user-service registry.cn-hangzhou.aliyuncs.com/jimliu/user-service
docker push registry.cn-hangzhou.aliyuncs.com/jimliu/user-service
阿里云私库参考文章 《阿里云docker私库使用总结》
部署pod有两个关键点
Pod自定义域名参考 文章 《k8s-Pod域名学习总结》
deploy.yaml内容如下
apiVersion: apps/v1
kind: Deployment
metadata:name: user-service-deploy
spec:....省略template:metadata:labels:app: user-service spec: # hostname + subdomain 自定义Pod的域名hostname: user-service-hostsubdomain: user-service-inner-domaincontainers:....省略
---apiVersion: v1
kind: Service
metadata: name: user-service-inner-domain # 注意name为 pod中 subdomain 的名称
spec:selector: app: user-serviceclusterIP: None #注意 clusterIP 为None
详细内容见 my-docker-demo-sp-user/deploy/deploy.yaml
此时springboot pod 在k8s集群内的域名如下
user-service-host.user-service-inner-domain.default.svc.cluster.local
测试Pod 部署情况以及域名情况
到此 springboot pod部署完成
安装promentheus 需要注意一下几点
ConfigMap配置如下
apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: promentheus
data:prometheus.yml: |global:scrape_interval: 15sevaluation_interval: 15sscrape_configs:- job_name: 'user-service-metrics'metrics_path: /metricsstatic_configs:- targets: ['user-service-host.user-service-inner-domain.default.svc.cluster.local:12345']
关键是 添加**–web.enable-lifecycle** 参数 让prometheus热加载配置文件
spec:containers:- image: bitnami/prometheus:2.34.0name: prometheus-containerscommand:- "/opt/bitnami/prometheus/bin/prometheus" #注意prometheus命令位置args:- "--config.file=/etc/prometheus/prometheus.yml"- "--storage.tsdb.path=/prometheus"- "--storage.tsdb.retention.time=12h"- "--web.enable-lifecycle"
测试ok
再部署一个order-service pod
此时 order-service pod的集群内域名为
order-service-host.order-service-inner-domain.default.svc.cluster.local
编辑prometheus configmap
kubectl edit cm prometheus-config -n promentheus
刷新prometheus配置
curl -X POST http://192.168.0.160:9090/-/reload
配置grafana 面板用于监控springboot 项目
grafana中配置JVM监控面板参考 《prometheus监控springboot项目 使用grafana展示》
配置数据源 使用上一步中配置的prometheus
这里使用的是
https://grafana.com/grafana/dashboards/8563-jvm-dashboard/
调用接口让cpu使用率达到 100%
http://10.244.1.46:5588/cpu?s=90
在grafana面板上可以看到效果
调用接口让内存使用率达到 100%
curl http://10.244.1.46:5588/memory
在grafana面板上可以看到效果