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)相比具有明显优势:
| 特性 | KRR | Kubernetes 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]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/krrB. Windows
scoop bucket add robusta-dev https://github.com/robusta-dev/scoop
scoop install krrC. Docker 镜像
docker pull ghcr.io/robusta-dev/krr:latest
docker run --rm -v ~/.kube/config:/root/.kube/config ghcr.io/robusta-dev/krr:latestD. 集群内安装(用于定期扫描和 Slack 报告)
helm repo add robusta https://robusta-charts.storage.googleapis.com
helm install krr robusta/krr --namespace robusta-krr --create-namespaceE. 从源码安装
git clone https://github.com/robusta-dev/krr.git
cd krr
pip install -e .四、使用方法
1. 基础用法
扫描集群中的所有工作负载并显示推荐:
krr scan2. 指定命名空间
krr scan -n production3. 使用标签过滤
krr scan -l app=nginx4. 自定义 Prometheus URL
krr scan --prometheus-url http://prometheus-server.monitoring.svc.cluster.local5. 多集群模式(使用中央 Prometheus)
krr scan --cluster-labels cluster=prod-us,cluster=prod-eu6. Prometheus 认证
krr scan --prometheus-url https://prometheus.example.com \
--prometheus-username admin \
--prometheus-password secret1237. 输出格式
JSON 格式:
krr scan -o json > recommendations.jsonCSV 格式:
krr scan -o csv > recommendations.csvMarkdown 格式:
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.py2. 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: false4. 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[报错退出]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. 分阶段实施
- 只读扫描阶段:运行 krr scan,仅查看推荐
- 测试环境验证:在非生产环境应用推荐,观察一周
- 生产环境灰度:选择低风险工作负载先应用
- 全面推广:逐步覆盖所有工作负载
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 可以无缝集成并快速产生价值。