Kubernetes 部署监控工具 Prometheus

Kubernetes 部署监控工具 Prometheus

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • Kubernetes 版本: 1.20.2
  • Docker 版本: 19.03.13
  • 操作系统: CentOS 7.9
  • Prometheus 版本: 2.26.0

参考地址:

示例地址:


系列文章目录


一、Prometheus 简介

下面的说明内容大部分来自于官网,本人感觉官网的概述还是比较清晰的。

Prometheus 是什么

Prometheus 是在 SoundCloud 上构建并开源的系统监视和警报工具包。自 2012 年成立以来,许多公司和组织都采用 Prometheus,该项目拥有非常活跃的开发人员和用户社区。不过它现在已经成为一个独立的开源项目,并且独立于任何公司进行维护。为了强调这一点并澄清项目的治理结构,Prometheus 于 2016 年加入了云原生计算基金会,成为继 Kubernetes 之后的第二个毕业项目。

Prometheus 特征

Prometheus 主要特征如下:

  • 多维数据模型(时序列数据由 metric 名和一组 key/value 组成)。
  • 提供 PromQL,这是一种灵活的查询语言,可以利用多维数据完成复杂的查询。
  • 不依赖 分布式存储,支持服务器 本地存储
  • 基于 HTTPPull 方式采集时间序列数据。
  • 通过 PushGateway 可以支持 Push 模式推送 时间序列
  • 可以通过 动态服务发现静态配置 等方式发现目标对象。
  • 多种可视化和仪表盘支持。

Prometheus 组成

Prometheus 生态系统包含多个组件,其中许多是可选的:

  • Prometheus 主服务器: 用于抓取指标、存储时间序列数据。
  • Client libraries: 用于检测应用程序代码。
  • PushGateway: 支持短期工作的推送网关。
  • Alertmanager: 用于处理报警的组件。
  • 支持 HAProxy、StatsD、Graphite 等服务的特殊用途出口商。
  • ......(其它工具)

Prometheus 架构

下图说明了 Prometheus 的体系结构及其某些生态系统组件:

Prometheus 架构图

Prometheus 直接或者通过中间件 PushGateway 中获取指标数据,它将所有收集到的指标样本存储在本地,并对这些数据按照一定规则进行运算,以汇总和记录现有的数据组的新的时间序列或者生成报警规则。而 Grafana 或者其它 API 使用者可以通过这些收集的指标数据进行可视化展示。

Promethues 适合场景

什么时候适合使用 Prometheus

Prometheus 非常适合记录任何纯数字时间序列。它既适合以机器为中心的监控,也适合监控高度动态的面向服务的体系结构。在微服务世界中,其对多维数据收集和查询的支持是一种特别的优势。 Prometheus 是为可靠性而设计的,在出现故障时,你可以使用该系统快速诊断问题。每个 Prometheus 服务器都是独立的,而不依赖于网络存储或其他远程服务。当基础结构的其他部分损坏时单独依赖它就行,而且不需要设置大量的基础设施来使用它。

什么时候不适合使用 Prometheus

Prometheus 注重可靠性。可以随时查看有关系统的可用统计信息,集成在出现故障的情况下也是如此。如果需要保证 100% 的数据准确性(例如按照请求数进行收费)则 Prometheus 并不是一个很好的选择,因为收集的数据可能不够详细和完整。

二、Kubernetes 部署 Prometheus

Kubernetes 部署 Prometheus RBAC

创建 Prometheus 部署 Kubernetes 所需的 RBAC 资源文件 prometheus-rbac.yaml,内如如下:

注意: 部署前请提前修改里面的 Namespace 参数为你要部署 Prometheus 应用所在的 Namespace。

 1apiVersion: v1
 2kind: ServiceAccount
 3metadata:
 4  name: prometheus
 5  namespace: kube-system
 6---
 7apiVersion: rbac.authorization.k8s.io/v1
 8kind: ClusterRole
 9metadata:
