Loading... # 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 的工作流程可以分为数据收集、分析计算和结果输出三个阶段。 ```mermaid 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) ```bash brew add robusta-dev/tap/krr brew install robusta-dev/tap/krr ``` ### B. Windows ```bash scoop bucket add robusta-dev https://github.com/robusta-dev/scoop scoop install krr ``` ### C. Docker 镜像 ```bash 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 报告) ```bash helm repo add robusta https://robusta-charts.storage.googleapis.com helm install krr robusta/krr --namespace robusta-krr --create-namespace ``` ### E. 从源码安装 ```bash git clone https://github.com/robusta-dev/krr.git cd krr pip install -e . ``` # 四、使用方法 ## 1. 基础用法 扫描集群中的所有工作负载并显示推荐: ```bash krr scan ``` ## 2. 指定命名空间 ```bash krr scan -n production ``` ## 3. 使用标签过滤 ```bash krr scan -l app=nginx ``` ## 4. 自定义 Prometheus URL ```bash krr scan --prometheus-url http://prometheus-server.monitoring.svc.cluster.local ``` ## 5. 多集群模式(使用中央 Prometheus) ```bash krr scan --cluster-labels cluster=prod-us,cluster=prod-eu ``` ## 6. Prometheus 认证 ```bash krr scan --prometheus-url https://prometheus.example.com \ --prometheus-username admin \ --prometheus-password secret123 ``` ## 7. 输出格式 **JSON 格式**: ```bash krr scan -o json > recommendations.json ``` **CSV 格式**: ```bash krr scan -o csv > recommendations.csv ``` **Markdown 格式**: ```bash krr scan -o markdown > recommendations.md ``` # 五、高级功能 ## 1. 自定义策略 创建自定义 Python 策略类: ```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} } ``` 使用自定义策略: ```bash krr scan --strategy custom_strategy.py ``` ## 2. Slack 集成 配置每周自动扫描并通过 Slack 发送报告: ```yaml # helm values slack: webhookUrl: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL" channel: "#k8s-optimization" schedule: "0 9 * * 1" # 每周一上午 9 点 ``` ## 3. k9s 插件集成 在 k9s 中直接使用 KRR: ```yaml # ~/.k9s/plugins.yml plugins: krr: shortCut: r description: Resource Recommendations scopes: - pod command: krr background: false ``` ## 4. Azure Blob Storage 集成 将推荐结果导出到 Azure Blob Storage 并通过 Teams 通知: ```bash krr scan --output azureblob --azure-container krr-reports \ --teams-webhook https://outlook.office.com/webhook/YOUR-WEBHOOK ``` # 六、技术实现细节 ## 1. Prometheus 自动发现 KRR 会按以下顺序尝试发现 Prometheus: ```mermaid 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. 分阶段实施 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](https://github.com/robusta-dev/krr) 2. [Robusta SaaS Platform](https://platform.robusta.dev) 3. [Sysdig Kubernetes Cost Study](https://sysdig.com/blog/millions-wasted-kubernetes/) 最后修改:2026 年 01 月 17 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