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。
apiVersion: v1kind: ServiceAccountmetadata: name: prometheus namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: prometheusrules:- apiGroups: [""] resources: ["nodes","nodes/proxy","services","endpoints","pods"] verbs: ["get", "list", "watch"]- apiGroups: ["extensions"] resources: ["ingress"] verbs: ["get", "list", "watch"]- nonResourceURLs: ["/metrics"] verbs: ["get"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: prometheusroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects:- kind: ServiceAccount name: prometheus namespace: kube-system将 RBAC 文件部署到 Kubernetes 中,执行的命令如下:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
$ kubectl apply -f prometheus-rbac.yaml -n kube-systemKubernetes 部署 Prometheus 存储
创建用于 Prometheus 存储的 PV、PVC 资源文件 prometheus-storage.yaml,内容如下:
这里使用的是 NFS 方式的 PV,需要存在 NFS Server 端才行,如果使用其它存储,请自行按照对应的存储方式进行配置 PV 参数,并且还需要注意配置文件夹的读写权限。
apiVersion: v1kind: PersistentVolumemetadata: name: prometheus labels: k8s-app: prometheusspec: capacity: storage: 50Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: nfs-storage ## 指定 StorageClass,PVC 中设置的该名称要和这里保持一致 mountOptions: - hard - nfsvers=4.1 ## 指定 NFS 版本 nfs: server: 192.168.2.11 ## NFS 服务器的地址 path: /nfs/prometheus ## NFS 数据存储目录---kind: PersistentVolumeClaimapiVersion: v1metadata: name: prometheus labels: k8s-app: prometheusspec: accessModes: - ReadWriteOnce storageClassName: nfs-storage ## 指定 StorageClass resources: requests: storage: 50Gi selector: matchLabels: k8s-app: prometheus将存储相关资源文件部署到 Kubernetes 的中,执行的命令如下:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
$ kubectl apply -f prometheus-storage.yaml -n kube-systemKubernetes 创建 Prometheus 配置
Prometheus 配置文件是一个我们经常改动的文件,比较推荐将该配置文件内容存储到 Kubernetes 的 ConfigMap 中,方便我们进行更改配置内容。
创建 Prometheus 配置文件 prometheus-config.yaml,内如如下:
apiVersion: v1kind: ConfigMapmetadata: name: prometheus-configdata: prometheus.yml: | global: scrape_interval: 15s evaluation_interval: 15s external_labels: cluster: "kubernetes"
scrape_configs: - job_name: prometheus static_configs: - targets: ['127.0.0.1:9090'] labels: instance: prometheus将配置资源文件部署到 Kubernetes 的资源中,执行的命令如下:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
$ kubectl apply -f prometheus-config.yaml -n kube-systemKubernetes 部署 Prometheus
创建 Prometheus 部署文件 prometheus-deploy.yaml,内如如下:
apiVersion: v1kind: Servicemetadata: name: prometheus labels: k8s-app: prometheusspec: type: NodePort ports: - name: http port: 9090 targetPort: 9090 nodePort: 30900 selector: k8s-app: prometheus---apiVersion: apps/v1kind: Deploymentmetadata: name: prometheus labels: k8s-app: prometheusspec: replicas: 1 selector: matchLabels: k8s-app: prometheus template: metadata: labels: k8s-app: prometheus spec: serviceAccountName: prometheus containers: - name: prometheus image: prom/prometheus:v2.26.0 ports: - name: http containerPort: 9090 securityContext: runAsUser: 65534 privileged: true command: - "/bin/prometheus" args: - "--config.file=/etc/prometheus/prometheus.yml" - "--web.enable-lifecycle" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=10d" - "--web.console.libraries=/etc/prometheus/console_libraries" - "--web.console.templates=/etc/prometheus/consoles" resources: limits: cpu: 2000m memory: 1024Mi requests: cpu: 1000m memory: 512Mi readinessProbe: httpGet: path: /-/ready port: 9090 initialDelaySeconds: 5 timeoutSeconds: 10 livenessProbe: httpGet: path: /-/healthy port: 9090 initialDelaySeconds: 30 timeoutSeconds: 30 volumeMounts: - name: data mountPath: /prometheus subPath: prometheus - name: config mountPath: /etc/prometheus - name: configmap-reload image: jimmidyson/configmap-reload:v0.5.0 args: - "--volume-dir=/etc/config" - "--webhook-url=http://localhost:9090/-/reload" resources: limits: cpu: 100m memory: 100Mi requests: cpu: 10m memory: 10Mi volumeMounts: - name: config mountPath: /etc/config readOnly: true volumes: - name: data persistentVolumeClaim: claimName: prometheus - name: config configMap: name: prometheus-config上面部署的 Deployment 资源文件中的 containers 部分配置了两个容器,分别是:
- prometheus: Prometheus 容器是主容器,用于运行 Prometheus 进程。
- configmap-reload: 用于监听指定的
ConfigMap文件中的内容,如果内容发生更改,则执行webhook url请求。因为 Prometheus 支持通过接口重新加载配置文件,所以这里使用这个容器提供的机制来完成PrometheusConfigMap配置文件内容一有更改,就执行 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 名称。
$ 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 点颗星哦
感谢
