手把手教你!Kubernetes 集群监控告警系统搭建:Prometheus + Grafana 实践指南
作为一名 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
- 在 Grafana 官网搜索
Kubernetes Cluster Monitoring,找到对应的 Dashboard。 - 复制 Dashboard 的 ID。
- 在 Grafana 中,点击
+->Import。 - 在
Grafana.com Dashboard中输入 Dashboard 的 ID,点击Load。 - 选择 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 告警通知
- 在 Slack 中创建一个 Incoming Webhook。
- 获取 Webhook URL。
- 在 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 集群监控告警系统。