KRR:基于 Prometheus 的 Kubernetes 资源推荐工具技术分析

一、概述

1. 项目背景

Kubernetes Resource Recommender(KRR)是由 Robusta 开发的开源工具,用于优化 Kubernetes 集群中的资源分配。该工具通过分析 Prometheus 中存储的历史监控数据,为工作负载提供精确的 CPU 和内存 requests 与 limits 建议。

根据 Sysdig 研究报告,Kubernetes 集群平均存在 69% 的 CPU 资源浪费和 18% 的内存资源浪费。KRR 旨在通过智能推荐解决这一问题,帮助用户降低云成本并提升性能。

2. 核心价值

  • 成本优化:通过精确的资源配置,平均可节省 69% 的云资源成本
  • 性能提升:避免资源配置不当导致的 OOM 和 CPU 节流问题
  • 无代理部署:无需在集群内安装代理,可在本地运行
  • 可解释性:提供图形化解释,展示推荐计算依据

3. 与 Kubernetes VPA 对比

KRR 与 Kubernetes 原生 Vertical Pod Autoscaler(VPA)相比具有明显优势:

特性KRRKubernetes VPA
安装位置可在本地运行,无需安装到集群内必须安装到集群内
工作负载配置无需为每个工作负载配置 VPA 对象需要为每个工作负载配置 VPA 对象
结果时效性立即获取结果(基于现有 Prometheus 数据)需要时间收集数据
报告格式支持 JSON、CSV、Markdown、Web UI 等不支持
可扩展性可通过 Python 添加自定义策略扩展性有限
可解释性提供推荐解释图形不支持
默认历史数据14 天8 天
HPA 兼容支持(使用 --allow-hpa 标志)不支持

二、系统架构

1. 工作原理

KRR 的工作流程可以分为数据收集、分析计算和结果输出三个阶段。

graph TB
    A[用户执行 krr 命令] --> B[连接 Kubernetes 集群]
    B --> C[扫描工作负载]
    C --> D[查询 Prometheus API]
    D --> E[收集 CPU/内存历史数据]
    E --> F[应用推荐策略]
    F --> G[计算推荐值]
    G --> H[输出结果]
    H --> I[CLI/JSON/CSV/Web UI]

KRR 工作流程图

2. 核心组件

A. Prometheus 集成器

负责从 Prometheus、Coralogix、Thanos、Mimir 等监控系统中查询历史指标数据。支持的数据源包括:

  • Prometheus(自托管或托管)
  • Google Managed Prometheus
  • Amazon Managed Prometheus
  • Azure Managed Prometheus
  • Coralogix
  • Grafana Cloud / Mimir
  • Victoria Metrics

B. 策略引擎

可扩展的策略系统,默认提供简单策略,也支持自定义策略:

默认简单策略

  • CPU:使用 P95(95 分位数)作为 request,不设置 limit。这意味着在 95% 的情况下 CPU request 足够使用,剩余 5% 允许突发使用节点空闲 CPU
  • 内存:取过去一周最大值并添加 15% 缓冲作为 request 和 limit

C. 输出格式化器

支持多种输出格式:

  • CLI 表格输出
  • JSON
  • YAML
  • CSV
  • Markdown
  • Web UI(通过 Robusta SaaS 平台)

D. Kubernetes API 客户端

用于获取集群中的工作负载信息,包括 Deployment、StatefulSet、DaemonSet、Job 等。

3. Prometheus 指标查询

KRR 使用以下 PromQL 查询收集数据:

CPU 使用率查询

sum(irate(container_cpu_usage_seconds_total{namespace="{namespace}", pod="{pod}", container="{container}"}[{step}]))

内存使用量查询

sum(container_memory_working_set_bytes{job="kubelet", metrics_path="/metrics/cadvisor", image!="", namespace="{namespace}", pod="{pod}", container="{container}"})

三、安装与部署

1. 系统要求

  • Prometheus:版本 2.26 或更高
  • kube-state-metrics:用于获取 Kubernetes 对象状态
  • cAdvisor:用于容器资源指标收集

如果使用 kube-prometheus-stack 或 default Prometheus 设置,无需额外配置。

2. 安装方式

A. Homebrew(Mac/Linux)

brew add robusta-dev/tap/krr
brew install robusta-dev/tap/krr

B. Windows

scoop bucket add robusta-dev https://github.com/robusta-dev/scoop
scoop install krr

C. Docker 镜像

docker pull ghcr.io/robusta-dev/krr:latest
docker run --rm -v ~/.kube/config:/root/.kube/config ghcr.io/robusta-dev/krr:latest

D. 集群内安装(用于定期扫描和 Slack 报告)

helm repo add robusta https://robusta-charts.storage.googleapis.com
helm install krr robusta/krr --namespace robusta-krr --create-namespace

E. 从源码安装

git clone https://github.com/robusta-dev/krr.git
cd krr
pip install -e .

四、使用方法

1. 基础用法

扫描集群中的所有工作负载并显示推荐:

krr scan

2. 指定命名空间

krr scan -n production

3. 使用标签过滤

krr scan -l app=nginx

4. 自定义 Prometheus URL

krr scan --prometheus-url http://prometheus-server.monitoring.svc.cluster.local

5. 多集群模式(使用中央 Prometheus)

krr scan --cluster-labels cluster=prod-us,cluster=prod-eu

