K8S问题系列 | 9:如何监控集群CPU使用率并设置告警?

在 Kubernetes(K8s)集群中,CPU 使用率是评估系统负载、确保资源分配合理性以及优化性能的关键指标之一。随着微服务架构的普及和应用程序容器化的推进,K8s 的 CPU 资源监控和告警功能变得尤为重要。掌握如何监控集群的 CPU 使用情况,并及时设置告警,可以有效防止应用出现性能瓶颈或者过载,从而保证服务的高可用性和稳定性。

1. 为什么要监控 CPU 使用率?

Kubernetes 集群中的 CPU 使用率直接影响到集群的性能和容器化应用的响应能力。如果某个应用的 CPU 使用过高,可能会导致以下问题:

  • 应用响应变慢:容器可能因资源不足而无法及时响应请求,造成延迟增加。
  • 资源竞争:多个容器争夺同一节点上的 CPU 资源时,可能导致 CPU 超负荷运行,甚至影响其他服务的稳定性。
  • 资源浪费:CPU 资源利用率过低,说明资源分配不合理,可能导致集群资源浪费。

因此,监控集群的 CPU 使用率并设置告警是确保 K8s 集群高效运行的必要步骤。

2. 监控 Kubernetes 集群 CPU 使用率

Kubernetes 本身没有提供直接的监控工具,而是通过集成第三方监控系统来实现资源的监控。常见的监控工具包括 Prometheus、Grafana 和 Kubernetes 自带的 Metrics Server。

2.1 使用 Prometheus 监控 CPU 使用率

Prometheus 是一个开源的监控系统和时序数据库,可以与 Kubernetes 集群集成,收集并查询集群的 CPU 使用情况。

2.1.1 部署 Prometheus

首先,我们需要在 Kubernetes 集群中部署 Prometheus:

bashCopy Code
kubectl create namespace monitoring kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/main/manifests/setup/ kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/main/manifests/

通过这些命令,Prometheus 会被部署到名为 monitoring 的命名空间下。您可以使用以下命令验证 Prometheus 是否成功运行:

bashCopy Code
kubectl get pods -n monitoring

2.1.2 配置 Prometheus 抓取 CPU 指标

Prometheus 默认会抓取 Kubernetes 集群中的各种资源使用情况。要确保 CPU 指标被监控,您需要在 Prometheus 配置中指定需要抓取的目标。以下是一个 Prometheus 配置文件的例子:

yamlCopy Code
scrape_configs: - job_name: 'kubernetes-cadvisor' kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__meta_kubernetes_node_label_name] target_label: node

这个配置告诉 Prometheus 监控所有节点的 cadvisor 数据,cadvisor 是 Kubernetes 用来监控节点和容器的工具,它会提供 CPU 使用率等指标。

2.1.3 查询 CPU 使用率指标

一旦 Prometheus 部署并配置完毕,您可以通过 Prometheus UI 查询 CPU 使用率指标。Prometheus 提供了强大的查询语言 PromQL,您可以使用以下查询语句来查看 CPU 使用率:

Copy Code
sum(rate(container_cpu_usage_seconds_total{job="kubernetes-cadvisor"}[5m])) by (pod)

该查询语句计算了过去 5 分钟内,每个 Pod 的 CPU 使用量(单位:秒)。

2.2 使用 Kubernetes Metrics Server 监控 CPU 使用率

Kubernetes Metrics Server 是一个轻量级的指标服务器,可以为 Kubernetes 集群提供基本的资源监控数据。它可以获取 CPU 和内存的使用情况,但并不像 Prometheus 那样具有强大的查询功能。

2.2.1 部署 Metrics Server

首先,我们需要在 Kubernetes 集群中安装 Metrics Server:

bashCopy Code
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

部署完成后,您可以使用以下命令查看节点和 Pod 的 CPU 使用情况:

bashCopy Code
kubectl top nodes kubectl top pods --all-namespaces

这些命令会显示集群中每个节点和每个 Pod 的 CPU 和内存使用情况。

2.2.2 查询 CPU 使用率

