使用 Prometheus Operator + kube-prometheus 监控 k8s
Prometheus Operator 介绍
Prometheus Operator 使用 Kubernetes 自定义资源 来简化 Prometheus、Alertmanager 和相关监控组件的部署与配置。
前提条件
Prometheus Operator 需要 Kubernetes 版本至少为 1.16.0。如果您刚开始使用 Prometheus Operator,强烈建议使用最新的 稳定版本。
Prometheus Operator 支持的 kubernetes 版本
自定义资源定义 (CustomResourceDefinitions)
Prometheus Operator 的一个核心特性是监控 Kubernetes API 服务器中特定对象的变化,并确保当前的 Prometheus 部署与这些对象相匹配。
Operator 作用于以下 自定义资源定义 (CRDs):
Prometheus,定义所需的 Prometheus 部署。
PrometheusAgent,定义所需的 Prometheus 部署,但在 Agent 模式下运行。
Alertmanager,定义所需的 Alertmanager 部署。
ThanosRuler,定义所需的 Thanos Ruler 部署。
ServiceMonitor,声明式地指定应如何监控 Kubernetes 服务组。
Operator 会根据 API 服务器中对象的当前状态自动生成 Prometheus 抓取配置。
PodMonitor,声明式地指定应如何监控 Pod 组。
Operator 会根据 API 服务器中对象的当前状态自动生成 Prometheus 抓取配置。
Probe,声明式地指定应如何监控 Ingress 组或静态目标。Operator 会根据定义自动生成 Prometheus 抓取配置。
ScrapeConfig,声明式地指定要添加到 Prometheus 的抓取配置。此自定义资源定义有助于抓取 Kubernetes 集群外部的资源。
PrometheusRule,定义所需的一组 Prometheus 告警和/或记录规则。
Operator 会生成一个规则文件,供 Prometheus 实例使用。
AlertmanagerConfig,声明式地指定 Alertmanager 配置的子部分,允许将告警路由到自定义接收器,并设置抑制规则。
Prometheus Operator 会自动检测 Kubernetes API 服务器中上述任何对象的更改,并确保匹配的部署和配置保持同步。
要了解更多关于 Prometheus Operator 引入的 CRD 的信息,请查看 设计 页面。
动态准入控制
为了防止无效的 Prometheus 告警和记录规则导致已部署的 Prometheus 实例故障,提供了一个 准入 Webhook 来在 PrometheusRule 资源初始创建或更新时对其进行验证。
有关此功能的更多信息,请参阅 用户指南。
kube-prometheus 介绍
kube-prometheus 提供了基于 Prometheus 和 Prometheus Operator 的完整集群监控栈的示例配置。这包括部署多个 Prometheus 和 Alertmanager 实例、用于收集节点指标的指标导出器(如 node_exporter)、连接 Prometheus 与各种指标端点的抓取目标配置,以及用于通知集群潜在问题的示例告警规则。
kube-prometheus 收集了 Kubernetes 清单 (Manifests)、Grafana 仪表板以及 Prometheus 规则,并结合文档和脚本,旨在通过 Prometheus Operator 使用 Prometheus 提供易于操作的端到端 Kubernetes 集群监控。
本项目的内容是使用 jsonnet 编写的。本项目既可以被描述为一个软件包,也可以被描述为一个库。
包含的组件:
该技术栈专为集群监控而设计,因此它经过预配置,可从所有 Kubernetes 组件收集指标。此外,它还提供了一套默认的仪表板和告警规则。许多有用的仪表板和告警来自 kubernetes-mixin 项目,与本项目类似,它提供可组合的 jsonnet 作为库,供用户根据需求进行自定义。
Helm chart
prometheus-community/kube-prometheus-stack Helm chart 提供了与 kube-prometheus 类似的功能集。该 chart 由 Prometheus 社区维护。
如需更多信息,请参阅 chart 的自述文件。
kube-prometheus 部署
git clone https://github.com/prometheus-operator/kube-prometheus
cd kube-prometheus
# 替换相关镜像
- manifests/kubeStateMetrics-deployment.yaml
- manifests/prometheusAdapter-deployment.yaml
# 修改为 NodePort
- manifests/grafana-service.yaml
- manifests/prometheus-service.yaml
- manifests/alertmanager-service.yaml
kubectl apply --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
kubectl apply -f manifests/
使用
ServiceMonitor
apiVersion: v1
kind: Service
metadata:
name: prometheus-metrics-demo
namespace: default
labels:
micrometer-prometheus-discovery: 'true'
spec:
selector:
app: demo-prometheus
ports:
- protocol: TCP
port: 8080
targetPort: 8080
name: metrics
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: micrometer-demo
namespace: default
spec:
endpoints:
- interval: 15s
path: /actuator/prometheus
port: metrics #注意:这里port配置的是端口名,并非端口号。
namespaceSelector:
any: true
selector:
matchLabels:
micrometer-prometheus-discovery: 'true'