6. Prometheus 认证

krr scan --prometheus-url https://prometheus.example.com \
  --prometheus-username admin \
  --prometheus-password secret123

7. 输出格式

JSON 格式

krr scan -o json > recommendations.json

CSV 格式

krr scan -o csv > recommendations.csv

Markdown 格式

krr scan -o markdown > recommendations.md

五、高级功能

1. 自定义策略

创建自定义 Python 策略类:

from robusta_krr.strategies.base import BaseStrategy

class CustomStrategy(BaseStrategy):
    def calculate(self, data):
        # 自定义推荐逻辑
        cpu_request = data.cpu.p90 * 1.2  # P90 + 20% 缓冲
        memory_request = data.memory.max * 1.1  # 最大值 + 10% 缓冲
        return {
            'cpu': {'request': cpu_request, 'limit': None},
            'memory': {'request': memory_request, 'limit': memory_request}
        }

使用自定义策略:

krr scan --strategy custom_strategy.py

2. Slack 集成

配置每周自动扫描并通过 Slack 发送报告:

# helm values
slack:
  webhookUrl: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
  channel: "#k8s-optimization"
  schedule: "0 9 * * 1"  # 每周一上午 9 点

3. k9s 插件集成

在 k9s 中直接使用 KRR:

# ~/.k9s/plugins.yml
plugins:
  krr:
    shortCut: r
    description: Resource Recommendations
    scopes:
      - pod
    command: krr
    background: false

4. Azure Blob Storage 集成

将推荐结果导出到 Azure Blob Storage 并通过 Teams 通知:

krr scan --output azureblob --azure-container krr-reports \
  --teams-webhook https://outlook.office.com/webhook/YOUR-WEBHOOK

六、技术实现细节

1. Prometheus 自动发现

KRR 会按以下顺序尝试发现 Prometheus:

graph TD
    A[开始查找 Prometheus] --> B{是否指定 URL?}
    B -->|是| C[使用指定 URL]
    B -->|否| D{环境变量 PROMETHEUS_URL?}
    D -->|有| C
    D -->|无| E{kube-system namespace?}
    E -->|有| F[尝试查找 Prometheus Service]
    E -->|无| G[尝试查找 monitoring namespace]
    F --> H{找到?}
    G --> H
    H -->|是| I[自动发现成功]
    H -->|否| J[报错退出]

Prometheus 自动发现流程

2. 算法详解

P95 算法选择原理

CPU 使用选择 P95 而不是 P99 或平均值的原因:

  • P95 可以过滤掉短期尖峰,避免过度配置
  • 允许 5% 的突发情况,通过利用节点空闲资源处理
  • 相比 P99 更节省成本
  • 相比平均值更安全可靠

内存缓冲策略

内存采用最大值 + 15% 缓冲的原因:

  • 内存不足会导致 OOM Kill,是致命错误
  • 15% 缓冲可以应对正常波动
  • 历史最大值代表已知负载场景

3. HPA 兼容处理

当工作负载使用 HPA 时,VPA 会自动禁用。KRR 通过 --allow-hpa 标志支持此场景:

  • 仅提供参考推荐
  • 不会自动应用(需要手动审核)
  • 确保 CPU limits 设置为 None 或等于 requests,避免 HPA 指标不准确

七、最佳实践

1. 分阶段实施

  1. 只读扫描阶段:运行 krr scan,仅查看推荐
  2. 测试环境验证:在非生产环境应用推荐,观察一周
  3. 生产环境灰度:选择低风险工作负载先应用
  4. 全面推广:逐步覆盖所有工作负载

2. 定期重新扫描

建议每月运行一次 KRR 扫描,因为:

  • 应用负载模式会随时间变化
  • 新功能上线可能改变资源需求
  • 季节性业务波动

3. 结合告警使用

设置资源使用率告警:

  • CPU 持续高于 80% requests:考虑增加配置
  • 内存持续高于 85% requests:考虑增加配置
  • CPU 持续低于 30% requests:考虑减少配置

4. 处理特殊情况

  • 批处理任务:使用任务历史数据而非实时数据
  • 突发流量应用:适当增加 CPU 缓冲比例
  • 内存泄漏应用:先修复问题再调整配置

八、限制与未来规划

1. 当前限制

  • 不支持自定义指标(如 GPU)
  • 不支持自定义资源类型
  • 不支持自动应用推荐(beta 功能开发中)

2. 未来规划

根据项目 Roadmap:

  • 自定义指标支持(如 GPU、网络带宽)
  • 自动应用模式(Auto-Apply)
  • 更多 Prometheus 兼容性
  • 实时监控模式

九、总结

KRR 是一个强大的 Kubernetes 资源优化工具,通过基于历史数据的智能推荐,帮助用户降低云成本、提升集群性能。其无代理架构、可扩展策略和丰富的集成选项使其成为 Kubernetes FinOps 工具箱中的重要工具。

与 Kubernetes 原生 VPA 相比,KRR 在易用性、可解释性和报告格式方面具有明显优势。对于已经在使用 Prometheus 的集群,KRR 可以无缝集成并快速产生价值。


参考资料

  1. KRR GitHub Repository
  2. Robusta SaaS Platform
  3. Sysdig Kubernetes Cost Study
最后修改:2026 年 01 月 17 日
如果觉得我的文章对你有用,请随意赞赏