Kubernetes 部署监控工具 Prometheus
文章目录
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。
系统环境:
- Kubernetes 版本: 1.20.2
- Docker 版本: 19.03.13
- 操作系统: CentOS 7.9
- Prometheus 版本: 2.26.0
参考地址:
示例地址:
系列文章目录
- 01. Kubernetes 部署监控工具 Prometheus
- 02. Kubernetes 部署图表工具 Grafana
- 03. Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点
- 04. Prometheus 结合 StateMetrics+cAdvisor 监控 Kubernetes 集群服务
- 05. Prometheus 监听指定标签 Kubernetes 服务
- 06. Prometheus 监控 Kubernetes ETCD 集群
- 07. Prometheus Exporter 黑盒监控 Kubernetes 服务
- 08. Kubernetes 部署告警工具 AlertManager
- 09. AlertManager 配置邮箱告警
- 其它章节整理中...
一、Prometheus 简介
下面的说明内容大部分来自于官网,本人感觉官网的概述还是比较清晰的。
Prometheus 是什么
Prometheus 是在 SoundCloud 上构建并开源的系统监视和警报工具包。自 2012 年成立以来,许多公司和组织都采用 Prometheus,该项目拥有非常活跃的开发人员和用户社区。不过它现在已经成为一个独立的开源项目,并且独立于任何公司进行维护。为了强调这一点并澄清项目的治理结构,Prometheus 于 2016 年加入了云原生计算基金会,成为继 Kubernetes 之后的第二个毕业项目。
Prometheus 特征
Prometheus 主要特征如下:
- 多维数据模型(时序列数据由
metric
名和一组key/value
组成)。 - 提供
PromQL
,这是一种灵活的查询语言,可以利用多维数据完成复杂的查询。 - 不依赖
分布式存储
,支持服务器本地存储
。 - 基于
HTTP
的Pull
方式采集时间序列数据。 - 通过
PushGateway
可以支持Push
模式推送时间序列
。 - 可以通过
动态服务发现
或静态配置
等方式发现目标对象。 - 多种可视化和仪表盘支持。
Prometheus 组成
Prometheus 生态系统包含多个组件,其中许多是可选的:
- Prometheus 主服务器: 用于抓取指标、存储时间序列数据。
- Client libraries: 用于检测应用程序代码。
- PushGateway: 支持短期工作的推送网关。
- Alertmanager: 用于处理报警的组件。
- 支持 HAProxy、StatsD、Graphite 等服务的特殊用途出口商。
- ......(其它工具)
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
存储的 PV
、PVC
资源文件 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 页面。
该 UI 页面就是 Prometheus 提供的看板,我们可以通过页面很方便的执行 PromQL
查询 Prometheus 中的时间序列数据。并且,还能够通过该页面查看 Prometheus 的 配置内容
与 告警规则
等。更多的还需要多多操作自行摸索~
---END---
如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。