k8s部署promentheus 使用 grafana监控springboot
大纲
- 基础准备
- 部署springboot pod (k8s集群内)
- 配置springboot pod DSN 域名
- 安装promentheus (k8s集群内)
- 安装grafana (k8s集群外)
基础准备
- 1 k8s集群 1.17
- 2 promentheus-2.34.0
- 3 grafana已经安装
整体架构图如下,在k8s集群内部部署promentheus 用于收集各个业务服务的运行时JVM状态
部署springboot pod
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<cpu;i++) {
new Thread(new Runnable() {
public void run() {
Random ra = new Random();
while(flag){
int i = ra.nextInt(100000);
Math.sqrt(i);
}
}
}).start();
}
return "当前系统 cpu 数量:" + cpu +"\n\n";
}
将 springboot 制作为镜像
制作镜像注意用到4个文件
- config.yml 配置监控metrics
- Dockerfile 镜像制作文件
- my-docker-demo-sp-user.jar 打包后的jar
- jmx_prometheus_javaagent-0.17.2.jar 用于监控暴露metrics
相关文件在 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私库使用总结》
制作springboot pod部署文件
部署pod有两个关键点
- 1 配置Pod自定义域名
- 2 创建headless Service
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-host
subdomain: user-service-inner-domain
containers:
....省略
---
apiVersion: v1
kind: Service
metadata:
name: user-service-inner-domain # 注意name为 pod中 subdomain 的名称
spec:
selector:
app: user-service
clusterIP: 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
安装promentheus 需要注意一下几点
- 1 创建一个独立namespace 与业务代码隔离
- 2 使用ConfigMap 保存promentheus 配置信息
- 3 指定promentheus 启动参数让其可以动态加载配置
创建Namespace与ConfigMap
ConfigMap配置如下
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: promentheus
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'user-service-metrics'
metrics_path: /metrics
static_configs:
- targets: ['user-service-host.user-service-inner-domain.default.svc.cluster.local:12345']
部署promentheus 服务端
关键是 添加**–web.enable-lifecycle** 参数 让prometheus热加载配置文件
spec:
containers:
- image: bitnami/prometheus:2.34.0
name: prometheus-containers
command:
- "/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 面板用于监控springboot 项目
grafana中配置JVM监控面板参考 《prometheus监控springboot项目 使用grafana展示》
配置prometheus数据源
配置数据源 使用上一步中配置的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面板上可以看到效果