Kube_Prometheus介绍及安装配置


Prometheus简介

Prometheus组件介绍

  • Prometheus Server : 用于抓取指标、存取时间序列数据
  • exporter : 暴露指标让任务job来抓取
  • pushgateway:push的方式将指标数据推送到该网关
  • altermanager:处理报警的报警组件
  • adhoc:用于数据查询

下图是Prometheus 官方提供的架构及其一些相关的生态系统组件:

)

Prometheus 直接接收或者通过中间的 Pushgateway 网关被动获取指标数据,在本地存储所有的获取的指标数据,并对这些数据进行规则整理,通过 Altermanager 进行报警或者通过Granfana 等工具进行展示。

Prometheus Operator介绍

Prometheus Operator的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。以下是Prometheus Operator的架构图

kube-Prometheus 项目介绍

prometheus-operator官方地址:https://github.com/prometheus-operator/prometheus-operator kube-prometheus官方地址:https://github.com/prometheus-operator/kube-prometheus

两个项目的关系:前者只包含了Prometheus Operator,后者既包含了Operator,又包含了Prometheus相关组件的部署及常用的Prometheus自定义监控,具体包含下面的组件

The Prometheus Operator:创建CRD自定义的资源对象

Prometheus Operator 是一种 Kubernetes 原生的监控解决方案,它基于 Prometheus 和 Kubernetes 进行深度集成,并提供了自动化的配置和管理方式,使得用户可以更加方便地在 Kubernetes 集群中使用 Prometheus 进行监控。

Prometheus Operator 的主要特点包括:

  1. 支持自动发现和配置:Prometheus Operator 可以根据 Kubernetes 资源定义自动发现和配置 Prometheus 监控目标;
  2. 支持自动缩放:Prometheus Operator 可以自动根据负载情况调整 Prometheus 实例数量;
  3. 具有高可用性:Prometheus Operator 支持集群模式部署,保证了监控服务的高可用性;
  4. 提供多种资源类型:Prometheus Operator 提供多种 Kubernetes 资源类型,如 ServiceMonitor、Prometheus、Alertmanager 等,便于用户进行监控配置和管理。
  5. 通过 Prometheus Operator,用户可以将 Prometheus 与 Kubernetes 紧密地结合起来,快速构建稳定、可靠的监控系统。

Highly available Prometheus:创建高可用的Prometheus

Prometheus-k8s 是一个用于在 Kubernetes 环境中部署和运行 Prometheus 的一款组件,它基于 Kubernetes 的 API 资源对象进行配置,并以容器化的方式运行 Prometheus Server 和 Prometheus Alertmanager。

Prometheus-k8s 主要提供以下特性:

  1. 部署管理:通过使用 Kubernetes 配置文件和 Helm Chart 部署和管理 Prometheus Server、Prometheus Alertmanager 和其他相关组件;
  2. 自动服务发现:通过 Prometheus Operator 进行自动服务发现,并将配置信息与 Kubernetes API 资源对象同步;
  3. 指标采集:支持多种指标采集方式,如 Prometheus PushGateway、Kubernetes ServiceDiscovery、Prometheus Node Exporter 等;
  4. 监控告警:通过 Prometheus Alertmanager 实现告警管理和通知,并支持多种通知方式,如邮件、Slack 等;
  5. 多租户支持:通过 Prometheus Tenant Manager 进行多租户的安全隔离和管理;
  6. 可扩展性:支持联邦集群、Horizonal Pod Autoscaler(HPA)等功能,保证了系统的可扩展性和高可用性。

通过 Prometheus-k8s,管理员可以轻松地在 Kubernetes 环境中构建和部署 Prometheus 监控系统,并实现全面的自动化监控和可视化告警通知。 同时,使用 Prometheus-k8s 也可以降低操作复杂性、提高系统稳定性,从而更好地支持容器化应用程序的管理和运营。

