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

  1. 这个url中/sp3是我后端server.context-path,
  2. /metrics是上面配置中的base-path,如果不加这个配置默认是”actuator"
  3. /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,等生成新的告警,就能发到邮箱了,如下是我邮箱收到的告警:
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