ThanoRuler组件是用来评估Prometheus的录音规则和报警规则的组件。它本身并不采集指标接口数据,而是周期性地从查询组件中通过QueryAPI获取指标数据。如果配置了多个查询地址,将使用轮询。记录规则评估产生的数据会保存在本地,本地产生的TSDB数据块会定期扫描并上传到对象存储桶作为历史数据长期保存。同时可以通过StoreAPI查询本地保存的数据。与Prometheus节点类似,每个ruler节点使用独立存储,可以同时运行多个副本,需要为每个副本实例分配不同的标签进行区分,因为在对象存储中查询历史数据时会用到store组件使用此标签对查询进行分组。安装由于ruler组件也实现了StoreAPI,我们也可以直接将此组件连接到store组件,只需要在创建的Pod中添加标签thanos-store-api:"true"即可(Service会自动关联)查询组件服务。整体上,我们可以将ruler节点理解为一个简单的Prometheus节点,但它不需要thanossidecar,不抓取指标数据,只负责执行PromQL查询。由于会保留独立存储,所以这里我们也需要做数据持久化的改动。然后你可以通过部署两个副本来实现高可用性。这里我们添加一个--label=rule_replica标签,为数据添加一个rule_replica标签,并指定--alert.label-drop为rule_replica,这样当触发报警时,会发送通知,给的时候可以去掉这个标签交给AlertManager,让AlertManager自动去重,避免重复告警。然后通过--query参数指定查询组件的地址。这里我们仍然使用DNSSRV来进行服务发现,这样就可以从查询组件中获取到指标数据。ruler还需要对象存储的配置,用于将计算后的数据上传到对象存储,所以必须挂载对象存储的配置文件。--rule-file参数可以用来指定挂载的规则配置,ruler组件会根据配置生成数据并触发告警。完整的资源清单文件如下所示:#thanos-ruler.yamlapiVersion:apps/v1kind:StatefulSetmetadata:name:thanos-rulernamespace:kube-monlabels:app:thanos-rulerspec:replicas:2selector:matchLabels:app:thanos-ruler服务名称:thanos-rulepodManagementPolicy:并行模板:元数据:标签:app:thanos-rulerthanos-store-api:“true”规范:亲和力:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-权重:100podAffinityTerm:topologyKey:kubernetes.io/hostnamelabelSelector:matchExpressions:-key:appoperator:Invalues:-thanos-rulercontainers:-name:thanos-rulerimage:thanosio/thanos:v0.25.1args:-规则---grpc-address=0.0.0.0:10901---http-地址=0.0.0.0:10902---rule-file=/etc/thanos/rules/*rules.yaml---objstore.config-file=/etc/secret/thanos.yaml---data-dir=/var/thanos/rule---label=rule_replica="$(NAME)"---alert.label-drop=rule_replica---query=dnssrv+_http._tcp.thanos-querier.kube-mon.svc.cluster.local端口:-容器端口:10901名称:grpc-containerPort:10902名称:httpenv:-名称:NAMEvalueFrom:fieldRef:fieldPath:metadata.namelivenessProbe:httpGet:路径:/-/健康端口:10902方案:HTTPreadinessProbe:httpGet:路径:/-/就绪端口:10902方案:HTTPvolumeMounts:-mountPath:/var/thanos/rulename:datareadOnly:false-name:object-storage-configmountPath:/etc/secretreadOnly:false-名称:thanos-rulesmountPath:/etc/thanos/rulesvolumes:-名称:object-storage-configsecret:secretName:thanos-objectstorage-名称:thanos-rulesconfigMap:名称:thanos-rulesvolumeClaimTemplates:-元数据:名称:dataspec:accessModes:-ReadWriteOncestorageClassName:longhornresources:requests:storage:1Gi注意上面挂载的对象存储配置的Secret,还需要通过一个ConfigMap配置规则:#thanos-rules-config.yamlapiVersion:v1kind:ConfigMapmetadata:名称:thanos-rules命名空间:kube-mondata:record.rules.yaml:|-组:-名称:k8s.rules规则:-expr:|sum(rate(container_cpu_usage_seconds_total{job="cadvisor",image!="",container!=""}[5m]))by(namespace)记录:namespace:container_cpu_usage_seconds_total:sum_rate-expr:|总和(container_memory_usage_bytes{job="cadvisor",image!="",container!=""})由(命名空间)记录:命名空间:container_memory_usage_bytes:sum-expr:|sumby(namespace,pod,container)(rate(container_cpu_usage_seconds_total{job="cadvisor",image!="",container!=""}[5m]))record:namespace_pod_container:container_cpu_usage_seconds_total:sum_rate这里我们简单配置几个记录规则,配置方法同前面的规则,然后直接创建上面的资源对象:??kubectlapply-fhttps://p8s.io/docs/thanos/manifests/thanos-rules-config-0.yaml??kubectlapply-fhttps://p8s.io/docs/thanos/manifests/thanos-ruler-0.yaml??kubectlgetpods-nkube-mon-lapp=thanos-rulerNAMEREADYSTATUSRESTARTSAGEthanos-ruler-01/1Running016mthanos-ruler-11/1Running016m部署完成后,我们可以在查询组件页面查看store信息是否包含上面的ruler示例:也可以看我们在规则页面定义的记录规则信息:现在我们可以尝试查询上面的记录规则,比如查询namespace:container_cpu_usage_seconds_total:sum_rate:可以看到这条记录规则的数据是可以正常获取的。对接告警如果要告警,首先我们需要通过启动参数--alertmanagers.url指定Alertmanager的地址。如果需要更高级的配置,可以通过启动参数--alertmanagers.config或--alertmanagers.config-file指定连接Alertmanager的配置,格式如下:alertmanagers:-http_config:basic_auth:username:“”密码:“”password_file:“”bearer_token:“”bearer_token_file:“”proxy_url:“”tls_config:ca_file:“”cert_file:“”key_file:“”server_name:“”insecure_skip_verify:falsestatic_configs:[]file_sd_configs:-files:[]refresh_interval:0sscheme:httppath_prefix:""timeout:10sapi_version:v1比如我们上一章连接Alertmanager,那么只要加上--alertmanagers.url=http://alertmanager:9093即可以上资源对象容器的启动参数。然后在上面的thanos-rulesConfigMap中添加一个alert.rules.yaml配置来配置告警规则,如下:.rules.yaml:|-#......alert.rules.yaml:|-groups:-name:test-node-memrules:-alert:NodeMemoryUsageexpr:(node_memory_MemTotal_bytes-(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes))/node_memory_MemTotal_bytes*100>30for:1mlabels:team:nodeseverity:criticalannotations:summary:"{{$labels..instance}}:Memoryusageisabove30%(currentvalueis:{{$value}})》直接更新上面两个资源对象即可:更新完成后,还可以看到新增的告警规则,因为我们部署的是两个副本,所以可以看到两条相同的规则:??kubectlapply-fhttps//p8s.io/docs/thanos/manifests/thanos-rules-config。yaml??kubectlapply-fhttps://p8s.io/docs/thanos/manifests/thanos-ruler.yaml由于在我们的ruler组件的启动参数中配置了参数--alert.label-drop=rule_replica,所以Alertmanager不会收到重复的告警,但是需要注意的是After测试,这里的rule_replica是不能引用的。添加引号将重复删除并失败。我们可以去Alertmanager查看触发的告警信息:由于ruler组件获取评估数据的路径是ruler-->query-->sidecar-->prometheus,需要走完整个query链,这也增加了失败的风险,并且可以在Prometheus中进行评估,所以如果没有必要建议使用Prometheus原有的方法评估告警和记录规则