Highly available Alertmanager:创建高可用的告警组件

  • Alertmanager 是一个开源的告警管理系统,它与 Prometheus 搭配使用,主要负责处理由 Prometheus 生成的告警信息。当 Prometheus 监测到某个指标的值超出了预设的阈值或者其他条件时,它会生成一个告警信息并发送给 Alertmanager,然后由 Alertmanager 对这些告警信息进行分组、去重和通知等操作。

    Alertmanager 的主要特点包括:

    1. 支持多种通知方式,包括电子邮件、Slack、PagerDuty 等;
    2. 具有灵活的告警路由规则,可以根据不同的告警源、严重程度、时间等条件来控制告警的发送方式;
    3. 提供丰富的告警模板,可以根据用户的需求自定义告警内容的格式;
    4. 具备高可用性,支持集群模式部署,保证告警服务的稳定可靠性。
  • alertmanager-main 是 Alertmanager 的主要配置文件,它包含了 Alertmanager 的全局配置信息、路由规则、通知配置等内容

    alertmanager-main 配置文件中的一些常见配置项包括:

    1. global 配置项:用于定义全局配置信息,如邮件服务器、安全设置等;
    2. route 配置项:用于定义告警路由规则,可以根据告警标签、匹配表达式等条件来控制告警发送的方式;
    3. receivers 配置项:用于定义通知接收者(receiver),可以通过电子邮件、Slack、PagerDuty 等多种方式发送告警通知;
    4. inhibit_rules 配置项:用于定义告警抑制规则,可以防止多个相似的告警同时发送。

    alertmanager-main 配置文件是使用 YAML 格式编写的,用户可以根据自己的需求对其进行自定义配置。在修改配置文件后,需要重新启动 Alertmanager 才能生效

  • alertmanager-operated 是 Alertmanager Operator 生成的用于部署和管理 Alertmanager 的 Kubernetes 资源,它包含了 Alertmanager 的一些配置信息,如路由规则、通知接收者等。 与 alertmanager-main 配置文件不同,alertmanager-operated 文件是由 Prometheus Operator 自动生成的,并且它的内容是动态生成的。当用户对相应的 Kubernetes 资源进行修改时,Prometheus Operator 将会重新生成 alertmanager-operated 文件以更新 Alertmanager 的配置。

    alertmanager-operated 文件的主要配置项包括:

    1. podMetadata 配置项:用于定义 Alertmanager Pod 的元数据信息;
    2. replicas 配置项:用于定义 Alertmanager 实例数量;
    3. version 配置项:用于定义 Alertmanager 版本号;
    4. logLevel 配置项:用于定义 Alertmanager 日志级别;
    5. configSecret 配置项:用于定义 Alertmanager 配置文件的 Secret 对象名称;
    6. serviceAccountName 配置项:用于定义 Alertmanager 所属的 ServiceAccount 名称

    alertmanager-operated 文件是 Prometheus Operator 管理 Alertmanager 的重要工具之一,通过对其进行修改,可以快速配置和管理 Alertmanager 的运行模式和相关参数。

Prometheus node-exporter:创建主机的监控组件

用于监控 Linux/Unix 主机的操作系统指标信息。它主要通过在目标节点上运行一个守护进程,收集各种主机指标数据,并将这些数据暴露给 Prometheus 进行采集和监控。

node-exporter 监控的主机指标包括:

  1. CPU、内存、磁盘使用率等基本系统指标信息;
  2. 网络流量、传输速度等网络相关指标信息;
  3. 文件系统、磁盘 I/O、负载均衡等系统性能指标信息;
  4. 温度、电压、风扇转速等硬件相关指标信息等。

node-exporter 可以以多种形式运行,如作为二进制文件、Docker 容器、systemd 服务等,同时也支持多种输出格式,如纯文本、JSON、Prometheus 格式等。此外,node-exporter 也可以通过配置文件进行定制化设置,以满足不同场景下的需求。 通过 node-exporter,管理员可以及时了解目标节点的运行状态,优化和调整系统资源分配,以确保容器应用程序和 Kubernetes 集群的顺畅运行。

Prometheus Adapter for Kubernetes Metrics APIs:创建自定义监控的指标工具

Prometheus-adapter 是一个用于将 Prometheus 的指标适配为 Kubernetes API 资源指标的组件。它主要通过将 Prometheus 的查询结果转换为 Kubernetes API 资源指标,并将其合并到 Kubernetes API 服务器中,以便于在 HPA(Horizontal Pod Autoscaler)等 Kubernetes 内部组件中使用。

Prometheus-adapter 支持的资源对象包括:

  1. Deployment:用于自动扩展部署中的容器副本数量;
  2. StatefulSet:用于自动扩展 StatefulSet 中的容器副本数量;
  3. DaemonSet:用于自动扩展 DaemonSet 中的节点数量。