10  name: prometheus
11rules:
12- apiGroups: [""]
13  resources: ["nodes","nodes/proxy","services","endpoints","pods"]
14  verbs: ["get", "list", "watch"] 
15- apiGroups: ["extensions"]
16  resources: ["ingress"]
17  verbs: ["get", "list", "watch"]
18- nonResourceURLs: ["/metrics"]
19  verbs: ["get"]
20---
21apiVersion: rbac.authorization.k8s.io/v1
22kind: ClusterRoleBinding
23metadata:
24  name: prometheus
25roleRef: 
26  apiGroup: rbac.authorization.k8s.io
27  kind: ClusterRole
28  name: cluster-admin
29subjects:
30- kind: ServiceAccount
31  name: prometheus
32  namespace: kube-system

RBAC 文件部署到 Kubernetes 中,执行的命令如下:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-rbac.yaml -n kube-system

Kubernetes 部署 Prometheus 存储

创建用于 Prometheus 存储的 PVPVC 资源文件 prometheus-storage.yaml,内容如下:

这里使用的是 NFS 方式的 PV,需要存在 NFS Server 端才行,如果使用其它存储,请自行按照对应的存储方式进行配置 PV 参数,并且还需要注意配置文件夹的读写权限。

 1apiVersion: v1
 2kind: PersistentVolume
 3metadata:
 4  name: prometheus
 5  labels:
 6    k8s-app: prometheus
 7spec:
 8  capacity:          
 9    storage: 50Gi
10  accessModes:       
11    - ReadWriteOnce
12  persistentVolumeReclaimPolicy: Retain
13  storageClassName: nfs-storage    ## 指定 StorageClass,PVC 中设置的该名称要和这里保持一致
14  mountOptions:
15    - hard
16    - nfsvers=4.1                  ## 指定 NFS 版本
17  nfs: 
18    server: 192.168.2.11           ## NFS 服务器的地址
19    path: /nfs/prometheus          ## NFS 数据存储目录
20---
21kind: PersistentVolumeClaim
22apiVersion: v1
23metadata:
24  name: prometheus
25  labels:
26    k8s-app: prometheus  
27spec:
28  accessModes:
29    - ReadWriteOnce
30  storageClassName: nfs-storage   ## 指定 StorageClass
31  resources:
32    requests:
33      storage: 50Gi
34  selector:
35    matchLabels:
36      k8s-app: prometheus

将存储相关资源文件部署到 Kubernetes 的中,执行的命令如下:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-storage.yaml -n kube-system

Kubernetes 创建 Prometheus 配置

Prometheus 配置文件是一个我们经常改动的文件,比较推荐将该配置文件内容存储到 Kubernetes 的 ConfigMap 中,方便我们进行更改配置内容。

创建 Prometheus 配置文件 prometheus-config.yaml,内如如下:

 1apiVersion: v1
 2kind: ConfigMap
 3metadata:
 4  name: prometheus-config
 5data:
 6  prometheus.yml: |
 7    global:
 8      scrape_interval:     15s
 9      evaluation_interval: 15s
10      external_labels:
11        cluster: "kubernetes"
12        
13    scrape_configs:
14    - job_name: prometheus
15      static_configs:
16      - targets: ['127.0.0.1:9090']
17        labels:
18          instance: prometheus    

将配置资源文件部署到 Kubernetes 的资源中,执行的命令如下:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-config.yaml -n kube-system

Kubernetes 部署 Prometheus

创建 Prometheus 部署文件 prometheus-deploy.yaml,内如如下:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: prometheus
 5  labels:
 6    k8s-app: prometheus
 7spec:
 8  type: NodePort
 9  ports:
