基于Prometheus实现Kubernetes服务宕机告警方案咨询
Kubernetes内部服务宕机告警的PromQL方案(基于kube-prometheus-stack)
核心思路
Kubernetes的Service是虚拟转发对象,所谓"服务宕机"本质是后端无可用Endpoint(无就绪Pod绑定到该Service),或所有关联Endpoint无法提供服务。以下是针对不同场景的实用PromQL表达式:
场景1:Service无可用后端(最直接)
当Service关联的所有Pod都未就绪/不存在时触发告警:
kube_service_status_available == 0
说明:该指标来自kube-state-metrics(kube-prometheus-stack默认集成),值为1表示Service有至少一个就绪Endpoint,0则表示无可用后端。
场景2:Service后端Endpoint数量为0(排除ExternalName类型)
如果需要过滤掉本身无后端的ExternalName类型Service:
kube_service_spec_external_name == "" AND kube_service_status_selector_present == 1 AND kube_endpoint_addresses == 0
说明:
kube_service_spec_external_name == "":排除ExternalName类型服务kube_service_status_selector_present == 1:仅针对通过selector自动关联Pod的服务kube_endpoint_addresses:统计Service关联的Endpoint总数
场景3:Service后端Pod存在但全部未就绪
如果需要区分"Pod存在但未就绪"和"Pod完全不存在"的场景:
sum by (namespace, service) (kube_pod_status_ready{condition="true"} * on(pod, namespace) group_left(service) kube_pod_labels{label_app=~"$service_label"}) == 0
说明:将
$service_label替换为你服务使用的标签(如app或app.kubernetes.io/name),通过关联Pod标签与Service的selector,统计每个Service下就绪Pod的数量,为0则触发告警。
告警规则示例(适配kube-prometheus-stack)
在additionalPrometheusRules中添加如下规则:
groups: - name: kubernetes-service-alerts rules: - alert: ServiceUnavailable expr: kube_service_status_available == 0 for: 1m labels: severity: critical annotations: summary: "Service {{ $labels.namespace }}/{{ $labels.service }} 无可用后端" description: "Service {{ $labels.namespace }}/{{ $labels.service }} 关联的所有Endpoint均未就绪,请检查Pod状态或Service配置"
注意事项
- 确保kube-state-metrics正常运行(kube-prometheus-stack默认部署,可通过
kubectl get pods -n monitoring验证) - 对于手动创建Endpoint而非通过selector关联的Service,需调整表达式,直接监控
kube_endpoint_addresses指标 - 可根据业务需求调整
for的时长,避免短暂抖动触发误告警
内容的提问来源于stack exchange,提问作者Alexy Pulivelil
相关产品推荐
相关产品推荐

