在 Kubernetes 集群的运维过程中,监控是非常重要的一个环节。通过监控,我们可以了解集群的运行状态、及时发现异常和问题。而 Prometheus 是目前比较常用的 Kubernetes 监控方案之一,它具有易用性和可扩展性,支持灵活的查询和告警机制,并可以和 Grafana 等其他工具配合使用,提供更丰富的数据可视化和分析能力。本文将详细介绍在 Kubernetes 上使用 Prometheus 进行监控的方案和方法,包括部署、配置、数据收集、查询和告警等方面。
1. 搭建 Prometheus
1.1 安装 Prometheus Operator
要在 Kubernetes 上使用 Prometheus,首先需要安装 Prometheus Operator。Prometheus Operator 是一个管理 Prometheus 实例和相关资源的 Kubernetes Operator,可以很方便地创建和管理 Prometheus、Alertmanager、Grafana 等资源。安装 Prometheus Operator 的方法有很多种,这里介绍使用 Helm 进行安装的方式。
首先添加 Prometheus Operator 的 Helm 仓库:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
然后更新本地仓库:
helm repo update
接着下载 Prometheus Operator Chart:
helm fetch prometheus-community/kube-prometheus-stack --untar
最后安装 Prometheus Operator:
-- -------------------- ---- ------- ---- ------- ------------------- ----------------------- - ----- --------------------------------------------- - ----- -------------------------- - ----- --------------------- - ----- --------------------------- - ----- --------------------- - ----- --------------------- - ----- --------------------- - ----- ----------------------
这里的参数意义如下:
prometheusOperator.createCustomResource=false
表示不创建 CustomResourceDefinitions,使用已有的 CustomResourceDefinitions。alertmanager.enabled=false
表示不安装 Alertmanager。grafana.enabled=false
表示不安装 Grafana。kubeApiServer.enabled=false
、kubelet.enabled=false
、coreDns.enabled=false
、kubeDns.enabled=false
、kubeEtcd.enabled=false
表示不监控 Kubernetes API Server、Kubelet、CoreDNS、KubeDNS、Etcd 等组件。
1.2 部署 Prometheus
安装好 Prometheus Operator 后,就可以通过定义 Prometheus 实例的 Custom Resource 来创建并部署 Prometheus。定义 Custom Resource 的 YAML 文件内容如下:
-- -------------------- ---- ------- ----------- ------------------------ ----- ---------- --------- ----- ---------- ------- ---- ---------- ----- --------- - ------------------- -------------- ----------------------- ------------ ---- ---------- ------------- ------------ ---- ---------- ------------ ------- ---- ---------- ---------- -- ---------- --------- ------- ----- ------- ------- -----
其中 spec
字段的含义如下:
replicas
表示 Prometheus 实例的副本数。serviceAccountName
表示 Prometheus 实例所使用的 ServiceAccount 名称。serviceMonitorSelector
表示 Prometheus 实例所要监控的所有 ServiceMonitor 的选择器,这里选择标签为app: prometheus
的 ServiceMonitor。ruleSelector
表示 Prometheus 实例所要加载的所有 RuleGroup 的选择器,这里选择标签为app: prometheus
的 RuleGroup。podMetadata
表示 Prometheus 实例所在 Pod 的标签。retention
表示 Prometheus 保存数据的保留时间,这里为 7 天。resources
表示 Prometheus 实例使用的资源配额,这里分别设置了请求和限制的内存值。
将定义好的 YAML 文件保存为 prometheus.yaml
,然后执行以下命令进行部署:
kubectl apply -f prometheus.yaml
部署成功后,可以通过以下命令查看 Prometheus 部署情况:
kubectl get prometheus
2. 配置数据收集
部署完成 Prometheus 后,还需要配置数据收集,即指定需要收集和监控的应用程序和服务。数据收集有两种方式:通过监控 Kubernetes 自身的指标和监控应用程序和服务的指标。下面分别介绍这两种方式的具体配置方法。
2.1 监控 Kubernetes 指标
Prometheus 提供了一组数据收集工具,名为 kube-state-metrics
,可用来收集 Kubernetes 的各种组件和资源的度量值。使用 Prometheus Operator,安装 kube-state-metrics
也非常简便。只需在 Prometheus 实例所在的命名空间中创建一个 ServiceMonitor
资源,定义如下:
-- -------------------- ---- ------- ----------- ------------------------ ----- -------------- --------- ----- ------------------ ------- ---- ---------- ----- --------- ------------ ---- ------------------ ---------- - ----- -------
将上面的 YAML 文件保存为 kube-state-metrics.yaml
,执行以下命令进行部署:
kubectl apply -f kube-state-metrics.yaml
部署成功后,Prometheus 就可以自动收集 Kubernetes 的指标数据了。
2.2 监控应用程序和服务指标
要收集应用程序和服务的指标,一般需要在应用程序中集成 Prometheus 客户端库,然后将相关指标暴露出来。在 Kubernetes 中,使用 Prometheus Operator
可以方便地创建 ServiceMonitor
资源,以指定需要监控的应用程序和服务。
下面以 Spring Boot 应用程序为例,演示如何在 Kubernetes 中配置 Spring Boot 应用程序的监控。假设我们已经在应用程序中使用 Spring Boot Actuator 和 spring-boot-starter-actuator
Starter 包,且已经在 application.properties
文件中配置开启了 Actuator 端点 /actuator/prometheus
,并暴露了几个自定义指标:
management.endpoints.web.exposure.include=* management.endpoint.prometheus.enabled=true myapp.orders.processing.time.seconds.count=0 myapp.orders.processing.time.seconds.sum=0 myapp.orders.waiting.time.seconds.count=0 myapp.orders.waiting.time.seconds.sum=0
在应用程序所在的命名空间中,创建一个如下的 ServiceMonitor
资源,指定需要监控的应用程序标签、端口和路径:
-- -------------------- ---- ------- ----------- ------------------------ ----- -------------- --------- ----- ----- ------- ---- ---------- ----- --------- ------------ ---- ----- ---------- - ----- ---- ----- --------------------
将上面的 YAML 文件保存为 myapp.yaml
,执行以下命令进行部署:
kubectl apply -f myapp.yaml
部署成功后,Prometheus 就可以收集到应用程序的指标数据了。
3. 使用 Prometheus 查询和告警
部署好 Prometheus 并配置了数据收集后,我们就可以使用 Prometheus 进行查询和告警了。
3.1 查询指标数据
Prometheus 提供了一种类似 SQL 的查询语言 PromQL,可以用来查询和聚合指标数据。下面是几个常用的查询示例:
查询 CPU 使用率(包括所有节点):
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
查询内存使用量(包括所有节点):
sum(node_memory_RSS_bytes) by (instance) / 1024 / 1024
查询 HTTP 请求数量(包括所有应用):
sum(rate(http_requests_total{job="myapp"}[5m]))
查询 HTTP 请求 2xx、3xx、4xx、5xx 的响应状态码数量(包括所有应用):
sum by (code) (rate(http_responses_total{job="myapp"}[5m]))
查询自定义指标 myapp_orders_processing_time_seconds_count(包括所有应用):
myapp_orders_processing_time_seconds_count
更多查询语法和函数,请参考官方文档:https://prometheus.io/docs/prometheus/latest/querying/basics/
3.2 设置告警规则
除了查询和分析指标数据外,Prometheus 还可以设置告警规则,以便在指标数据超过一定阈值时自动触发告警。Prometheus 告警规则使用 PrometheusRule
资源定义,如下所示:
-- -------------------- ---- ------- ----------- ------------------------ ----- -------------- --------- ----- ----------- ------- ---- ---------- ----- ------- - ----- ----------- ------ - ------ ----------- ----- ---------------------------------------- - ------------------------------------------ - --- ---- -- ------- --------- ------- ------------ -------- ----- ------- --------
上面的 YAML 配置定义了一个名为 HighLatency
的告警规则,表示当商户订单处理的平均时间超过 100 秒时,触发告警,并持续 5 分钟。告警规则的定义可以使用 PromQL 表达式,表达式计算结果为 true
时,表示告警触发。
将上面的 YAML 文件保存为 myapp.rules.yaml
,执行以下命令进行部署:
kubectl apply -f myapp.rules.yaml
部署成功后,Prometheus 就可以自动检测指标数据是否符合告警规则,并在规则触发时发送告警通知。
4. 总结
本文介绍了在 Kubernetes 上使用 Prometheus 进行监控的方案和方法,包括部署、配置、数据收集、查询和告警等方面。使用 Prometheus 和 Prometheus Operator,可以在 Kubernetes 集群中方便地实现可扩展的监控和告警功能,大大简化了运维工作的难度。这里提供了一个基本的入门示例,读者可以根据实际需要,灵活应用 Prometheus 的各种功能和 API,满足自己的监控和告警需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e1afaaf6b2d6eab3ce13de