WEBKT

手把手教你!Kubernetes 集群监控告警系统搭建:Prometheus + Grafana 实践指南

212 0 0 0

作为一名 SRE,集群的稳定运行是我的首要职责。Kubernetes 已经成为容器编排的事实标准,但如何有效地监控和告警 Kubernetes 集群的状态,仍然是一个具有挑战性的问题。今天,我将分享我如何使用 Prometheus 和 Grafana 搭建一套完整的 Kubernetes 集群监控告警系统,希望能帮助你更好地守护你的集群。

为什么选择 Prometheus + Grafana?

在众多监控解决方案中,我选择了 Prometheus 和 Grafana,主要基于以下几点考量:

  • Prometheus:
    • 强大的数据抓取能力: Prometheus 可以通过 Service Discovery 自动发现 Kubernetes 集群中的各种服务和 Pod,并抓取它们的 metrics 数据。
    • 灵活的查询语言: PromQL 允许你根据各种维度对 metrics 数据进行聚合、过滤和计算,从而快速定位问题。
    • 高效的存储: Prometheus 使用自定义的时间序列数据库,能够高效地存储和查询大量的 metrics 数据。
    • 易于集成: Prometheus 可以与 Alertmanager 集成,实现灵活的告警策略。
  • Grafana:
    • 强大的可视化能力: Grafana 提供了丰富的图表类型,可以将 Prometheus 抓取的 metrics 数据以直观的方式展示出来。
    • 灵活的 Dashboard: 你可以根据自己的需求创建各种 Dashboard,监控 Kubernetes 集群的各个方面。
    • 易于使用: Grafana 提供了友好的用户界面,即使没有太多的经验,也可以快速上手。

搭建 Kubernetes 集群监控告警系统

下面,我将详细介绍如何搭建 Kubernetes 集群监控告警系统。

1. 部署 Prometheus

有多种方式可以部署 Prometheus,例如使用 Helm、Operator 或者直接部署 Kubernetes Manifest。这里我选择使用 Helm 来部署 Prometheus,因为它能够简化部署过程,并提供一些默认的配置。

首先,添加 Prometheus Helm Chart 仓库:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

然后,安装 Prometheus:

helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring

注意: -n monitoring 参数指定 Prometheus 部署的 namespace,你需要提前创建好这个 namespace。

这个 Helm Chart 会部署 Prometheus、Alertmanager、Grafana 等组件,以及一些默认的 Dashboard 和告警规则。

2. 配置 Prometheus 抓取 Kubernetes metrics

Prometheus 已经默认配置了一些 Kubernetes metrics 的抓取规则,例如:

  • kube-state-metrics: 抓取 Kubernetes 集群中各种资源的状态信息,例如 Pod、Deployment、Service 等。
  • node-exporter: 抓取 Kubernetes 集群中各个节点的系统 metrics,例如 CPU、内存、磁盘、网络等。
  • cadvisor: 抓取 Kubernetes 集群中各个容器的资源使用情况,例如 CPU、内存、磁盘 I/O、网络 I/O 等。

如果你需要抓取自定义的 metrics,可以通过以下方式配置:

  • 使用 annotations: 在 Pod 的 metadata 中添加 annotations,指定 Prometheus 抓取 metrics 的路径和端口。
  • 使用 ServiceMonitor: 创建一个 ServiceMonitor 对象,指定 Prometheus 抓取 metrics 的 Service。

示例:使用 annotations

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '8080'
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 8080

示例:使用 ServiceMonitor

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app-monitor
spec:
  selector:
    matchLabels:
      app: my-app
  endpoints:
  - port: http
    path: /metrics

3. 部署 Grafana

如果你使用 Helm 部署 Prometheus,Grafana 已经自动部署了。你可以通过以下方式访问 Grafana:

kubectl get svc -n monitoring prometheus-grafana -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'

或者,你可以通过 port-forwarding 访问 Grafana:

kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80

然后,在浏览器中访问 http://localhost:3000,使用默认的用户名和密码 admin/admin 登录 Grafana。

4. 配置 Grafana Dashboard

Grafana 提供了丰富的图表类型,你可以根据自己的需求创建各种 Dashboard,监控 Kubernetes 集群的各个方面。

你可以从 Grafana 官网或者其他渠道导入一些现成的 Dashboard,例如:

  • Kubernetes Cluster Monitoring: 监控 Kubernetes 集群的整体状态,例如 CPU、内存、磁盘、网络等。
  • Kubernetes Pod Monitoring: 监控 Kubernetes 集群中各个 Pod 的资源使用情况,例如 CPU、内存、磁盘 I/O、网络 I/O 等。
  • Kubernetes Node Monitoring: 监控 Kubernetes 集群中各个节点的系统 metrics,例如 CPU、内存、磁盘、网络等。

