WEBKT

基于 Prometheus 和 Alertmanager 实现 Kubernetes Pod CPU 高利用率告警与自动扩容

32 0 0 0

在 Kubernetes 环境中,监控 Pod 的 CPU 使用率并设置告警,以便在资源耗尽前采取措施至关重要。本方案将介绍如何使用 Prometheus 收集指标,Alertmanager 发送告警,并结合 Kubernetes HPA 实现自动扩容,以应对 CPU 使用率过高的情况。

1. 方案概述

  • Prometheus: 用于收集 Kubernetes 集群中 Pod 的 CPU 使用率等指标。
  • Alertmanager: 用于接收 Prometheus 发送的告警,并根据配置的规则发送告警邮件。
  • Kubernetes HPA (Horizontal Pod Autoscaler): 用于根据 CPU 使用率自动调整 Pod 的副本数量,实现自动扩容。

2. 前提条件

  • 已部署 Kubernetes 集群。
  • 已安装并配置 Prometheus,能够收集 Kubernetes 集群的指标数据。可以参考 Prometheus 官方文档 进行安装和配置。
  • 已安装并配置 Alertmanager,能够接收 Prometheus 的告警信息并发送邮件。可以参考 Alertmanager 官方文档 进行安装和配置。
  • 集群已启用 Metrics Server 或 Resource Metrics API,以便 HPA 可以获取 CPU 使用率数据。

3. 详细步骤

3.1 配置 Prometheus 告警规则

在 Prometheus 的配置文件 (通常是 prometheus.yml) 中,添加或修改 rule_files 部分,指向包含告警规则的文件。例如:

rule_files:
  - 'rules/pod_cpu_usage.yml'

创建 rules/pod_cpu_usage.yml 文件,并添加以下告警规则:

groups:
- name: PodCPUUsageAlerts
  rules:
  - alert: PodCPUHighUsage
    expr: sum(rate(container_cpu_usage_seconds_total{namespace!="kube-system"}[5m])) by (namespace,pod) * 100 > 80
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} CPU 使用率过高"
      description: "Pod {{ $labels.namespace }}/{{ $labels.pod }} 的 CPU 使用率已超过 80%,当前值为 {{ $value }}%"

规则解释:

  • alert: PodCPUHighUsage: 定义告警的名称。
  • expr: 定义告警触发的条件。这里使用 container_cpu_usage_seconds_total 指标,计算过去 5 分钟内 CPU 使用率的平均值,并按 namespace 和 pod 进行分组。如果 CPU 使用率超过 80%,则触发告警。
  • for: 1m: 定义告警持续时间。只有当 CPU 使用率持续 1 分钟超过 80% 时,才会触发告警。
  • labels: 定义告警的标签,这里设置了 severitycritical,表示这是一个严重告警。
  • annotations: 定义告警的注释信息,包括告警的摘要和描述。这些信息将包含在告警邮件中。

Prometheus 查询语句解释:

  • container_cpu_usage_seconds_total: 这是一个 Counter 指标,记录了容器使用的 CPU 时间总量(以秒为单位)。
  • rate(container_cpu_usage_seconds_total[5m]): rate() 函数计算在 5 分钟时间窗口内,container_cpu_usage_seconds_total 指标的平均增长率。由于 container_cpu_usage_seconds_total 是一个累积计数器,rate() 函数将其转换为每秒的增长率。
  • sum(...) by (namespace,pod): sum() 函数将所有容器的 CPU 使用率加总,并按照 namespacepod 进行分组。这样可以得到每个 Pod 的总 CPU 使用率。
  • * 100: 将 CPU 使用率从秒转换为百分比。
  • > 80: 设置告警阈值。当 CPU 使用率超过 80% 时,触发告警。
  • namespace!="kube-system": 排除kube-system命名空间的监控,可以根据实际需求进行修改。

3.2 配置 Alertmanager 告警通知

修改 Alertmanager 的配置文件 (通常是 alertmanager.yml),配置邮件发送规则。以下是一个简单的配置示例:

global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_auth_username: 'alertmanager@example.com'
  smtp_auth_password: 'your_password'
  smtp_from: 'alertmanager@example.com'
  smtp_require_tls: true

