简介:本文详细解析Prometheus如何通过核心组件、数据采集策略与告警规则,实现K8s集群资源、Pod、节点及自定义指标的全面监控,并提供实战配置示例与优化建议。
Prometheus通过ServiceMonitor和PodMonitor两种CRD(Custom Resource Definition)实现K8s资源的动态发现。ServiceMonitor通过标签选择器匹配Service后端Pod的Endpoint,自动抓取指标;而PodMonitor直接针对Pod的端口进行监控,适用于无Service的场景。例如,监控Nginx Ingress的7999端口指标时,可通过以下PodMonitor配置实现:
apiVersion: monitoring.coreos.com/v1kind: PodMonitormetadata:name: nginx-ingress-monitorspec:selector:matchLabels:app.kubernetes.io/name: ingress-nginxpodMetricsEndpoints:- port: metricsinterval: 30spath: /metrics
此配置会持续抓取所有带有app.kubernetes.io/name=ingress-nginx标签的Pod的7999端口指标。
节点监控依赖Node Exporter,其以DaemonSet形式部署,确保每个节点运行一个实例。通过hostNetwork: true和hostPID: true配置,可访问节点级资源(如CPU、内存、磁盘)。关键配置包括:
resources.limits.cpu=100m。/proc/kallsyms),通过--no-collector参数过滤。/host路径至Exporter容器。K8s的kubelet内置cAdvisor,提供容器级资源指标(CPU、内存、网络)。Prometheus通过/metrics/cadvisor端点直接抓取,但需注意:
scrape_configs中配置tls_config和bearer_token。relabel_configs将K8s元数据(如Pod名称、命名空间)转换为Prometheus标签,便于多维度查询。Prometheus Operator通过CRD简化监控配置,主要组件包括:
PodMonitor:动态发现监控目标。
helm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm install prometheus-operator prometheus-community/kube-prometheus-stack
AdditionalScrapeConfigs注入自定义scrape_configs,例如监控MySQL:
prometheus:prometheusSpec:additionalScrapeConfigs:- job_name: mysqlstatic_configs:- targets: ['mysql-service:9104']
告警规则需遵循“SMART原则”(具体、可衡量、可实现、相关性、时限性)。例如,监控Pod重启次数的规则:
groups:- name: pod-alertsrules:- alert: HighPodRestartsexpr: increase(kube_pod_container_status_restarts_total{namespace="prod"}[1h]) > 3for: 5mlabels:severity: criticalannotations:summary: "Pod {{ $labels.pod }} in {{ $labels.namespace }} restarted {{ $value }} times in 1h"
此规则会在1小时内Pod重启超过3次时触发告警,并通过Alertmanager发送至Slack或邮件。
Prometheus默认保留30天数据,但可通过storage.tsdb.retention.time调整。建议按指标重要性分类:
当数据量超过单机存储时,需集成远程存储:
配置示例(Thanos Sidecar):
apiVersion: apps/v1kind: Deploymentmetadata:name: prometheus-thanosspec:template:spec:containers:- name: prometheusargs:- --storage.tsdb.path=/prometheus- --web.enable-lifecycle- --web.enable-admin-api- name: thanos-sidecarimage: quay.io/thanos/thanos:v0.25.0args:- sidecar- --prometheus.url=http://localhost:9090- --objstore.config-file=/etc/thanos/storage.yaml
现象:Prometheus日志显示context deadline exceeded。
原因:网络策略限制、Endpoint未就绪或证书过期。
解决:
NetworkPolicy是否允许Prometheus访问目标Pod。ready状态:kubectl get endpoints <service-name>。现象:查询kube_pod_status_phase无数据。
原因:标签不匹配或Exporter未暴露指标。
解决:
promtool检查指标是否存在:
curl http://<pod-ip>:9100/metrics | grep kube_pod_status_phase
relabel_configs修正标签:
relabel_configs:- source_labels: [__meta_kubernetes_pod_name]target_label: pod_name
通过Prometheus Adapter将自定义指标暴露为HPA可用的资源:
apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata:name: podmonitors.monitoring.coreos.comspec:group: monitoring.coreos.comversions:- name: v1served: truestorage: true
示例:根据Redis内存使用率自动扩容:
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:name: redis-hpaspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: redismetrics:- type: Externalexternal:metric:name: redis_memory_used_bytesselector:matchLabels:app: redistarget:type: AverageValueaverageValue: 500Mi
namespace、pod、container等标签,便于跨维度查询。inhibit_rules抑制重复告警,例如同一节点的多个Pod崩溃时仅触发一次节点级告警。container_cpu_usage_seconds_total)设置__rate_interval__参数,减少计算开销。通过以上策略,Prometheus可实现K8s集群的全面、高效监控,为运维和开发提供实时洞察与自动化决策支持。