例如,当使用 Prometheus-adapter 和 HPA 结合时,可以根据 Prometheus 中特定指标的值自动调整容器副本的数量,以满足应用程序的负载变化。 同时,在 Prometheus-adapter 中也支持提供多个不同的 Kubernetes API 资源指标对象定义,以便于管理员根据不同的场景需求进行自定义设置和使用。 通过 Prometheus-adapter,管理员可以轻松地将 Prometheus 监控指标集成到 Kubernetes 中,为 Kubernetes 应用程序提供全面的自动扩展和监控能力,提高系统的弹性和可靠性。

kube-state-metrics:监控k8s相关资源对象的状态指标

kube-state-metrics 是 Kubernetes 的一种监控工具,用于监控 Kubernetes 集群的各种状态信息。它主要通过从 Kubernetes API 服务器获取资源对象的指标信息来实现监控。

kube-state-metrics 支持的资源对象包括:

  1. Node:节点资源对象,包含了该节点的 CPU、内存、存储等指标信息;
  2. Pod:Pod 资源对象,包含了该 Pod 的 CPU 使用率、内存使用率、网络流量等指标信息;
  3. Deployment:部署资源对象,包含了该部署的副本数、可用性等指标信息;
  4. Service:服务资源对象,包含了该服务的连接数、请求延迟、流量量等指标信息;
  5. ReplicaSet、StatefulSet、DaemonSet 等其他资源对象。

kube-state-metrics 暴露了一个 HTTP API,可以通过 Prometheus 进行采集和监控,并将数据聚合到 Prometheus 的时序数据库中。通过kube-state-metrics,管理员可以及时发现 Kubernetes 集群中的异常情况,对系统健康状态进行全面监控和管理。

Grafana:进行图像展示

Grafana 是一个用于展示和分析指标数据的开源数据可视化工具。它支持多种数据源,包括 Prometheus、Elasticsearch、InfluxDB 等,可以帮助用户以图形化的方式更好地理解监控数据、日志数据等。 Grafana 的主要特点包括:

  1. 支持多种数据源,用户可以方便地将不同的数据源整合在一起进行展示和分析;
  2. 提供丰富的可视化功能,包括各种图表类型、仪表盘、报表等;
  3. 具备灵活的告警功能,可以根据用户的需求自定义告警规则;
  4. 支持多种插件扩展,用户可以根据自己的需要添加适合自己的插件。

配置安装

下载、解压安装文件

KUBE_PROMETHEUS_VERSION=0.13.0
wget --content-disposition https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v$KUBE_PROMETHEUS_VERSION.tar.gz
$ tar -zxf kube-prometheus-0.13.0.tar.gz
$ tree  -L 1 .
.
├── build.sh
├── CHANGELOG.md
├── code-of-conduct.md
├── CONTRIBUTING.md
├── developer-workspace
├── docs
├── example.jsonnet
├── examples
├── experimental
├── go.mod
├── go.sum
├── jsonnet
├── jsonnetfile.json
├── jsonnetfile.lock.json
├── kubescape-exceptions.json
├── kustomization.yaml
├── LICENSE
├── Makefile
├── manifests
├── README.md
├── RELEASE.md
├── scripts
└── tests

替换组件所需镜像

# 由于 kubeStateMetrics-deployment.yaml、prometheusAdapter-deployment.yaml 使用的是 registry.k8s.io 域名下的镜像,国内访问困难
$ sed -i 's#registry.k8s.io/kube-state-metrics/kube-state-metrics#docker.io/xuxiaoweicomcn/kube-state-metrics#g' manifests/kubeStateMetrics-deployment.yaml
$ sed -i 's#registry.k8s.io/prometheus-adapter/prometheus-adapter#docker.io/xuxiaoweicomcn/prometheus-adapter#g' manifests/prometheusAdapter-deployment.yaml

修改networkpolicy 允许外部访问

$ cat manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/  - from:/  - from: \[\]/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/    - podSelector:/#&/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/        matchLabels:/#&/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/          app.kubernetes\.io\/name: prometheus/#&/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/          app.kubernetes\.io\/name: alertmanager/#&/' manifests/alertmanager-networkPolicy.yaml


$ cat manifests/grafana-networkPolicy.yaml
$ sed -i 's/  - from:/  - from: \[\]/' manifests/grafana-networkPolicy.yaml
$ sed -i 's/    - podSelector:/#&/' manifests/grafana-networkPolicy.yaml
$ sed -i 's/        matchLabels:/#&/' manifests/grafana-networkPolicy.yaml
$ sed -i 's/          app.kubernetes\.io\/name: prometheus/#&/' manifests/grafana-networkPolicy.yaml


