自定义监控报警
自定义监控报警
目录
[TOC]
自定义监控报警
上节课和大家讲解了 Prometheus Operator 的安装和基本使用方法,这节课给大家介绍如何在 Prometheus Operator
中添加一个自定义的监控项。
除了 Kubernetes 集群中的一些资源对象、节点以及组件需要监控,有的时候我们可能还需要根据实际的业务需求去添加自定义的监控项,添加一个自定义监控的步骤也是非常简单的。
- 第一步建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项
- 第二步为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象
- 第三步确保 Service 对象可以正确获取到 metrics 数据
接下来我们就来为大家演示如何添加 etcd
集群的监控。无论是 Kubernetes 集群外的还是使用 kubeadm 安装在集群内部的 etcd 集群,我们这里都将其视作集群外的独立集群,因为对于二者的使用方法没什么特殊之处。
实验环境
实验软件
1、etcd 监控
1.查询etcd启动参数
由于我们这里演示环境使用的是 kubeadm 搭建的集群,我们可以使用 kubectl 工具去获取 etcd 启动的相关参数:
[root@master1 ~]#kubectl get pods -n kube-system -l component=etcdNAMEREADYSTATUSRESTARTSAGEetcd-master11/1Running6(15d ago) 309d$kubectlgetpodsetcd-master1-nkube-system-oyaml......spec:containers:-command:-etcd---advertise-client-urls=https:---cert-file=/etc/kubernetes/pki/etcd/server.crt---client-cert-auth=true---data-dir=/var/lib/etcd---initial-advertise-peer-urls=https:---initial-cluster=master1=https:---key-file=/etc/kubernetes/pki/etcd/server.key---listen-client-urls=https:---listen-metrics-urls=http:---listen-peer-urls=https:---name=master1---peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt---peer-client-cert-auth=true---peer-key-file=/etc/kubernetes/pki/etcd/peer.key---peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt---snapshot-count=10000---trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt......
我们可以看到启动参数里面有一个 --listen-metrics-urls=http:apiVersion:monitoring.coreos.com/v1kind:ServiceMonitormetadata:name:etcd-k8snamespace:monitoringlabels:k8s-app:etcd-k8sspec:jobLabel:k8s-appendpoints:- port:portinterval:15sselector:matchLabels:k8s-app:etcdnamespaceSelector:matchNames:- kube-system
上面我们在 monitoring 命名空间下面创建了名为 etcd-k8s 的 ServiceMonitor 对象,基本属性和前面章节中的一致,匹配 kube-system 这个命名空间下面的具有 k8s-app=etcd
这个 label 标签的 Service,jobLabel
表示用于检索 job 任务名称的标签,由于 etcd 的 metrics 接口在 2381 端口下面,不需要 https 安全认证,所以用默认的配置即可。
关于 ServiceMonitor 更多的配置属性,可以参考官方的 API 文档的描述。
- 然后我们直接创建这个 ServiceMonitor 对象即可:
[root@master1 prometheus-operator]#kubectl apply -f kubernetesControlPlane-serviceMonitorEtcd.yamlservicemonitor.monitoring.coreos.com/etcd-k8screated
但实际上现在并不能监控到 etcd 集群,因为并没有一个满足 ServiceMonitor 条件的 Service 对象与之关联:
[root@master1 prometheus-operator]#kubectl get svc -n kube-system -l k8s-app=etcdNoresourcesfoundinkube-systemnamespace.
- 此时,可以看下prometheus-k8s监控对象
3.自定义 Endpoints 对象来创建 Service 对象
- 所以接下来我们需要创建一个满足上面条件的 Service 对象,由于我们把 etcd 当成是集群外部的服务,所以要引入到集群中来我们就需要自定义 Endpoints 对象来创建 Service 对象了:
[root@master1 prometheus-operator]#vim svc-etcd.yaml
# svc-etcd.yamlapiVersion:v1kind:Servicemetadata:name:etcd-k8snamespace:kube-systemlabels:k8s-app:etcdspec:type:ClusterIPclusterIP:None# 一定要设置 clusterIP:Noneports:- name:portport:2381---apiVersion:v1kind:Endpoints#注意这里metadata:name:etcd-k8snamespace:kube-systemlabels:k8s-app:etcdsubsets:- addresses:- ip:172.29.9.51# 指定etcd节点地址,如果是集群则继续向下添加nodeName:etc-masterports:- name:portport:2381
我们这里创建的 Service 没有采用前面通过 label 标签的形式去匹配 Pod 的做法,因为前面我们说过很多时候我们创建的 etcd 集群是独立于集群之外的,这种情况下面我们就需要自定义一个 Endpoints,要注意 metadata
区域的内容要和 Service 保持一致,Service 的 clusterIP 设置为 None,新版本的 etcd 将 metrics 接口数据放置到了 2381 端口。
- 直接创建该资源对象即可:
[root@master1 prometheus-operator]#kubectl apply -f svc-etcd.yaml service/etcd-k8screatedendpoints/etcd-k8screated[root@master1 prometheus-operator]#kubectl get svc -n kube-system -l k8s-app=etcdNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEetcd-k8sClusterIPNone<none>2381/TCP8s
4.修改
- 创建完成后,隔一会儿去 Prometheus 的 Dashboard 中查看 targets,便会有 etcd 的监控项了:
可以看到有一个明显的错误,2381 端口链接被拒绝,这是因为我们这里的 etcd 的 metrics 接口是监听在 127.0.0.1
这个 IP 上面的,所以访问会拒绝:
--listen-metrics-urls=http:alert_relabel_configs:- separator:;regex:prometheus_replicareplacement:$1action:labeldropalertmanagers:- follow_redirects:trueenable_http2:truescheme:httppath_prefix:/timeout:10sapi_version:v2relabel_configs:- source_labels:[__meta_kubernetes_service_name]separator:;regex:alertmanager-mainreplacement:$1action:keep- source_labels:[__meta_kubernetes_endpoint_port_name]separator:;regex:webreplacement:$1action:keepkubernetes_sd_configs:- role:endpointskubeconfig_file:""follow_redirects:trueenable_http2:truenamespaces:own_namespace:falsenames:- monitoringrule_files:- /etc/prometheus/rules/prometheus-k8s-rulefiles-0