云原生之k8s集成数据采集工具Prometheus

一、Prometheus 详细介绍

1. 核心概念
  • 时间序列数据:Prometheus 存储所有数据为时间序列(随时间变化的指标),每个数据点包含时间戳和数值。
  • 指标(Metric):具有名称和标签的多维数据模型,例如 http_requests_total{method="GET", status="200"}
  • 拉取模型(Pull-based):Prometheus 主动从配置的目标(如 HTTP 端点)拉取指标数据。
  • PromQL:强大的查询语言,支持聚合、筛选、数学运算等操作,用于分析指标数据。
2. 架构组件
  • Prometheus Server
    • 负责抓取(Scrape)和存储时间序列数据。
    • 内置时序数据库(TSDB),支持本地存储和远程写入(如 Thanos、InfluxDB)。
  • Exporters
    • 将第三方系统的指标转换为 Prometheus 兼容格式的工具(如 Node Exporter 监控主机指标)。
  • Pushgateway
    • 允许短生命周期任务(如批处理作业)将指标推送到中间网关,再由 Prometheus 拉取。
  • Alertmanager
    • 处理来自 Prometheus 的告警,进行去重、分组、静默,并路由到通知渠道(如邮件、Slack)。
  • Client Libraries
    • 支持多种编程语言(如 Go、Java、Python),用于在应用中直接暴露 Prometheus 指标。
3. 核心功能
  • 服务发现:自动发现监控目标(如 Kubernetes Pod、Service)。
  • 动态配置:通过 Reload API 或 Kubernetes ConfigMap 更新配置。
  • 告警规则:定义基于 PromQL 的告警条件(如 CPU 使用率超过 90%)。
  • 可视化:原生 Web UI 支持简单图表,通常与 Grafana 集成实现高级可视化。

云原生之k8s集成数据采集工具Prometheus_第1张图片


二、将 Prometheus 集成到 Kubernetes 集群

方法 1:使用 Helm 部署 Prometheus Stack

Helm 是 Kubernetes 的包管理工具,可快速部署包含 Prometheus、Alertmanager、Grafana 等的完整监控栈。

步骤 1:安装 Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
步骤 2:添加 Prometheus Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
步骤 3:安装 kube-prometheus-stack
helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace \
  --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
  • serviceMonitorSelectorNilUsesHelmValues=false:允许 Prometheus 发现所有 ServiceMonitor,不限于 Helm 管理的资源。
步骤 4:验证部署
kubectl get pods -n monitoring

应看到以下 Pod:

  • prometheus-prometheus-kube-prometheus-prometheus-*
  • alertmanager-prometheus-kube-prometheus-alertmanager-*
  • grafana-*
步骤 5:访问 Web 界面
  • Prometheus

    kubectl port-forward svc/prometheus-kube-prometheus-prometheus -n monitoring 9090:9090
    

    浏览器访问 http://localhost:9090

  • Grafana

    kubectl get secret -n monitoring prometheus-grafana -o jsonpath='{.data.admin-password}' | base64 -d
    kubectl port-forward svc/prometheus-grafana -n monitoring 3000:80
    

    访问 http://localhost:3000,使用用户名 admin 和上一步获取的密码登录。

方法 2:手动部署 Prometheus Operator

Prometheus Operator 简化了 Prometheus 在 Kubernetes 上的管理。

步骤 1:安装 Prometheus Operator
kubectl create namespace monitoring
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml
步骤 2:部署 Prometheus 实例

创建 prometheus.yaml

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
  namespace: monitoring
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector: {}
  resources:
    requests:
      memory: 400Mi
  enableAdminAPI: false

应用配置:

kubectl apply -f prometheus.yaml
步骤 3:部署 ServiceMonitor

示例 ServiceMonitor 用于监控 Kubernetes API:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-apiserver
  namespace: monitoring
spec:
  endpoints:
  - port: https
    scheme: https
    tlsConfig:
      insecureSkipVerify: true
  selector:
    matchLabels:
      component: apiserver

应用配置:

kubectl apply -f servicemonitor.yaml
步骤 4:配置持久化存储(可选)

修改 prometheus.yaml,添加持久化卷声明:

spec:
  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: standard
        resources:
          requests:
            storage: 50Gi
关键配置说明
  • 服务发现:通过 ServiceMonitorPodMonitor 自动发现监控目标。
  • RBAC:确保 ServiceAccount 具有访问 Kubernetes API 的权限。
  • 告警规则:通过 PrometheusRule 资源定义告警条件。
  • 远程存储:集成 Thanos 或 Cortex 实现长期存储和高可用。

三、监控 Kubernetes 集群组件

1. 监控节点资源
  • Node Exporter:部署 DaemonSet 收集节点指标。
  • ServiceMonitor:配置 Prometheus 抓取 Node Exporter 数据。
2. 监控 Kubernetes 核心组件
  • kube-state-metrics:部署以获取 Kubernetes 资源状态(如 Deployment、Pod 状态)。
  • kube-apiserver、kube-controller-manager、kube-scheduler:通过 ServiceMonitor 监控其指标端点。
3. 应用监控
  • 暴露应用指标:在应用中集成 Prometheus Client Library,暴露 /metrics 端点。
  • 配置 ServiceMonitor:定义如何抓取应用的指标。

四、告警与可视化

1. 配置 Alertmanager

创建 alertmanager.yaml 定义告警路由:

route:
  receiver: 'slack-notifications'
receivers:
- name: 'slack-notifications'
  slack_configs:
  - channel: '#alerts'
    send_resolved: true
    api_url: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
2. Grafana 仪表盘
  • 导入官方仪表盘(如 ID 315 查看 Kubernetes 集群概览)。
  • 自定义仪表盘使用 PromQL 查询数据。

五、生产环境注意事项

  • 高可用:部署多个 Prometheus 实例,使用 Thanos 或 Cortex 实现全局查询和存储。
  • 资源限制:为 Prometheus 和 Alertmanager 设置合理的 CPU/内存限制。
  • 安全
    • 启用 TLS 加密指标端点。
    • 使用 NetworkPolicy 限制对 Prometheus 的访问。
  • 备份:定期备份 Prometheus 数据或配置远程存储。

总结

通过 Helm 或 Prometheus Operator 在 Kubernetes 中部署 Prometheus,能够高效监控集群和应用状态。结合 Alertmanager 和 Grafana,可实现完整的监控告警体系。根据实际需求调整资源配置、存储方案和告警规则,确保系统稳定性和可观测性。

你可能感兴趣的:(Python,linux,DevOps技术分享,云原生,kubernetes,prometheus,经验分享,运维,容器,python)