你也可以根据自己的需求自定义 Dashboard,例如:

  • 监控某个特定服务的性能指标。
  • 监控某个特定应用的错误率。
  • 监控某个特定数据库的连接数。

示例:导入 Kubernetes Cluster Monitoring Dashboard

  1. 在 Grafana 官网搜索 Kubernetes Cluster Monitoring,找到对应的 Dashboard。
  2. 复制 Dashboard 的 ID。
  3. 在 Grafana 中,点击 + -> Import
  4. Grafana.com Dashboard 中输入 Dashboard 的 ID,点击 Load
  5. 选择 Prometheus 数据源,点击 Import

5. 配置 Alertmanager 告警规则

Alertmanager 用于接收 Prometheus 发送的告警信息,并根据配置的规则发送告警通知。

Prometheus 已经默认配置了一些告警规则,例如:

  • CPUThrottlingHigh: 当容器的 CPU throttling 比例过高时触发告警。
  • HighMemoryUse: 当节点的内存使用率过高时触发告警。
  • KubePodNotReady: 当 Pod 的状态不是 Ready 时触发告警。

你可以根据自己的需求自定义告警规则,例如:

  • 当某个特定服务的响应时间超过阈值时触发告警。
  • 当某个特定应用的错误率超过阈值时触发告警。
  • 当某个特定数据库的连接数超过阈值时触发告警。

示例:自定义告警规则

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # Alertmanager is running on port 9093 of localhost.
      - localhost:9093

rules:
- alert: HighCPUUsage
  expr: sum(rate(process_cpu_seconds_total{job="node-exporter"}[5m])) by (instance) > 0.8
  for: 1m
  labels:
    severity: critical
  annotations:
    summary: High CPU usage detected
    description: 'CPU usage is above 80% for instance {{ $labels.instance }}'

这个告警规则表示,当节点的 CPU 使用率超过 80% 持续 1 分钟时,触发告警,并将告警信息发送给 Alertmanager。

6. 配置告警通知方式

Alertmanager 支持多种告警通知方式,例如:

  • Email: 通过邮件发送告警通知。
  • Slack: 通过 Slack 发送告警通知。
  • Webhook: 通过 Webhook 发送告警通知。

你可以根据自己的需求选择合适的告警通知方式。

示例:配置 Slack 告警通知

  1. 在 Slack 中创建一个 Incoming Webhook。
  2. 获取 Webhook URL。
  3. 在 Alertmanager 的配置文件中添加以下配置:
receivers:
- name: 'slack-notifications'
  slack_configs:
  - api_url: '<your_slack_webhook_url>'
    channel: '#alerts'
    send_resolved: true

注意: 你需要将 <your_slack_webhook_url> 替换成你自己的 Webhook URL。

监控指标的选择

监控指标的选择非常重要,它直接关系到你是否能够及时发现问题。以下是一些常用的 Kubernetes 监控指标:

  • CPU 使用率: 监控节点的 CPU 使用情况,可以帮助你发现 CPU 瓶颈。
  • 内存使用率: 监控节点的内存使用情况,可以帮助你发现内存泄漏。
  • 磁盘使用率: 监控节点的磁盘使用情况,可以帮助你发现磁盘空间不足。
  • 网络流量: 监控节点的网络流量,可以帮助你发现网络拥塞。
  • Pod 状态: 监控 Pod 的状态,可以帮助你发现 Pod 启动失败或者运行异常。
  • 容器资源使用情况: 监控容器的 CPU、内存、磁盘 I/O、网络 I/O 等资源使用情况,可以帮助你发现资源瓶颈。

告警阈值的设置

告警阈值的设置也很重要,它直接关系到你是否会收到过多的告警或者漏掉重要的告警。

告警阈值的设置需要根据实际情况进行调整,以下是一些建议:

  • CPU 使用率: 可以设置为 80% 或者 90%。
  • 内存使用率: 可以设置为 80% 或者 90%。
  • 磁盘使用率: 可以设置为 80% 或者 90%。
  • Pod 状态: 当 Pod 的状态不是 Ready 时,应该立即触发告警。

总结

通过 Prometheus 和 Grafana,我们可以搭建一套完整的 Kubernetes 集群监控告警系统,及时发现和解决问题,保障集群的稳定运行。希望这篇文章能够帮助你更好地守护你的 Kubernetes 集群。

记住,监控不是一蹴而就的,需要不断地调整和优化。监控指标的选择、告警阈值的设置、告警通知方式的配置,都需要根据实际情况进行调整。只有不断地学习和实践,才能构建一套高效的 Kubernetes 集群监控告警系统。

运维老司机 KubernetesPrometheusGrafana

评论点评