$ cat manifests/prometheus-networkPolicy.yaml
$ sed -i 's/  - from:/  - from: \[\]/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/    - podSelector:/#&/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/        matchLabels:/#&/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/          app.kubernetes\.io\/name: prometheus/#&/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/          app.kubernetes\.io\/name: grafana/#&/' manifests/prometheus-networkPolicy.yaml

修改服务组件使用NodePort方式暴漏

$ sed -i '/spec/a \  type: NodePort' manifests/alertmanager-service.yaml

$ sed -i '/spec/a \  type: NodePort' manifests/prometheus-service.yaml

$ sed -i '/spec/a \  type: NodePort' manifests/grafana-service.yaml

修改Prometheus 持久化

prometheus是一种 StatefulSet 有状态集的部署模式,所以直接将 StorageClass 配置到里面,在下面的 yaml 中最下面添加持久化配置。

目录:manifests/prometheus-prometheus.yaml

在文件末尾新增

---
  version: 2.46.0
  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: qiqios-nfs-storage
        resources:
          requests:
            storage: 5Gi

修改 grafana 持久化配置

由于 Grafana 是部署模式为 Deployment,所以我们提前为其创建一个 grafana-pvc.yaml 文件,加入下面 PVC 配置

目录: manifests/grafana-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: grafana
  namespace: monitoring  #---指定namespace为monitoring
spec:
  storageClassName: qiqios-nfs-storage #---指定StorageClass
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

修改 grafana-deployment.yaml 文件设置持久化配置,应用上面的 PVC(目录:manifests/grafana-deployment.yaml)

修改内容如下:

---
      serviceAccountName: grafana
      volumes:
      - name: grafana-storage       # 新增持久化配置
        persistentVolumeClaim:
          claimName: grafana        # 设置为创建的PVC名称
#      - emptyDir: {}               # 注释旧的注释
#        name: grafana-storage
      - name: grafana-datasources
        secret:
          secretName: grafana-datasources

修改Grafana-dashboard 显示时区

kube-prometheus项目中,默认dashboard时区是UTC,比中国时间慢了8小时,很不便于日常监控查看。

$ grep -i timezone ./manifests/grafana-dashboardDefinitions.yaml
          "timezone": "utc",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "utc",
          "timezone": "utc",
          "timezone": "utc",
          "timezone": "utc",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "browser",
          "timezone": "utc",
          "timezone": "UTC",
          "timezone": "UTC",
          "timezone": "UTC",

sed 命令直接修改,调整时间utc为utc+8

$ sed -i 's/UTC/UTC+8/g' ./manifests/grafana-dashboardDefinitions.yaml
$ sed -i 's/utc/utc+8/g' ./manifests/grafana-dashboardDefinitions.yaml
$ grep -i timezone ./manifests/grafana-dashboardDefinitions.yaml
          "timezone": "utc+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "utc+8",
          "timezone": "utc+8",
          "timezone": "utc+8",
          "timezone": "utc+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "browser",
          "timezone": "utc+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",
          "timezone": "UTC+8",

初始化

安装

安装方式:https://github.com/prometheus-operator/kube-prometheus#quickstart

kubectl apply --server-side -f manifests/setup
kubectl wait --for condition=Established --all CustomResourceDefinition --namespace=monitoring
kubectl apply -f manifests/
kubectl get pod,svc -n monitoring
kubectl get prometheuses -n monitoring

卸载

kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

查看pod状态是否正常

$ kubectl get pod -n monitoring
NAME                                   READY   STATUS    RESTARTS   AGE
alertmanager-main-0                    2/2     Running   0          3m50s
alertmanager-main-1                    2/2     Running   0          3m50s
alertmanager-main-2                    2/2     Running   0          3m50s
blackbox-exporter-6cfc4bffb6-gjxm6     3/3     Running   0          3m59s
grafana-748964b847-kvjdv               1/1     Running   0          3m58s
kube-state-metrics-bfc54b7f-8rbpp      3/3     Running   0          3m58s
node-exporter-88wqk                    2/2     Running   0          3m57s
node-exporter-94r8l                    2/2     Running   0          3m57s
node-exporter-mbv9z                    2/2     Running   0          3m57s
node-exporter-mjpwc                    2/2     Running   0          3m57s
node-exporter-qtsnk                    2/2     Running   0          3m57s
prometheus-adapter-c5c768944-hqclp     1/1     Running   0          3m56s
prometheus-adapter-c5c768944-x4mfb     1/1     Running   0          3m56s
prometheus-k8s-0                       2/2     Running   0          3m48s
prometheus-k8s-1                       2/2     Running   0          3m48s
prometheus-operator-68f6c79f9d-mscbq   2/2     Running   0          3m56s