通过 kubectl top 命令,您可以查看所有节点和 Pod 的 CPU 使用率,但 Metrics Server 不提供 Prometheus 那样灵活的查询功能。如果您的需求更复杂,建议使用 Prometheus。

2.3 使用 Grafana 可视化 CPU 使用率

Grafana 是一个流行的开源可视化工具,常常与 Prometheus 配合使用来展示 Kubernetes 集群的监控数据。通过 Grafana,您可以创建美观的仪表盘来实时监控集群的 CPU 使用情况。

2.3.1 配置 Grafana 数据源

假设您已经部署了 Prometheus,接下来需要将 Grafana 配置为 Prometheus 数据源。您可以在 Grafana 的 UI 中通过以下步骤进行配置:

  1. 登录到 Grafana(默认地址:http://localhost:3000)。
  2. 进入 Configuration -> Data Sources,点击 Add Data Source
  3. 选择 Prometheus 作为数据源类型,并配置 Prometheus 的 URL,通常是 http://prometheus-server:9090
  4. 保存并测试数据源连接。

2.3.2 创建 CPU 使用率仪表盘

在 Grafana 中,您可以创建一个新的仪表盘并添加面板来展示 CPU 使用率。以下是一个示例查询,用于显示集群所有 Pod 的 CPU 使用率:

Copy Code
sum(rate(container_cpu_usage_seconds_total{job="kubernetes-cadvisor"}[5m])) by (pod)

您可以根据自己的需要调整查询和仪表盘的样式,使其更符合实际监控需求。

3. 设置告警

监控系统的主要目的是在出现异常时发出警报,确保及时采取行动。Kubernetes 中的 CPU 使用率告警可以通过 Prometheus 与 Alertmanager 来设置。

3.1 配置 Prometheus 告警规则

首先,在 Prometheus 中配置告警规则。创建一个告警规则文件 alert_rules.yml,并定义告警条件,例如,当某个 Pod 的 CPU 使用率超过 80% 时发出告警:

yamlCopy Code
groups: - name: cpu-alerts rules: - alert: HighCpuUsage expr: sum(rate(container_cpu_usage_seconds_total{job="kubernetes-cadvisor"}[5m])) by (pod) > 0.8 for: 5m labels: severity: critical annotations: summary: "Pod {{ $labels.pod }} CPU usage is above 80% for more than 5 minutes."

3.1.1 加载告警规则

将告警规则加载到 Prometheus 中:

bashCopy Code
kubectl apply -f alert_rules.yml

3.2 配置 Alertmanager

Alertmanager 用于处理 Prometheus 发出的告警,并将它们发送到指定的接收者(如电子邮件、Slack 或 Webhook)。

3.2.1 配置 Alertmanager

首先,在 Kubernetes 中部署 Alertmanager:

bashCopy Code
kubectl apply -f https://raw.githubusercontent.com/prometheus/alertmanager/main/documentation/examples/kubernetes.yaml

然后,配置 Alertmanager 发送告警通知。以 Slack 为例,您可以在 alertmanager.yml 中配置 Slack 的 Webhook URL:

yamlCopy Code
global: resolve_timeout: 5m receivers: - name: 'slack-notifications' slack_configs: - api_url: 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX' channel: '#alerts'

3.2.2 配置 Prometheus 使用 Alertmanager

修改 Prometheus 配置文件,添加 Alertmanager 的地址:

yamlCopy Code
alerting: alertmanagers: - static_configs: - targets: - 'alertmanager:9093'

通过这些配置,Prometheus 就能够将 CPU 使用率超过阈值的告警发送到 Slack。

3.3 告警示例

当某个 Pod 的 CPU 使用率超过 80% 并持续超过 5 分钟时,Prometheus 会触发 HighCpuUsage 告警。Alertmanager 会将告警发送到 Slack,通知开发团队采取措施。

4. 实际案例与场景

4.1 高负载时的 CPU 使用率监控

假设您在一个生产环境中运行多个服务,每个服务都部署在多个 Pod 上。当某个服务的 CPU 使用率超过 80% 时,您希望通过 Prometheus 和 Alertmanager 监控该情况,并在发生高负载时及时通知运维人员。

4.1.1 场景描述

在一天的高峰期,某个微