Prometheus 监控 Kubernetes

Prometheus 是一个开源的系统监控和警报工具集,用于记录实时指标数据和生成警报。它广泛应用于云原生环境中,尤其是在 Kubernetes 集群中。本文将介绍如何使用 Prometheus 来监控 Kubernetes 集群,并提供相关的代码示例。

什么是 Prometheus?

Prometheus 是一个基于时间序列的监控系统,最初由 SoundCloud 在 2012 年开发,现已成为 CNCF(Cloud Native Computing Foundation)的毕业项目之一。它采用了多维数据模型,支持通过 PromQL(Prometheus Query Language)查询和分析指标数据。

Prometheus 主要有以下特点:

  • 多维数据模型:指标数据由键值对标识,可以根据多个维度进行查询和聚合。
  • 灵活的查询语言:PromQL 提供了强大的查询语言,支持常见的聚合、过滤和计算操作。
  • 可视化和警报:Prometheus 提供了内置的仪表盘和警报功能,方便用户监控和管理指标数据。
  • 可扩展性:Prometheus 支持通过服务发现、自动发现和动态配置等机制来实现自动化的监控。

Prometheus 监控 Kubernetes

在 Kubernetes 集群中,Prometheus 可以通过以下步骤来监控各个组件的指标数据:

  1. 部署 Prometheus:首先需要在 Kubernetes 集群中部署 Prometheus。可以使用 Helm Chart 来简化部署过程。以下是一个示例的 Helm Chart 配置文件:
apiVersion: v2
name: prometheus
namespace: monitoring
spec:
  replicas: 1
  serviceAccountName: prometheus
  securityContext:
    runAsUser: 1000
  resources:
    requests:
      memory: 400Mi
      cpu: 200m
    limits:
      memory: 800Mi
      cpu: 400m
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: app
                  operator: In
                  values:
                    - prometheus
            topologyKey: kubernetes.io/hostname
  service:
    annotations:
      prometheus.io/scrape: "true"
      prometheus.io/port: "9090"
    type: NodePort
    ports:
      - name: web
        port: 9090
        targetPort: 9090
        nodePort: 30000
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: "nginx"
    hosts:
      - prometheus.example.com
    tls:
      - secretName: prometheus-tls
        hosts:
          - prometheus.example.com
  1. 配置 Prometheus 监控目标:Prometheus 需要知道要监控的目标,例如 Kubernetes 的 API Server、kubelet、kube-proxy 等。可以通过配置 prometheus.yml 文件来定义监控目标。以下是一个示例的 prometheus.yml 文件:
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'kubernetes-apiservers'
    scheme: https
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    kubernetes_sd_configs:
      - role: endpoints
        api_server: 
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https
  1. 部署监控 Exporter:Prometheus 需要通过 Exporter 来获取各个组件的指标数据。Kubernetes 提供了一些官方的 Exporter,例如 kube-state-metrics、node-exporter 等。可以使用 Helm Chart 来部署这些 Exporter。以下是一个示例的 kube-state-metrics 的 Helm Chart 配置文件:
apiVersion: v2
name: kube-state-metrics
namespace: monitoring