k8s prometheus安装,监控springboot指标,alertManager邮件告警
1.背景
安装了k8s v1.29,三台机器如下
目标: 安装prometheus, 从springboot获取指标,实现邮件告警。
springboot自定义一个指标“my-count”, 每访问springboot指定的接口一次,“my-count"加1,当大于10时,给出告警。
主要用到prometheus和alertManager这两个服务。大概流程是:
1.prometheus去查springboot接口获取“my-count"的值,当值大于10时,prometheus产生一个告警,并把这个告警发送到alertManger。
2.到alertManager上就能看到这个告警。
3.alertManager上配置把告警发到邮件
我springboo版本是3.4.0
2.安装prometheus和AlertManger
1.到github拉取代码
github-kube-prometheus地址
到github-kube-prometheus上查看k8s集群对应的版本,然后git clone 拉取对应代码
git clone https://github.com/prometheus-operator/kube-prometheus.git
到这个目录下kube-prometheus/manifests,以下操作都在这个目录
2.删除网络策略
删除下面三个文件
rm -rf prometheus-networkPolicy.yaml
rm -rf grafana-networkPolicy.yaml
rm -rf alertmanager-networkPolicy.yaml
3.修改端口
修改这三个文件,
prometheus-service.yaml ,grafana-service.yaml ,alertmanager-service.yaml
每个文件中加上nodeport,三个文件我依次加了端口31111(prometheus-service.yaml),31112(grafana-service.yaml),31113(alertmanager-service.yaml),
以下图为示例
4.修改镜像
查看所有文件中的镜像地址,这些国外镜像地址可能拉取不到,要替换成国内的,我是在前面加上了m.daocloud.io/,比如”quay.io/prometheus/alertmanager:v0.28.0”改成“m.daocloud.io/quay.io/prometheus/alertmanager:v0.28.0”
[root@k8s1 manifests]# grep "image: " * -r
alertmanager-alertmanager.yaml: image: quay.io/prometheus/alertmanager:v0.28.0
blackboxExporter-deployment.yaml: image: quay.io/prometheus/blackbox-exporter:v0.25.0
blackboxExporter-deployment.yaml: image: ghcr.io/jimmidyson/configmap-reload:v0.14.0
blackboxExporter-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.19.0
grafana-deployment.yaml: image: grafana/grafana:11.5.2
kubeStateMetrics-deployment.yaml: image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.15.0
kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.19.0
kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.19.0
nodeExporter-daemonset.yaml: image: quay.io/prometheus/node-exporter:v1.9.0
nodeExporter-daemonset.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.19.0
prometheusAdapter-deployment.yaml: image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0
prometheusOperator-deployment.yaml: image: quay.io/prometheus-operator/prometheus-operator:v0.80.1
prometheusOperator-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.19.0
prometheus-prometheus.yaml: image: quay.io/prometheus/prometheus:v3.2.0
5.执行安装
kubectl create -f setup 这个命令会安装相关CRD和namespace(monitoring)
kubectl create -f . 这个命令安装所有服务。
安装好后查看pod,grafana是查看指标的图形化界面,我这里grafana因为前面镜像不对,也找不到合适的国内镜像地址,grafana就不管了,暂时我也用不到这个功能,也就是前面我改的端口31112不能访问。
查看prometheus服务(端口31111)
查看alertManager服务(31113)
3.配置springboot
加上依赖和配置
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-registry-prometheus:1.15.0-M2")
application.yaml加上以下配置:
management:
endpoints:
web:
exposure:
include: "*"
base-path: /metrics
metrics:
tags:
application: ${spring.application.name}
prometheus:
metrics:
export:
enabled: true
启动springboot,访问程序这个接口,连续访问4次
查看指标接口:http://localhost:3333/sp3/metrics/prometheus
- 这个url中/sp3是我后端server.context-path,
- /metrics是上面配置中的base-path,如果不加这个配置默认是”actuator"
- /prometheus是固定的。
能看到这个接口被访问了4次。
http://localhost:3333/sp3/metrics/prometheus,这个接口查到的指标是actuator自带的指标,不是我自定义的,
下面,我自定义一个指标。
@RestController
public class TestController {
//这个meterRegistry是actuator的默认库,也就是说把我自定义的指标加到actuator中,
//http://localhost:3333/sp3/metrics/prometheus,在这个接口中就能查到我自定义的指标
@Autowired
private MeterRegistry meterRegistry;
private Counter counter;
@PostConstruct
public void init(){
counter = Counter.builder("my-count") //名称
.baseUnit("unit") //基础单位
.description("my test count") //描述
.tag("aaa", "bbb") //标签
.tag("ccc","dddd")//标签
.register(meterRegistry);//注册到actuator的MeterRegistry
}
@GetMapping(value = "/get-user")
public void getUser(){
counter.increment();
}
启动程序,访问接口,能看到这个指标(指标名称是my_count_unit_total,注意和我们代码中定义的名称有点不一样),每访问一次/get-user接口,这个指标就会加1。
这里要说一下标签(tag)的作用,它是key:value格式的,可以根据具体业务自定义多个有意义的tag,假如我这个“my-count"是统计用户的数量,就可以加个tag(“user”:“count”),这样在prometheus上查询时可以根据这个tag来过滤查询。
看下图示例:node_disk_info这个指标有很多标签
node_disk_info{device=“sda”},就是根据标签device="sda"作为条件来查询
4.springboot指标接入prometheus
1.部署springboot程序
先把springboot程序部署到k8s上,然后创建了一个service
http://110.110.110.101:30333/sp3/metrics/prometheus,这是我在k8s上的nodePort的地址,可以看到成功访问到指标
2.编写ServiceMonitor
先看service文件
apiVersion: v1
kind: Service
metadata:
name: my-spring-340-svc
namespace: test #记住这个namespace ,ServiceMonitor要用
labels:
service: my-spring-340-svc #记住这个label,ServiceMonitor要用
spec:
selector:
app: my-spring-340
type: NodePort
ports:
- name: spring-http #记住这个,ServiceMonitor要用
port: 3333
nodePort: 30333
targetPort: 3333
ServiceMonitor文件
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-springboot340-monitor
namespace: monitoring
labels:
monitor: my-springboot340-monitor
spec:
endpoints:
- interval: 15s #监控数据抓取的时间间隔
port: spring-http #指定metrics端口,就是上面Service中的ports.name
path: /sp3/metrics/prometheus #指标接口路径
scheme: http #Metrics接口的协议
namespaceSelector:
matchNames:
- test # 监控目标Service所在的命名空间
selector:
matchLabels:
service: my-spring-340-svc # 监控目标Service目标的标签。
kubectl apply -f serviceMonitor.yml,应用serviceMonitor
到prometheus上查看,注册成功了,但没有监控到接口,查看prometheus日志,报错,因为prometheus在namespace(monitoring)中,而我的springboo程序在test中,prometheus跨namespace没有权限。
跨不同namespace需要clusterrole有相应权限
前面prometheus在安装时自动创建了clusterrole(prometheus-k8s)。如下图,加上红框中的内容:
然后prometheus上就能看到了
也能查到自定义的指标了,以及里面的标签
5.配置AlertManager
查看prometheus默认的告警规则,下面我要配一个自定义的规则,在这里也能看见
编写PrometheusRule,每个字段的含义比较简单,大家自行网上查
我这个规则的意思就是每10分钟my_count_unit_total > 10就告警
[root@k8s1 deployment]# cat prometheusRule.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: my-spring-rules
namespace: monitoring
spec:
groups:
- name: mySpring.rules
rules:
- alert: myCountAlert
annotations:
descriptiong: my springboot340 count for {{ $labels.namespace }}/{{$labels.pod}}.
summary: count > 10
expr: |
my_count_unit_total > 10 #这个就是在prometheus上的查询语句
for: 10m
labels:
severity: critical
执行kubectl apply -f prometheusRule.yaml ,配置生效有延迟,等一会,在界面上能看到这个告警规则
my_count_unit_total > 10,这个就是在prometheus上的查询语句,连续访问springboot那个接口次数大于10,然后在prometheus上查询确定是大于10.
再次查看prometheus告警规则,“pending”表示告警条件已经满足,但尚未达到设定的持续时间,我这里时间是10分钟,也就是持续10分钟查询“my_count_unit_total > 10”都成功,就给出一个告警。看下图已经持续8分多了,再等一会就有告警了。
等10分钟到了,状态变为“firing",就是告警已经发射了,发到了alertManager
到AlertManger上也能看到这个告警了
6.配置告警到邮件
主要把邮箱信息填到AlertManager的alertmanager.yaml文件
我这里的alertmanager.yaml是放在secret里面的,然后挂载到AlertManager的pod里面(前面安装prometheus时自动配置的)。我要做的就是修改alertmanager.yaml
alertmanager.yaml看后面是乱码,这是base64编码过的。
echo “XXX” | base64 -d,这个解码看看明文,直接把邮箱信息配到这个明文中,然后把明方base64编码,再写到这个secret中。以下是我加入的内容,要注意格式不能错。
"global":
"smtp_smarthost": "smtp.qq.com:465"
"smtp_from": "YYYYY@qq.com" # 这里填的是发送者的qq账号
"smtp_auth_username": "YYYYY" #发送者的qq号
"smtp_auth_password": "aaaaaaaa" #发送者的授权码,不是qq密码,
"smtp_require_tls": "false"
"receivers":
- "name": "my-email" # 这个my-email能在alertManager界面上看到
"email_configs":
- "to": "XXXXX@qq.com" # 这里填的是接收者的邮箱,告警会发到这个邮箱
"send_resolved": "true"
"route":
"routes":
- "matchers":
- "alertname = myCountAlert" #指定我自定义的myCountAlert告警发送到邮箱
"receiver": "my-email"
注意上面发送者那个不是qq密码,是授权码,要到qq邮箱界面去开通并授权,如下图:
改好secret 后,重启alertmanager的所有pod。
重启好后,到alertManager上面能看到我添加的my-email
重启springboot程序,让my-count置为0,然后连续访问那个接口大于10,等生成新的告警,就能发到邮箱了,如下是我邮箱收到的告警:
更多推荐


所有评论(0)