23.安装监控prometheus

23.监控prometheus

官方文档:https://prometheus.io/docs
https://github.com/coreos/prometheus-operator
https://www.qikqiak.com/k8strain/monitor/prometheus/

一. 简介

1. 组件架构

23.安装监控prometheus

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
23.安装监控prometheus

当前的prometheus是单节点的,可以满足基本的使用,那高可用prometheus该怎么搭建呢?后续我们将尝试搭建prometheus-operator

三. 使用prometheus

1. 监控coreDns服务

前面我们部署coreDns时在configMap中配置了prometheus :9153这个值,聪明的你肯定猜到了,coreDns自身提供了/metrics接口,我们直接配置prometheus进行监控就行了
23.安装监控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
23.安装监控prometheus

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
    23.安装监控prometheus

  • 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的配置使用
23.安装监控prometheus

下一节我们看看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后
23.安装监控prometheus

后续扩展grafana展示监控统计数据

思考一个问题,若启动多个节点的traefik或ingress-nginx,这里配置的监控接口每次获取的都是不同节点的监控信息,其统计数据是不准确的,理想的统计数据是多个节点数据的汇总,这个问题怎么处理?

附录

  • prometheus-cm.yaml
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']
  • prometheus-rbac.yaml
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
  • prometheus-dp.yaml
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        
上一篇:App上线流程全攻略(史上最具体步骤)


下一篇:【原创】Ingress-Nginx-Controller的Metrics监控源码改造简析