10  - name: http
11    port: 9090
12    targetPort: 9090
13    nodePort: 30900
14  selector:
15    k8s-app: prometheus
16---
17apiVersion: apps/v1
18kind: Deployment
19metadata:
20  name: prometheus
21  labels:
22    k8s-app: prometheus
23spec:
24  replicas: 1
25  selector:
26    matchLabels:
27      k8s-app: prometheus
28  template:
29    metadata:
30      labels:
31        k8s-app: prometheus
32    spec:
33      serviceAccountName: prometheus
34      containers:
35      - name: prometheus
36        image: prom/prometheus:v2.26.0
37        ports:
38        - name: http
39          containerPort: 9090
40        securityContext:
41          runAsUser: 65534
42          privileged: true
43        command:
44        - "/bin/prometheus"
45        args:
46        - "--config.file=/etc/prometheus/prometheus.yml"
47        - "--web.enable-lifecycle"
48        - "--storage.tsdb.path=/prometheus"
49        - "--storage.tsdb.retention.time=10d"
50        - "--web.console.libraries=/etc/prometheus/console_libraries"
51        - "--web.console.templates=/etc/prometheus/consoles"
52        resources:
53          limits:
54            cpu: 2000m
55            memory: 1024Mi
56          requests:
57            cpu: 1000m
58            memory: 512Mi
59        readinessProbe:
60          httpGet:
61            path: /-/ready
62            port: 9090
63          initialDelaySeconds: 5
64          timeoutSeconds: 10
65        livenessProbe:
66          httpGet:
67            path: /-/healthy
68            port: 9090
69          initialDelaySeconds: 30
70          timeoutSeconds: 30
71        volumeMounts:
72        - name: data
73          mountPath: /prometheus
74          subPath: prometheus
75        - name: config
76          mountPath: /etc/prometheus
77      - name: configmap-reload
78        image: jimmidyson/configmap-reload:v0.5.0
79        args:
80        - "--volume-dir=/etc/config"
81        - "--webhook-url=http://localhost:9090/-/reload"
82        resources:
83          limits:
84            cpu: 100m
85            memory: 100Mi
86          requests:
87            cpu: 10m
88            memory: 10Mi
89        volumeMounts:
90        - name: config
91          mountPath: /etc/config
92          readOnly: true
93      volumes:
94      - name: data
95        persistentVolumeClaim:
96          claimName: prometheus
97      - name: config
98        configMap:
99          name: prometheus-config

上面部署的 Deployment 资源文件中的 containers 部分配置了两个容器,分别是:

  • prometheus: Prometheus 容器是主容器,用于运行 Prometheus 进程。
  • configmap-reload: 用于监听指定的 ConfigMap 文件中的内容,如果内容发生更改,则执行 webhook url 请求。因为 Prometheus 支持通过接口重新加载配置文件,所以这里使用这个容器提供的机制来完成 Prometheus ConfigMap 配置文件内容一有更改,就执行 Prometheus 的 /-/reload 接口,进行更新配置操作。

上面资源文件中 Prometheus 参数说明:

  • --web.enable-lifecycle: 启用 Prometheus 用于重新加载配置的 /-/reload 接口。
  • --config.file: 指定 Prometheus 配置文件所在地址,这个地址是相对于容器内部而言的。
  • --storage.tsdb.path: 指定 Prometheus 数据存储目录地址,这个地址是相对于容器而言的。
  • --storage.tsdb.retention.time: 指定删除旧数据的时间。默认为 15d
  • --web.console.libraries: 指定控制台组件依赖的存储路径。
  • --web.console.templates: 指定控制台模板的存储路径。

Prometheus 应用部署到 Kubernetes 中,执行的命令如下:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-deploy.yaml -n kube-system

访问 Prometheus UI 界面

上面在部署 Prometheus 中设置其 Service 模式为 NodePort 模式,端口号为 30900,所以我们可以使用 NodePort 的端口访问 Prometheus。这里本人的 Kubernetes 集群中的其中一个地址为 192.168.2.31,所以我们可以输入地址 http://192.168.2.31:30900 访问 Prometheus 页面。

Prometheus UI 界面

该 UI 页面就是 Prometheus 提供的看板,我们可以通过页面很方便的执行 PromQL 查询 Prometheus 中的时间序列数据。并且,还能够通过该页面查看 Prometheus 的 配置内容告警规则 等。更多的还需要多多操作自行摸索~

---END---

如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。