云原生监控实战:Prometheus在Kubernetes与Serverless环境的最佳实践

一、Kubernetes监控深度解析

1.1 Service Discovery配置

Prometheus通过kubernetes_sd_configs实现Kubernetes服务的自动发现,这是云原生监控的核心机制。以下是典型配置示例:

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
    - role: pod
    relabel_configs:
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
      action: keep
      regex: true
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
      target_label: __metrics_path__
      regex: (.+)
    - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
      target_label: __address__

关键角色(role)类型

  • node: 发现集群节点
  • pod: 发现所有Pod
  • service: 发现Service端点
  • endpoints: 发现Service背后的Pod
  • ingress: 发现Ingress规则

1.2 监控不同工作负载的最佳实践

Pod监控

图1

实践建议

  1. 通过Pod Annotations控制监控行为:

    annotations:
      prometheus.io/scrape: "true"
      prometheus.io/port: "8080"
      prometheus.io/path: "/actuator/prometheus"
  2. 使用relabel_configs过滤系统Pod:

    - source_labels: [__meta_kubernetes_namespace]
      regex: kube-system
      action: drop

Deployment/StatefulSet监控

推荐方案

  1. 部署kube-state-metrics暴露资源状态

    helm install kube-state-metrics prometheus-community/kube-state-metrics
  2. 关键指标示例:

    # Deployment副本可用率
    sum(kube_deployment_status_replicas_available{deployment="my-app"}) 
    / 
    sum(kube_deployment_status_replicas{deployment="my-app"})

二、Serverless场景适配

2.1 短期任务监控方案

图2

典型实现代码(Python Lambda)

from prometheus_client import CollectorRegistry, Gauge, push_to_gateway

def lambda_handler(event, context):
    registry = CollectorRegistry()
    duration = Gauge('job_duration_seconds', 'Lambda execution time', 
                    registry=registry)
    
    with duration.time():
        # 业务逻辑
        process_event(event)
    
    push_to_gateway('pushgateway:9091', 
                   job='aws_lambda', 
                   registry=registry)

配置要点

scrape_configs:
  - job_name: 'pushgateway'
    honor_labels: true  # 保留job标签
    static_configs:
      - targets: ['pushgateway:9091']

2.2 最佳实践建议

  1. 标签设计原则

    • 避免高基数标签(如request_id)
    • 固定维度标签示例:

      Gauge('function_calls_total', 'Total calls',
            ['function_name', 'region'], registry=registry)
  2. 生命周期管理

    # 清理过期指标
    curl -X DELETE http://pushgateway:9091/metrics/job/some_job
  3. Serverless架构扩展方案

    • 方案对比表:
方案适用场景优缺点
Pushgateway批量任务、Lambda简单易用,需维护网关
OpenTelemetry Collector混合架构功能强大,复杂度高
直接导出到托管服务AWS/Azure环境厂商锁定,成本较高

三、性能优化关键策略

  1. Kubernetes监控优化

    # 调整抓取间隔
    scrape_interval: 60s
    scrape_timeout: 55s
    
    # 限制Series数量
    metric_relabel_configs:
    - source_labels: [__name__]
      regex: '(expensive_metric_.*)'
      action: drop
  2. Pushgateway优化

    # 启动参数限制内存
    --web.listen-address=:9091
    --persistence.file=/data/metrics.store
    --persistence.interval=5m

四、常见问题排查

问题1:Kubernetes Pod未被发现

  • 检查项:

    kubectl get pods -o yaml | grep prometheus.io/scrape
    kubectl get endpoints -n monitoring

问题2:Pushgateway数据不更新

  • 诊断命令:

    curl http://pushgateway:9091/metrics | grep job_name

问题3:高基数导致内存溢出

  • 解决方案:

     # prometheus.yml
     storage:
       tsdb:
         max_samples_per_send: 5000
         out_of_order_time_window: 10m

总结

云原生环境下的Prometheus监控需要根据基础设施特性进行针对性设计。在Kubernetes中充分利用自动发现机制,在Serverless场景合理使用Pushgateway中转,同时注意监控系统自身的可观测性。建议:

  1. 生产环境使用Prometheus Operator简化K8s监控管理
  2. 对短期任务监控实施TTL机制
  3. 定期审查指标基数和标签维度
  4. 考虑采用Thanos等方案实现长期存储

通过本文介绍的模式和最佳实践,可以构建适应云原生动态特性的可靠监控体系。

添加新评论