查看 Service相关端口和暴漏方式

$ kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
alertmanager-main       NodePort    10.68.153.118   <none>        9093:32550/TCP,8080:31973/TCP   5m12s
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP      5m3s
blackbox-exporter       ClusterIP   10.68.138.74    <none>        9115/TCP,19115/TCP              5m12s
grafana                 NodePort    10.68.78.165    <none>        3000:31405/TCP                  5m11s
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP               5m11s
node-exporter           ClusterIP   None            <none>        9100/TCP                        5m10s
prometheus-adapter      ClusterIP   10.68.66.173    <none>        443/TCP                         5m9s
prometheus-k8s          NodePort    10.68.187.0     <none>        9090:31974/TCP,8080:31218/TCP   5m9s
prometheus-operated     ClusterIP   None            <none>        9090/TCP                        5m1s
prometheus-operator     ClusterIP   None            <none>        8443/TCP                        5m9s

修改grafana配置

获取当前grafana配置

kubectl -n monitoring get secrets grafana-config -ojsonpath='{.data.grafana\.ini}' | base64 --decode ; echo
[date_formats]
default_timezone = UTC

编写明文配置文件

cat <<EOF > grafana.ini
[date_formats]
# 时区:亚洲上海
default_timezone = Asia/Shanghai

[auth.anonymous]
# 匿名访问:开启
enabled = true

[security]
# 允许 iframe 被嵌套
allow_embedding = true

[users]
# 默认语言:中文
default_language = zh-Hans

EOF

使用base64 加密配置文件

cat grafana.ini | base64
W2RhdGVfZm9ybWF0c10KIyDml7bljLrvvJrkuprmtLLkuIrmtbcKZGVmYXVsdF90aW1lem9uZSA9
IEFzaWEvU2hhbmdoYWkKClthdXRoLmFub255bW91c10KIyDljL/lkI3orr/pl67vvJrlvIDlkK8K
ZW5hYmxlZCA9IHRydWUKCltzZWN1cml0eV0KIyDlhYHorrggaWZyYW1lIOiiq+W1jOWllwphbGxv
d19lbWJlZGRpbmcgPSB0cnVlCgpbdXNlcnNdCiMg6buY6K6k6K+t6KiA77ya5Lit5paHCmRlZmF1
bHRfbGFuZ3VhZ2UgPSB6aC1IYW5zCgo=

修改grafana的配置文件

$ kubectl -n monitoring edit   secrets grafana-config -o yaml
apiVersion: v1
data:
  grafana.ini: W2RhdGVfZm9ybWF0c10KIyDml7bljLrvvJrkuprmtLLkuIrmtbcKZGVmYXVsdF90aW1lem9uZSA9IEFzaWEvU2hhbmdoYWkKClthdXRoLmFub255bW91c10KIyDljL/lkI3orr/pl67vvJrlvIDlkK8KZW5hYmxlZCA9IHRydWUKCltzZWN1cml0eV0KIyDlhYHorrggaWZyYW1lIOiiq+W1jOWllwphbGxvd19lbWJlZGRpbmcgPSB0cnVlCgpbdXNlcnNdCiMg6buY6K6k6K+t6KiA77ya5Lit5paHCmRlZmF1bHRfbGFuZ3VhZ2UgPSB6aC1IYW5zCgo=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"grafana","app.kubernetes.io/name":"grafana","app.kubernetes.io/part-of":"kube-prometheus","app.kubernetes.io/version":"9.5.3"},"name":"grafana-config","namespace":"monitoring"},"stringData":{"grafana.ini":"[date_formats]\ndefault_timezone = UTC\n"},"type":"Opaque"}
  creationTimestamp: "2023-12-14T09:15:41Z"
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 9.5.3
  name: grafana-config
  namespace: monitoring
  resourceVersion: "2009097"
  uid: 402082f7-e647-4663-a82a-f285d7ec6840
type: Opaque

重启grafana的deployment控制器即可加载

kubectl -n monitoring rollout restart deployment grafana

Kube_Prometheus介绍及安装配置
http://www.qiqios.cn/2023/12/14/Prometheus简介/
作者
一亩三分地
发布于
2023年12月14日
许可协议