![产品名称屏幕截图][product-screenshot]
基于历史数据的Kubernetes资源建议
基于Prometheus/Coralogix/Thanos/Mimir等现有数据获取建议!
安装
.
KRR工作原理
.
Slack集成
.
免费KRR UI
使用
·
报告Bug
·
请求功能
·
支持
喜欢KRR吗?请给这个仓库⭐来表示您的支持!
关于项目
Robusta KRR (Kubernetes资源推荐器)是一个用于优化Kubernetes集群资源分配的CLI工具。它从Prometheus收集Pod使用数据,并为CPU和内存推荐请求和限制。这降低了成本并提高了性能。
数据集成
查看说明:Prometheus、Thanos、Victoria Metrics、Google管理的Prometheus、Amazon管理的Prometheus、Azure管理的Prometheus、Coralogix、Grafana Cloud和Grafana Mimir
报告集成
查看说明:在UI中查看建议、将建议发送到Slack、将KRR设置为k9s插件
特性
- 无需代理:在本地机器上运行CLI工具即可立即获得结果。(或在集群内运行以获得每周Slack报告。)
- Prometheus集成:基于您已有的数据获取建议
- 可解释性:通过解释图表理解建议的计算方式
- 可扩展策略:轻松创建和使用您自己的资源建议计算策略。
- 免费SaaS平台:使用免费的Robusta SaaS平台了解KRR为什么会做出这样的建议。
- 未来支持:即将推出的版本将支持自定义资源(如GPU)和自定义指标。
使用KRR可以节省多少?
根据最近的Sysdig研究,平均而言,Kubernetes集群有:
- 69%未使用的CPU
- 18%未使用的内存
通过使用KRR调整容器大小,您可以平均节省69%的云成本。
阅读更多关于KRR如何工作的内容
与Kubernetes VPA的区别
功能 🛠️ | Robusta KRR 🚀 | Kubernetes VPA 🌐 |
---|---|---|
资源建议 💡 | ✅ CPU/内存请求和限制 | ✅ CPU/内存请求和限制 |
安装位置 🌍 | ✅ 不需要安装在集群内,可以在您自己的设备上使用,连接到集群 | ❌ 必须安装在集群内 |
工作负载配置 🔧 | ✅ 无需为每个工作负载配置VPA对象 | ❌ 需要为每个工作负载配置VPA对象 |
即时结果 ⚡ | ✅ 立即获得结果(如果Prometheus正在运行) | ❌ 需要时间收集数据并提供建议 |
报告 📊 | ✅ Json、CSV、Markdown、Web UI等 | ❌ 不支持 |
可扩展性 🔧 | ✅ 用几行Python代码添加自己的策略 | :warning: 有限的可扩展性 |
可解释性 📖 | ✅ 查看解释建议的图表 | ❌ 不支持 |
自定义指标 📏 | 🔄 未来版本支持 | ❌ 不支持 |
自定义资源 🎛️ | 🔄 未来版本支持(如GPU) | ❌ 不支持 |
自动缩放 🔀 | 🔄 未来版本支持 | ✅ 自动应用建议 |
默认历史 🕒 | 14天 | 8天 |
支持HPA 🔥 | ✅ 使用--allow-hpa 标志启用 | ❌ 不支持 |
安装
要求
KRR需要Prometheus 2.26+、kube-state-metrics和cAdvisor。
KRR需要哪些指标?
如果您使用kube-prometheus-stack或Robusta的嵌入式Prometheus,则无需设置。如果您有不同的设置,请确保存在以下指标:
container_cpu_usage_seconds_total
container_memory_working_set_bytes
kube_replicaset_owner
kube_pod_owner
kube_pod_status_phase
注意: 如果最后三个指标中有一个缺失,KRR 仍然可以工作,但它在计算建议时只会考虑当前正在运行的 pod。历史上已不存在于集群中的 pod 将不会被考虑在内。
安装方法
Brew (Mac/Linux)
- 添加我们的 tap:
brew tap robusta-dev/homebrew-krr
- 安装 KRR:
brew install krr
- 检查安装是否成功:
krr --help
- 运行 KRR (首次启动可能需要稍长时间):
krr simple
Windows
您可以在 WSL2 上使用 brew 安装(见上文),或从源代码安装(见下文)。
离线安装(无网络环境)
您可以从 Releases 下载预构建的二进制文件,或使用预构建的 Docker 容器。例如,版本 1.8.3 的容器是:
us-central1-docker.pkg.dev/genuine-flight-317411/devel/krr:v1.8.3
我们不建议在离线环境中从源代码安装 KRR,因为安装 Python 依赖项会很麻烦。请使用上述方法之一,如果需要帮助,请通过 Slack、GitHub issues 或电子邮件与我们联系。
从源代码安装
- 确保您已安装 Python 3.9 (或更高版本)
- 克隆仓库:
git clone https://github.com/robusta-dev/krr
- 进入项目根目录 (
cd ./krr
) - 安装依赖:
pip install -r requirements.txt
- 运行工具:
python krr.py --help
请注意,使用源代码需要您以 Python 脚本方式运行,而使用 brew 安装允许直接运行 krr
。
上面所有示例都显示运行命令为 krr ...
,如果您使用手动安装,请将其替换为 python krr.py ...
。
其他选项
特定环境说明
为以下环境设置 KRR...
- Google Cloud 托管 Prometheus
- Azure 托管 Prometheus
- Amazon 托管 Prometheus
- Coralogix 托管 Prometheus
- Grafana Cloud 托管 Prometheus
- Grafana Mimir
(返回顶部)
Robusta SaaS 平台上的免费 KRR UI
我们强烈建议使用 免费的 Robusta SaaS 平台。您可以:
使用方法
基本用法
krr simple
调整推荐算法(策略)
最有用的标志:
--cpu-min
设置推荐的最小 CPU 值(以毫核为单位)--mem-min
设置推荐的最小内存值(以 MB 为单位)--history_duration
使用的 Prometheus 历史数据的持续时间(以小时为单位)
可以使用以下命令查看有关策略设置的更多具体信息:
krr simple --help
提供明确的 Prometheus URL
如果您的 Prometheus 没有自动连接,您可以使用 kubectl port-forward
手动转发 Prometheus。
例如,如果您有一个名为 kube-prometheus-st-prometheus-0
的 Prometheus Pod,则运行此命令进行端口转发:
kubectl port-forward pod/kube-prometheus-st-prometheus-0 9090
然后,打开另一个终端并在其中运行 krr,提供明确的 Prometheus url:
krr simple -p http://127.0.0.1:9090
在特定命名空间上运行
使用 -n
列出您想要的任意多个命名空间(在本例中为 default
和 ingress-nginx
)
krr simple -n default -n ingress-nginx
在按标签过滤的工作负载上运行
使用 标签选择器
python krr.py simple --selector 'app.kubernetes.io/instance in (robusta, ingress-nginx)'
覆盖 kubectl 上下文
默认情况下,krr 将在当前上下文中运行。如果您想在不同的上下文中运行它:
krr simple -c my-cluster-1 -c my-cluster-2
用于报告的输出格式(JSON、YAML、CSV 等)
目前,KRR 提供了几种格式化程序来表示扫描数据:
table
- 默认使用的漂亮的 CLI 表格,由 Rich 库提供支持json
yaml
pprint
- 来自 Python pprint 库的数据表示csv
- 将数据导出到当前目录中的 csv 文件
要使用选定的格式化程序运行策略,请添加 -f
标志。通常应该与 --fileoutput <filename>
结合使用,以将干净的输出写入文件而不包含日志:
krr simple -f json --fileoutput krr-report.json
如果您愿意,也可以使用 --logtostderr
将格式化的输出放在一个文件中,将错误日志放在另一个文件中:
krr simple --logtostderr -f json > result.json 2> logs-and-errors.log
中央化 Prometheus(多集群)
Prometheus 认证
KRR 支持 Prometheus、VictoriaMetrics、Coralogix 和其他兼容 Prometheus 的指标存储的所有已知认证方案。
请参考 krr simple --help
,并查看标志 --prometheus-url
、--prometheus-auth-header
、--prometheus-headers
--prometheus-ssl-enabled
、--coralogix-token
以及各种 --eks-*
标志。
如果您需要帮助,请通过 Slack、电子邮件或打开 GitHub issue 与我们联系。
调试模式
如果您想查看额外的调试日志:krr simple -v
(返回顶部)
KRR 的工作原理
指标收集
Robusta KRR 使用以下 Prometheus 查询来收集使用数据:
- CPU 使用率:
sum(irate(container_cpu_usage_seconds_total{{namespace="{object.namespace}", pod="{pod}", container="{object.container}"}}[{step}]))
- 内存使用:
sum(container_memory_working_set_bytes{job="kubelet", metrics_path="/metrics/cadvisor", image!="", namespace="{object.namespace}", pod="{pod}", container="{object.container}"})
在Robusta SaaS上免费获取KRR建议的详细分析。
算法
默认情况下,我们使用一个简单的策略来计算资源建议。计算方法如下(具体数值可以通过CLI参数自定义):
-
对于CPU,我们将请求设置在第95百分位,不设限制。这意味着在95%的情况下,您的CPU请求将足够。对于剩下的5%,我们不设限制。这意味着您的pod可以突发使用节点上任何可用的CPU - 例如其他pod请求但当前未使用的CPU。
-
对于内存,我们取过去一周的最大值并添加15%的缓冲。
Prometheus连接
了解KRR如何尝试找到默认Prometheus进行连接,请点击这里。
(回到顶部)
数据源集成
Prometheus、Victoria Metrics和Thanos自动发现
默认情况下,KRR将尝试自动发现正在运行的Prometheus、Victoria Metrics和Thanos。 对于发现Prometheus,它会扫描具有以下标签的服务:
"app=kube-prometheus-stack-prometheus"
"app=prometheus,component=server"
"app=prometheus-server"
"app=prometheus-operator-prometheus"
"app=rancher-monitoring-prometheus"
"app=prometheus-prometheus"
对于Thanos,使用这些标签:
"app.kubernetes.io/component=query,app.kubernetes.io/name=thanos",
"app.kubernetes.io/name=thanos-query",
"app=thanos-query",
"app=thanos-querier",
对于Victoria Metrics,使用以下标签:
"app.kubernetes.io/name=vmsingle",
"app.kubernetes.io/name=victoria-metrics-single",
"app.kubernetes.io/name=vmselect",
"app=vmselect",
如果这些标签都无法找到Prometheus、Victoria Metrics或Thanos,您将收到一个错误,并且需要明确传递有效的URL(使用-p
标志)。
(回到顶部)
使用中央化Prometheus进行扫描
如果您的Prometheus监控多个集群,我们需要您在Prometheus中为集群定义的标签。
例如,如果您的集群具有Prometheus标签cluster: "my-cluster-name"
,则运行以下命令:
krr.py simple --prometheus-label cluster -l my-cluster-name
您可能还需要使用-p
标志来明确提供Prometheus的URL。
Azure托管Prometheus
对于Azure托管Prometheus,您需要生成一个访问令牌,可以通过运行以下命令来完成:
# 如果您尚未登录Azure,请取消注释以下行
# az login
AZURE_BEARER=$(az account get-access-token --resource=https://prometheus.monitor.azure.com --query accessToken --output tsv); echo $AZURE_BEARER
然后运行以下命令,将PROMETHEUS_URL替换为您的Azure托管Prometheus URL:
python krr.py simple --namespace default -p PROMETHEUS_URL --prometheus-auth-header "Bearer $AZURE_BEARER"
(回到顶部)
Amazon托管Prometheus
对于Amazon托管Prometheus,您需要添加Prometheus链接和标志--eks-managed-prom,krr将自动使用您的aws凭证
python krr.py simple -p "https://aps-workspaces.REGION.amazonaws.com/workspaces/..." --eks-managed-prom
其他可选参数包括:
--eks-profile-name PROFILE_NAME_HERE # 指定要使用的配置文件
--eks-access-key ACCESS_KEY # 指定您的访问密钥
--eks-secret-key SECRET_KEY # 指定您的秘密密钥
--eks-service-name SERVICE_NAME # 在签名中使用特定的服务名称
--eks-managed-prom-region REGION_NAME # 指定Prometheus所在的区域
(回到顶部)
Coralogix托管Prometheus
对于Coralogix托管Prometheus,您需要指定Prometheus链接并添加标志coralogix_token,其中包含您的日志查询密钥
python krr.py simple -p "https://prom-api.coralogix..." --coralogix_token
(回到顶部)
Grafana Cloud托管Prometheus
对于Grafana Cloud托管Prometheus,您需要指定Prometheus链接、Prometheus用户和Grafana Cloud堆栈的访问令牌。可以在Grafana Cloud门户上找到堆栈的Prometheus链接和用户。还可以使用同一门户上的访问策略创建具有metrics:read
范围的访问令牌。
接下来,运行以下命令,将PROM_URL、PROM_USER和PROM_TOKEN变量的值设置为您的Grafana Cloud堆栈的Prometheus链接、Prometheus用户和访问令牌。
python krr.py simple -p $PROM_URL --prometheus-auth-header "Bearer ${PROM_USER}:${PROM_TOKEN}" --prometheus-ssl-enabled
(回到顶部)
Grafana Mimir自动发现
默认情况下,KRR将尝试自动发现正在运行的Grafana Mimir。
为了发现Prometheus,它会扫描具有以下标签的服务:
"app.kubernetes.io/name=mimir,app.kubernetes.io/component=query-frontend"
(回到顶部)
集成
Slack 通知
让成本节省自动化。获取关于超过 X% 的建议的 Slack 通知。发送每周全局报告,或每个团队一份报告。
![Slack 截图][slack-screenshot]
先决条件
- 一个 Slack 工作区
设置
- 使用 Helm 在集群中安装 Robusta 并配置 Slack
- 通过在
generated_values.yaml
中添加以下内容来创建您的 KRR Slack playbook:
customPlaybooks:
# 每周对 devs-namespace 命名空间运行一次 krr 扫描,并将结果发送到配置的 Slack 频道
customPlaybooks:
- triggers:
- on_schedule:
fixed_delay_repeat:
repeat: -1 # 运行次数,-1 表示永久运行
seconds_delay: 604800 # 1 周
actions:
- krr_scan:
args: "--namespace devs-namespace" ## 在此处填写 KRR 参数
sinks:
- "main_slack_sink" # 在此处填写您想要发送报告的 Slack sink
- 执行 Helm 升级以应用新的值:
helm upgrade robusta robusta/robusta --values=generated_values.yaml --set clusterName=<YOUR_CLUSTER_NAME>
(返回顶部)
创建自定义策略/格式化器
查看 examples 目录,了解如何创建自定义策略/格式化器的示例。
(返回顶部)
测试
我们使用 pytest 运行测试。
- 手动安装项目(参见上文)
- 导航到项目根目录
- 安装 poetry(https://python-poetry.org/docs/#installing-with-the-official-installer)
- 安装开发依赖:
poetry install --group dev
- 以可编辑依赖方式安装 robusta_krr:
pip install -e .
- 运行测试:
poetry run pytest
(返回顶部)
贡献
贡献是使开源社区成为学习、激励和创造的绝佳场所的原因。我们非常感谢您做出的任何贡献。
如果您有让这个项目变得更好的建议,请 fork 该仓库并创建一个 pull request。您也可以简单地开启一个带有"enhancement"标签的 issue。 别忘了给项目点个 star!再次感谢!
- Fork 项目
- 创建您的特性分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m 'Add some AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 开启一个 Pull Request
(返回顶部)
许可证
根据 MIT 许可证分发。有关更多信息,请参阅 LICENSE.txt。
(返回顶部)
支持
如果您有任何问题,请随时联系 support@robusta.dev 或在 robustacommunity.slack.com 上给我们发消息
(返回顶部)