23.监控prometheus
官方文档:https://prometheus.io/docs
https://github.com/coreos/prometheus-operator
https://www.qikqiak.com/k8strain/monitor/prometheus/
一. 简介
1. 组件架构
Prometheus Server
服务核心组件,通过pull metrics从 Exporter 拉取和存储监控数据,并提供一套灵活的查询语言(PromQL)。
Pushgateway
类似一个中转站,接收主动推动过来的数据,等待Prometheus Server来pull数据。
某些节点因为某些原因只能使用push方式推送数据,情况比如:Prometheus Server的pull动作是有间隔的,如果某些容器或任务存活的时间特别短,那么可能还没等到Prometheus Server来找它就已经结束了,因此需要这些容器或任务主动发送自己的监控信息给Prometheus,而Pushgateway就是接收并暂存中转这些主动推送数据的。
Jobs/Exporter
负责收集目标对象(host, container…)的性能数据,并通过 HTTP 接口供 Prometheus Server 获取。
Exporter是指一些应用可能没有自带 /metrics 接口供 Prometheus 使用,在这种情况下,我们就需要利用额外的exporter 服务来为 Prometheus 提供指标数据,更多Export请看:https://prometheus.io/docs/instrumenting/exporters/
Service Discovery
Prometheus支持多种服务发现机制:文件,DNS,Consul,Kubernetes,OpenStack,EC2等等。
基于服务发现的过程并不复杂,通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮询这些Target获取监控数据。
Alertmanager
从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对方的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty 等。
2. prometheus配置文件简述
二进制安装时可以通过./prometheus --config.file=prometheus.yml
来指定配置文件运行prometheus,k8s下一般将配置文件通过configmap形式保存,再通过挂载方式使用
配置文件的基本配置如下
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
global
模块控制 Prometheus Server 的全局配置:scrape_interval
:表示 prometheus 抓取指标数据的频率,默认是15s,我们可以覆盖这个值evaluation_interval
:用来控制评估规则的频率,prometheus 使用规则产生新的时间序列数据或者产生警报rule_files
:指定了报警规则所在的位置,prometheus 可以根据这个配置加载规则,用于生成新的时间序列数据或者报警信息,当前我们没有配置任何报警规则。scrape_configs
用于控制 prometheus 监控哪些资源,此处配置了一个监控prometheus自身的job,若有其他资源需要监控就此处添加配置。
下文若提到prometheus.yml就是指这个prometheus配置文件,下文会有其他详细配置用法。
二进制安装可以通过https://prometheus.io/download下载prometheus,这里不进行扩展
二. k8s部署配置prometheus
提前创建namespace:kube-mon
1.prometheus-cm.yaml
查看
configmap保存prometheus配置,后续通过修改configmap修改prometheus配置
2.prometheus-rbac.yaml
查看
3.prometheus-dp.yaml
查看
- prometheus 的性能和数据持久化我们这里是直接将通过 hostPath 的方式来进行数据持久化的
-
--storage.tsdb.path=/prometheus
指定容器内数据目录,然后将该目录声明挂载到主机/data/prometheus - nodeSelector 将 Pod 固定到了一个具有 monitor=prometheus 标签的节点上
为目标节点打标签:kubectl label node 172.10.10.21 monitor=prometheus
4.prometheus-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: prometheus-nodeport
namespace: kube-mon
labels:
app: prometheus
spec:
selector:
app: prometheus
type: NodePort
ports:
- name: web
port: 9090
targetPort: http
nodePort: 8003
创建一个NodePort型服务,用于访问prometheus页面
http://172.10.10.21:8003
当前的prometheus是单节点的,可以满足基本的使用,那高可用prometheus该怎么搭建呢?后续我们将尝试搭建prometheus-operator
三. 使用prometheus
1. 监控coreDns服务
前面我们部署coreDns时在configMap中配置了prometheus :9153
这个值,聪明的你肯定猜到了,coreDns自身提供了/metrics
接口,我们直接配置prometheus进行监控就行了
prometheus.yaml添加
scrape_configs:
- job_name: 'coredns'
static_configs:
- targets: ['kube-dns.kube-system:9153']
用kube-dns.kube-system
是因为prometheus和coreDns不在一个namespace中,所以写service域名时带上了namespace
2. 监控traefik服务
- traefik 添加参数开启metrics
--metrics=true
--metrics.prometheus=true
--metrics.prometheus.buckets=0.100000, 0.300000, 1.200000, 5.000000
--metrics.prometheus.entryPoint=traefik
-
测试metrics接口
curl http://192.168.177.109:8080/metrics
-
prometheus配置job
- job_name: 'traefik'
static_configs:
- targets: ['traefiktcp.default:8080']
这里的traefiktcp.default
是上面traefik svc 在coreDns中的域名curl -XPOST http://172.20.101.3:9090/-/reload
重载prometheus配置
乱入一张grafana的截图,展示一下效果,后续再详细说明grafana的配置使用
下一节我们看看grafana怎么使用,待grafana就绪后我们再实现k8s集群的监控
3. 监控ingress-nginx
- 添加metrics服务
前几节安装的ingress-nginx自带metrics接口,我们只需要通过svc将其暴露出来就可以了
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-metrics
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: ClusterIP
ports:
- name: metrics
port: 10254
targetPort: 10254
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
- 查看svc并测试
➜ ~ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 192.168.175.255 <none> 80:8480/TCP,443:8443/TCP 59m
ingress-nginx-metrics ClusterIP 192.168.201.61 <none> 10254/TCP 21m
➜ ~ curl http://192.168.201.61:10254/metrics
go_gc_duration_seconds{quantile="0"} 9.336e-06
go_gc_duration_seconds{quantile="0.25"} 1.7991e-05
go_gc_duration_seconds{quantile="0.5"} 3.8044e-05
go_gc_duration_seconds{quantile="0.75"} 0.000102869
......
- 配置prometheus监控
- job_name: 'ingress-nginx'
static_configs:
- targets: ['ingress-nginx-metrics.ingress-nginx:10254']
reload prometheus后
后续扩展grafana展示监控统计数据
思考一个问题,若启动多个节点的traefik或ingress-nginx,这里配置的监控接口每次获取的都是不同节点的监控信息,其统计数据是不准确的,理想的统计数据是多个节点数据的汇总,这个问题怎么处理?
附录
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-mon
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: kube-mon
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: kube-mon
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: kube-mon
labels:
app: prometheus
spec:
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus
nodeSelector:
monitor: prometheus # 部署到指定节点,防止pod漂移
containers:
- image: prom/prometheus:v2.26.0
name: prometheus
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus" # 指定tsdb数据路径
- "--storage.tsdb.retention.time=24h"
- "--web.enable-admin-api" # 控制对admin HTTP API的访问,其中包括删除时间序列等功能
- "--web.enable-lifecycle" # 支持热更新,直接执行localhost:9090/-/reload立即生效
- "--web.console.libraries=/usr/share/prometheus/console_libraries"
- "--web.console.templates=/usr/share/prometheus/consoles"
ports:
- containerPort: 9090
name: http
volumeMounts:
- mountPath: "/etc/prometheus"
name: config-volume
- mountPath: "/prometheus"
name: data
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 100m
memory: 512Mi
securityContext:
runAsUser: 0 # runAsUser=0指定运行用户为root,否则容器可能没有权限使用下方挂载的主机volumes
volumes:
- name: data
hostPath:
path: /data/prometheus/
- name: config-volume
configMap:
name: prometheus-config