当前位置: 首页 > 科技观察

PrometheusOperator自定义监控项

时间:2023-03-15 15:08:56 科技观察

PrometheusOperator默认的监控指标不能完全满足实际监控需求。这时候我们就需要根据业务添加自定义监控。添加自定义监控的步骤如下:1.为Prometheus创建一个ServiceMonitor对象,用于添加监控项2.将ServiceMonitor对象与metrics数据接口的Service对象相关联3.确保Services对象能够正确获取metrics数据。下文将以如何添加redis监控为例,部署redisk8s-redis-and-exporter-deployment.yaml---apiVersion:v1kind:Namespacemetadata:name:redis---apiVersion:apps/v1kind:Deploymentmetadata:namespace:redisname:redisspec:replicas:1selector:matchLabels:app:redistemplate:metadata:annotations:prometheus.io/scrape:"true"prometheus.io/port:"9121"labels:app:redisspec:containers:-name:redisimage:redisresources:requests:cpu:100mmemory:100Miports:-containerPort:6379-name:redis-exporterimage:oliver006/redis_exporter:latestresources:requests:cpu:100mmemory:100Miports:-containerPort:9121在部署redis时,我们以sidecar的形式部署redis_exporter和Pod中的redis服务另请注意,我们添加了注释:prometheus.io/scrape:"true"和prometheus.io/port:"9121"以创建RedisServiceapiVersion:v1kind:Servicemetadata:name:redis-svcnamespace:redislabels:app:redisspec:类型:点头ePortports:-name:redisport:6379targetPort:6379-name:redis-exporterport:9121targetPort:9121selector:app:redis查看部署的服务,验证metrics是否可以获取数据[root@]#kubectlgetpo,ep,svc-nredisNAMEREADYSTATUSRESTARTSAGEpod/redis-78446485d8-sp57x2/2Running0116mNAMEENDPOINTSAGEendpoints/redis-svc100.102.126.3:9121,100.102.126.3:63796m5sNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEservice/redis-svcNodePort10.105.111.1776379:32357/TCP,9121:31019/TCP6m5s验证metrics[root@qd01-stop-k8s-master001MyDefine]#curl10.105.111.177:9121/metrics#HELPgo_gc_duration_secondsAsummaryofthepausedurationofgarbagecollectioncycles.#TYPEgo_gc_duration_secondssummarygo_gc_duration_seconds{quantile="0"}0go_gc_duration_seconds{quantile="0.25"}0go_gc_duration_seconds{quantile="0.5"}0go_gc_duration_seconds{quantile="0.75"}0go_gc_duration_seconds{quantile="1"}0go_gc_duration_seconds_sum0go_gc_duration_seconds_count0#HELPgo_goroutinesNumberofgoroutinesthatcurrentlyexist.#TYPEgo_goroutinesgaugego_goroutines8#HELPgo_infoInformationabouttheGoenvironment.#TYPEgo_infogauge.......创建ServiceMonitor现在Prometheus访问redis,然后创建一个ServiceMonitor对象apiVersion:monitoring.coreos.com/v1kind:ServiceMonitormetadata:name:redis-k8snamespace:monitoringlabels:app:redisspec:jobLabel:redisendpoints:-port:redis-exporterinterval:30sscheme:httpselector:matchLabels:app:redisnamespaceSelector:matchNames:-redis执行创建和查看-serviceMonitor[root@]#kubectlapply-fprometheus-serviceMonitorRedis.yamlservicemonitor.monitoring.coreos.com/redis-k8screated[root@]#kubectlgetserviceMonitor-nmonitoringNAMEAGEredis-k8s11s现在切换到PrometheusUI界面查看targets,会发现刚才创建的redis-k8s监控项多了。现在可以查询redis-exporter集合,redis的监控指标已经配置好了。我们现在可以采集redis的监控指标,但是现在还没有配置监控报警规则。我们需要根据自己真正关心的指标来添加告警规则。首先我们看一下Prometheus的默认规则,大致如下。现在我们给redis添加一条规则,在Prometheus的Config页面下查看AlertManager的配置:可以看到上面alertmanagers实例的配置是通过kubernetes的服务发现机制获取的,其角色是endpoints,匹配服务name对于alertmanager-main,服务端口名称是web。让我们检查一下alertmanager-main服务:[root@]#kubectldescribesvcalertmanager-main-nmonitoringName:alertmanager-mainNamespace:monitoringLabels:alertmanager=mainAnnotations:Selector:alertmanager=main,app=alertmanagerType:ClusterIPIP:10.111.141.65Port:web9093/TCPTargetPort:web/TCPEndpoints:100.118.246.1:9093,100.64.147.129:9093,100.98.81.194:9093SessionAffinity:ClientIPEvents可以看到服务名:alertmanager-main,Port定义的名字也是web,符合根据以上规则,Prometheus和AlertManager组件正确关联。对应的告警规则文件位于:/etc/prometheus/rules/prometheus-k8s-rulefiles-0/目录下的所有YAML文件。可以进入PrometheusPod验证目录下是否有YAML文件:这个YAML文件其实包含在我们之前创建的一个PrometheusRule文件中:这里的PrometheusRule的名字是prometheus-k8s-rules,命名空间是monitoring.我们可以猜测,在我们创建了一个PrometheusRule资源对象后,会在上面的prometheus-k8s-rulefiles-0目录下自动生成一个对应的-.yaml文件,所以以后如果需要自定义一个告警选项,只需要定义PrometheusRule资源对象。至于为什么Prometheus可以识别这个PrometheusRule资源对象呢?让我们看看我们创建的prometheus(prometheus-prometheus.yaml)资源对象。其中有一个非常重要的属性ruleSelector,用于匹配rule规则的filter,需要一个带有prometheus=k8s和role=alert-rules标签的匹配PrometheusRule资源对象,明白了吗?role=alert-rules标签的PrometheusRule对象就够了。比如我们添加一个告警,查看redis是否可用,我们可以通过redis_up指标来查看redis是否启动,创建文件prometheus-redisRules.yaml:apiVersion:monitoring.coreos.com/v1kind:PrometheusRulemetadata:标签:prometheus:k8srole:alert-rulesname:redis-rulesnamespace:monitoringspec:groups:-name:redisrules:-alert:RedisUnavailableannotations:summary:redisinstanceinfodescription:Ifredis_up==0,rediswilllabbeunavailableexpr:|redis_up==0for:3:严重性:criticalAfter创建prometheusrule,可以看到自己创建的redis-ruleskubectlapply-fprometheus-redisRules.yamlkubectlgetprometheusrule-nmonitoringNAMEAGEetcd-rules4d18hprometheus-k8s-rules17dredis-rules15s。请注意,标签必须至少有prometheus=k8sorrole=alert-rules,创建完成后,过一会查看容器中的rules文件夹:现在我们看到我们创建的规则文件已经被注入到对应的rulefiles文件夹中了然后进入Prometheus的Alert页面可以看到我们上面创建的告警规则:配置告警现在我们知道了如何添加告警规则配置项,但是如何发送这些告警信息呢?这就需要我们来配置alertmanager。这里我以邮件和微信为例。alertmanager配置文件alertmanager.yaml是使用alertmanager-secret.yaml文件创建的。这里是默认配置catalertmanager-secret.yamlapiVersion:v1kind:Secretmetadata:name:alertmanager-mainnamespace:monitoringstringData:alertmanager.yaml:|-"global":"resolve_timeout":"5m""inhibit_rules":-"equal":-“命名空间”-“警报名称”“source_match”:“严重性”:“严重”“target_match_re”:“严重性”:“警告|信息”-“等于”:-“命名空间”-“警报名称”“source_match”:“严重性”:“警告”“target_match_re”:“严重性”:“信息”“接收器”:-“名称”:“默认”-“名称”:“看门狗”-“名称”:“严重”“route":"group_by":-"namespace""group_interval":"5m""group_wait":"30s""receiver":"Default""repeat_interval":"12h""routes":-"match":"alertname":"Watchdog""receiver":"Watchdog"-"match":"severity":"critical""receiver":"Critical"type:Opaque现在我们需要修改这个文件来配置微信和邮箱相关信息,提供你需要自己准备好企业微信的相关资料,可以上网搜索相关教程首先创建alertmanager.yaml文件global:resolve_timeout:5msmtp_smarthost:'smtp.51os.club:25'smtp_from:'amos'smtp_auth_username:'amos@51os.club'smtp_auth_password:'Mypassword'smtp_hello:'51os.club'smtp_require_hatls:api_urlwec:'https://qyapi.weixin.qq.com/cgi-bin/'wechat_api_secret:'SGGc4x-RDcVD_ptvVhYrxxxxxxxxxxxOhWVWIITRxM'wechat_api_corp_id:'ww419xxxxxxxx735e1c0'templates:-'*.tmpl'route:group_by','['jobs']group_wait:30sgroup_interval:5mrepeat_interval:12hreceiver:defaultroutes:-receiver:wechatcontinue:truematch:alertname:Watchdogreceivers:-name:'default'email_configs:-to:'10xxxx1648@qq.com'send_resolved:true-name:'wechat'wechat_configs:-send_resolved:falsecorp_id:'ww419xxxxxxxx35e1c0'to_party:'13'message:'{{template"wechat.default.message".}}'agent_id:'1000003'api_secret:'SGGc4x-RDcxxxxxxxxY6YwfZFsO9OhWVR我这里加了两个接收器默认通过电子邮件发送。对于Watchdog警报,我们通过webhook发送它。这个webhook就是wechat。这里说明我偷懒了,因为系统正好有一个alarmWatchdog,所以我这里匹配了Watchdogalarm。当然也可以换成我们自定义的redis监控RedisUnavailable,用它来创建一个templates文件。该文件用于发送微信消息。模板wechat.tmpl:{{define"wechat.default.message"}}{{-ifgt(len.Alerts.Firing)0-}}{{-range$index,$alert:=.Alerts-}}{{-ifeq$index0-}}AlertTpye:{{$alert.Labels.alertname}}AlertLevel:{{$alert.Labels.severity}}======================{{-end}}===AlertInfo===AlertInfo:{{$alert.Annotations.message}}AlertTime:{{$alert.StartsAt.Format"2006-01-0215:04:05"}}===MoreInfo==={{ifgt(len$alert.Labels.instance)0-}}InstanceIp:{{$alert.Labels.instance}};{{-end-}}{{-ifgt(len$alert.Labels.namespace)0-}}InstanceNamespace:{{$alert.Labels.namespace}};{{-end-}}{{-ifgt(len$alert.Labels.node)0-}}NodeIP:{{$alert.Labels.node}};{{-end-}}{{-ifgt(len$alert.Labels.pod_name)0-}}PodName:{{$alert.Labels.pod_name}}{{-end}}=========================={{-end}}{{-end}}{{-ifgt(len.Alerts.Resolved)0-}}{{-range$index,$alert:=.Alerts-}}{{-ifeq$index0-}}AlertTpye:{{$alert.Labels.alertname}}AlertLevel:{{$alert.Labels.severity}}========================{{-end}}===AlertInfo===AlertInfo:{{$alert.Annotations.message}}AlertStartTime:{{$alert.StartsAt.Format"2006-01-0215:04:05"}}AlertFixTime:{{$alert.EndsAt.Format"2006-01-0215:04:05"}}===MoreInfo==={{ifgt(len$alert.Labels.instance)0-}}InstanceIp:{{$alert.Labels.instance}};{{-end-}}{{-ifgt(len$alert.Labels.namespace)0-}}InstanceNamespace:{{$alert.Labels.namespace}};{{-end-}}{{-ifgt(len$alert.Labels.node)0-}}NodeIP:{{$alert.Labels.node}};{{-end-}}{{-ifgt(len$alert.Labels.pod_name)0-}}PodName:{{$alert.Labels.pod_name}};{{-end}}======================={{-end}}{{-end}}{{-end}}现在我们先删除原来的alertmanager-mainsecret,然后根据alertmanager.yaml和wechat.tmplfile=wechat.tmpl-nmonitoring创建alertmanager-mainsecret经过以上步骤后创建后,我们很快就会收到一条微信消息,同邮箱也会收到告警信息:再次查看AlertManager的配置信息,可以看到已经变成了我们上面的配置信息