route:
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 3h
  receiver: 'email-receiver'

receivers:
- name: 'email-receiver'
  email_configs:
  - to: 'your_email@example.com'
    subject: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }} - {{ .GroupLabels.namespace }} / {{ .GroupLabels.pod }}'
    html: '{{ template "email.html" . }}'

templates:
- '/etc/alertmanager/template/email.html'

配置解释:

  • global: 定义全局配置,包括 SMTP 服务器地址、用户名、密码、发件人等。
  • route: 定义告警路由,这里将所有告警都发送到 email-receiver
  • receivers: 定义告警接收器,这里配置了一个 email-receiver,用于发送邮件。
  • email_configs: 定义邮件配置,包括收件人、主题、HTML 内容等。
  • templates: 定义邮件模板,用于自定义邮件内容。

创建 /etc/alertmanager/template/email.html 文件,并添加以下内容:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Alert</title>
</head>
<body>
    <h1>{{ .GroupLabels.alertname }}</h1>
    <p><strong>状态:</strong> {{ .Status }}</p>
    <p><strong>命名空间:</strong> {{ .GroupLabels.namespace }}</p>
    <p><strong>Pod:</strong> {{ .GroupLabels.pod }}</p>
    <p><strong>摘要:</strong> {{ .CommonAnnotations.summary }}</p>
    <p><strong>描述:</strong> {{ .CommonAnnotations.description }}</p>
</body>
</html>

注意:

  • 请根据实际情况修改 SMTP 服务器地址、用户名、密码、发件人、收件人等信息。
  • 可以根据需要自定义邮件主题和内容。

3.3 配置 Kubernetes HPA

使用 kubectl autoscale 命令或 YAML 文件创建 HPA。以下是一个 YAML 文件的示例:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: your-app-hpa
  namespace: your-namespace
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: your-app-deployment
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

配置解释:

  • scaleTargetRef: 指定 HPA 管理的目标 Deployment。
  • minReplicas: 指定 Pod 的最小副本数量。
  • maxReplicas: 指定 Pod 的最大副本数量。
  • metrics: 定义扩容的指标。这里使用 CPU 使用率,当 CPU 使用率超过 80% 时,HPA 将自动增加 Pod 的副本数量。
  • averageUtilization: 80: 目标 CPU 利用率,设置为 80%。当 Deployment 中所有 Pod 的平均 CPU 利用率超过 80% 时,HPA 会尝试增加 Pod 的副本数量,直到达到 maxReplicas 设置的上限。

使用以下命令创建 HPA:

kubectl apply -f hpa.yaml

3.4 验证配置

  • 使用 kubectl get hpa 命令查看 HPA 的状态,确保 HPA 正常工作。
  • 通过压力测试或模拟高负载,使 Pod 的 CPU 使用率超过 80%。
  • 观察 Alertmanager 是否发送告警邮件。
  • 观察 HPA 是否自动增加 Pod 的副本数量。

4. 总结

本方案提供了一种基于 Prometheus、Alertmanager 和 Kubernetes HPA 的 Kubernetes Pod CPU 高利用率告警与自动扩容的实现方法。通过配置 Prometheus 告警规则、Alertmanager 告警通知和 Kubernetes HPA,可以实现对 Pod CPU 使用率的实时监控和自动调整,从而保证应用程序的稳定性和可用性。根据实际需求,可以调整告警阈值、邮件内容和 HPA 的配置,以满足不同的监控和告警需求。

5. 优化建议

  • 更精细的监控指标: 除了 CPU 使用率,还可以监控内存使用率、磁盘 I/O 等指标,以便更全面地了解 Pod 的资源使用情况。
  • 自定义告警规则: 可以根据应用程序的特点,自定义告警规则,例如,根据请求延迟、错误率等指标设置告警。
  • 多渠道告警通知: 除了邮件,还可以使用 Slack、钉钉等渠道发送告警通知。
  • 更智能的自动扩容: 可以使用 Kubernetes Event-driven Autoscaling (KEDA) 等工具,根据自定义指标或事件触发自动扩容。

6. 参考资料

K8s架构师 Kubernetes监控Prometheus告警自动扩容

评论点评