手把手教你!Kubernetes 集群监控告警系统搭建:Prometheus + Grafana 实践指南
为什么选择 Prometheus + Grafana?
搭建 Kubernetes 集群监控告警系统
1. 部署 Prometheus
2. 配置 Prometheus 抓取 Kubernetes metrics
3. 部署 Grafana
4. 配置 Grafana Dashboard
5. 配置 Alertmanager 告警规则
6. 配置告警通知方式
监控指标的选择
告警阈值的设置
总结
作为一名 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 集群监控告警系统。