简介:本文详细解析Prometheus监控K8s集群的核心机制,涵盖服务发现、指标采集、告警规则设计及可视化实践,提供可落地的部署方案与优化建议。
Kubernetes(K8s)的动态性(Pod频繁扩缩容、服务自动发现)对传统监控工具提出挑战。Prometheus凭借其服务发现机制、Pull-based拉取模型和多维数据模型,成为K8s监控的首选方案。其关键优势包括:
kubernetes_sd_config自动发现Endpoints、Pod、Service等资源。Prometheus通过scrape_configs中的kubernetes_sd_roles实现四类资源发现:
scrape_configs:- job_name: 'kubernetes-pods'kubernetes_sd_configs:- role: podrelabel_configs:# 筛选包含prometheus.io/scrape=true注解的Pod- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]action: keepregex: true
pod、service、endpoints、ingress,覆盖K8s核心资源。__meta_kubernetes_*元标签过滤目标,例如仅监控带有prometheus.io/port=9100注解的Pod端口。/metrics/cadvisor端点暴露容器资源使用数据。Prometheus的指标格式为<metric_name>{label_name=label_value,...},例如:
container_cpu_usage_seconds_total{container="nginx",pod="web-7d8f6b9c"} 1250.34
namespace、pod、container,用于区分K8s资源。service、version,支持按服务维度聚合分析。使用Helm Chart快速部署:
helm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm install prometheus prometheus-community/prometheus \--set server.retention=15d \--set server.service.type=NodePort
--set server.retention设置数据保留周期,--set server.persistentVolume.size配置存储大小。
kubectl apply -f https://github.com/kubernetes/kube-state-metrics/releases/download/v2.8.1/kube-state-metrics.yaml
http://<kube-state-metrics-ip>:8080/metrics,检查是否存在kube_deployment_status_replicas等指标。在Prometheus的configmap中定义动态采集规则:
apiVersion: v1kind: ConfigMapmetadata:name: prometheus-configdata:prometheus.yml: |scrape_configs:- job_name: 'kubernetes-service-endpoints'kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_namespace]target_label: namespace- source_labels: [__meta_kubernetes_service_name]target_label: service
namespace和service标签。在prometheus-rules.yaml中定义告警规则:
groups:- name: k8s-alertsrules:- alert: HighPodRestartRateexpr: rate(kube_pod_container_status_restarts_total[5m]) > 0.1for: 10mlabels:severity: criticalannotations:summary: "Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} has high restart rate"
expr:基于PromQL定义触发条件。for:持续满足条件的时间阈值。labels:附加标签(如severity)用于告警分级。3119(Node资源)、12839(Pod状态)。http_requests_total等业务指标。${__interval}动态调整查询范围,例如:
rate(http_requests_total{service="$service"}[${__interval}])
配置alertmanager.yml实现多渠道通知:
route:receiver: 'email'group_by: ['alertname', 'namespace']routes:- match:severity: criticalreceiver: 'slack'receivers:- name: 'slack'slack_configs:- api_url: https://hooks.slack.com/services/...channel: '#k8s-alerts'
alertname和namespace聚合告警,避免信息过载。container_cpu_usage)设置scrape_interval: 15s,低频指标设为1m。kube-state-metrics日志:kubectl logs -f kube-state-metrics-<pod>。curl http://prometheus:9090/-/ready。kubectl get pod <pod-name> -o yaml | grep prometheus.io/scrape。以Java应用为例,通过Micrometer库暴露指标:
@Beanpublic MeterRegistry meterRegistry() {return new PrometheusMeterRegistry();}@GetMapping("/metrics")public String metrics() {return meterRegistry.scrape();}
prometheus.io/scrape: "true"和prometheus.io/port: "8080"。结合K8s HPA(水平自动扩缩容)数据,动态调整告警阈值:
# 当Pod副本数增加时,放宽CPU使用率告警阈值(rate(container_cpu_usage_seconds_total[5m]) /on(pod) group_left()(kube_pod_status_phase{phase="Running"} == 1)) >(0.8 * scalar(max(kube_deployment_spec_replicas) / 10))
env=prod),避免后期数据混乱。通过以上方案,Prometheus可实现K8s集群从基础设施到业务应用的全方位监控,为稳定性保障提供数据支撑。