OpenCost 入门与实践:Kubernetes 与多云成本监控及 MCP Server 智能接入指南
【免费下载链接】opencostCost monitoring for Kubernetes workloads and cloud costs项目地址: https://gitcode.com/GitHub_Trending/op/opencost
OpenCost 是面向 Kubernetes 工作负载与多云支出的开源成本监控工具,提供集群内资源分配(Allocation)与云端资产(Asset)的实时、历史成本可见性。本文以仓库根目录 README.md 为主线,系统讲解 OpenCost 的安装方式、功能矩阵,并重点展开其内置的 MCP(Model Context Protocol)Server——如何让 AI Agent 通过标准化接口查询成本分配、资产与云成本数据,最后结合 pkg/mcp/server.go 等源码剖析底层实现原理。读完本文,你将能独立完成 OpenCost 的 Helm 部署、开启并配置 MCP Server、接入 MCP 客户端(如 Cursor),并理解成本查询的完整调用链路。
OpenCost 是什么
OpenCost 为团队提供当前与历史的 Kubernetes 及云支出、资源分配可见性。其成本模型在多应用、多团队、多部门并存的 Kubernetes 环境中提供成本透明度,同时覆盖多云提供商的云成本。项目由 Kubecost 最初开发并开源,采用规范(Specification)+ Go 语言实现的组合形态:规范定义于 spec/,最新版本为 spec/opencost-specv01.md,是厂商中立的、面向 Kubernetes 环境实现 OpenCost 监控的需求基线;Web UI 则托管在独立的 opencost-ui 仓库。
核心功能矩阵
- 实时成本分配:按集群、节点、命名空间、控制器类型(Controller Kind)、控制器、服务或 Pod 维度进行成本归因;
- 多云成本监控:覆盖 AWS、Azure、GCP 上的全部云服务;
- 动态按需定价:通过集成 AWS、Azure、GCP 的计费 API 获取 Kubernetes 资产的按需价格;
- 本地集群支持:通过自定义 CSV 定价支持本地(on-prem)Kubernetes 集群;
- 集群内资源分配:覆盖 CPU、GPU、内存、持久卷(PV)等集群内 K8s 资源;
- Prometheus 导出:通过
/metrics端点将定价数据导出到 Prometheus; - 碳成本:提供云资源的碳排放估算;
- MCP 支持:内置 MCP Server,供 AI Agent 查询成本数据(默认关闭、按需开启);
- AI 推理成本追踪:面向基于 vLLM(含 llm-d 及兼容部署)的推理工作负载,提供每百万 token 成本(输入/输出)、KV 缓存修正定价、共享基础设施归因,以及 REST API 与 Prometheus 指标,详见 docs/inference-cost-tracking.md;
- 外部成本接入:通过 OpenCost Plugins 支持 Datadog 等外部成本;
- 自由开源:基于 Apache 2.0 协议分发,见 LICENSE。
快速开始:Helm 安装
OpenCost 目前仅通过官方 Helm Chart 安装与管理,独立的 Kubernetes manifest 文件已被移除,所有安装与升级请一律使用 Helm。
在任意 Kubernetes 1.20+ 集群上快速安装:
helm repo add opencost https://opencost.github.io/opencost-helm-chart helm repo update helm install opencost opencost/opencost面向分片 Prometheus 用户的提示:如果你以分片(HA)方式运行 Prometheus,请将
PROMETHEUS_SERVER_ENDPOINT设置为全局查询端点(如 Thanos Query、Cortex 或 Mimir)。若只指向单个 Prometheus Pod,可能导致导出结果不完整或间歇性缺失。更多细节可参考仓库内 PROMETHEUS.md。
安装完成后,OpenCost 对外暴露的核心使用入口包括:
- Cost APIs:
/allocation、/assets等成本查询接口; - CLI / kubectl cost:命令行成本查看工具;
- Prometheus Metrics:
/metrics端点导出成本指标; - User Interface:基于 opencost-ui 的 Web 界面;
- AI 推理成本追踪:docs/inference-cost-tracking.md。
深入 MCP Server:让 AI Agent 查询成本数据
OpenCost 的 MCP(Model Context Protocol)Server 为 AI Agent 提供标准化的成本分配与资产数据访问接口。它是本仓库 README 中篇幅最大、最值得深入的功能模块,以下从设计原则、部署配置、客户端接入到源码实现逐层展开。
设计原则与关键特性
- 默认关闭(Opt-in):MCP Server 在所有 OpenCost 部署中默认禁用,以最小化攻击面,必须显式开启;
- 完全可控:用户可自由启用、配置端口与各项设置;
- Allocation 查询:支持过滤与聚合的成本分配数据查询;
- Asset 查询:访问节点、磁盘、负载均衡器等资产的详细信息;
- Cloud Cost 查询:支持按提供商、服务、区域过滤的云成本查询;
- HTTP 传输:使用 HTTP 与 MCP 客户端可靠通信;
- 配置简单:通过标准环境变量即可启用;
- Helm 集成:内置于官方 Helm Chart,便于生产部署。
快速开始
开发模式:Tilt
# 克隆并启动带 MCP Server 的 OpenCost # 可能还需要克隆 opencost-ui 与 opencost-helm-charts 仓库 # 确保克隆的仓库与 opencost 位于同一父级目录下 git clone https://github.com/opencost/opencost.git cd opencost tilt up默认配置下,UI 与 Prometheus 都运行在 9090 端口,如需同时访问两者,可能需要端口转发到非默认端口。
关于 Tilt 配置(云成本):仓库根目录的 tilt-values.yaml 包含额外的环境变量,用于在开发环境中启用 Cloud Cost 摄取:
# tilt-values.yaml (excerpt) opencost: exporter: extraEnv: CLOUD_COST_ENABLED: "true" CLOUD_COST_CONFIG_PATH: "/var/cloud-integration/cloud-integration.json"- 将
CLOUD_COST_ENABLED设为"true"以开启云成本摄取; - 将
CLOUD_COST_CONFIG_PATH指向 Tilt 挂载的云集成文件(例如/var/cloud-integration/cloud-integration.json); - 开发过程中可按需调整
tilt-values.yaml中的其他值。
生产模式:Helm
# 添加 OpenCost Helm 仓库 helm repo add opencost https://opencost.github.io/opencost-helm-chart helm repo update # 启用 MCP Server 部署(opt-in) helm install opencost opencost/opencost --set opencost.mcp.enabled=true # 通过端口转发访问 MCP Server(示例) kubectl port-forward svc/opencost 8081:8081Helm 配置汇总
MCP Server 在 Helm Chart 中默认禁用。常见配置项如下:
| 配置 | 命令 | 说明 |
|---|---|---|
| 默认 | helm install opencost opencost/opencost | MCP 默认关闭 |
| 启用 | --set opencost.mcp.enabled=true | 在 8081 端口启用 MCP Server |
| 自定义端口 | --set opencost.mcp.port=9091 | 使用不同端口 |
| 调试模式 | --set opencost.mcp.extraEnv.MCP_LOG_LEVEL=debug | 开启调试日志 |
自定义配置的完整示例:
# 启用 MCP Server helm install opencost opencost/opencost \ --set opencost.mcp.enabled=true # 自定义 MCP 端口 helm install opencost opencost/opencost \ --set opencost.mcp.port=9091 # 开启调试日志 helm install opencost opencost/opencost \ --set opencost.mcp.extraEnv.MCP_LOG_LEVEL=debugMCP 客户端配置
配置你的 MCP 客户端(例如 Cursor)连接到 OpenCost MCP Server:
默认配置(端口 8081):
{ "mcpServers": { "opencost": { "type": "http", "url": "http://localhost:8081" } } }自定义端口配置:
{ "mcpServers": { "opencost": { "type": "http", "url": "http://localhost:9091" } } }Kubernetes 集群内部署:
{ "mcpServers": { "opencost": { "type": "http", "url": "http://opencost.opencost.svc.cluster.local:8081" } } }外部访问(通过 LoadBalancer/Ingress):
{ "mcpServers": { "opencost": { "type": "http", "url": "http://your-opencost-domain.com:8081" } } }可用 MCP 工具
MCP Server 为 AI Agent 提供以下工具:
get_allocation_costs
获取带过滤与聚合的成本分配数据。
| 参数 | 必填 | 说明 |
|---|---|---|
window | 是 | 时间窗口(如"7d"、"1h"、"30m") |
aggregate | 否 | 聚合属性(如"namespace"、"pod"、"node") |
step | 否 | 解析步长大小 |
accumulate | 否 | 是否随时间累积 |
share_idle | 否 | 是否分摊空闲成本 |
include_idle | 否 | 是否包含空闲资源 |
get_asset_costs
获取资产成本数据,包括节点、磁盘、负载均衡器等。
| 参数 | 必填 | 说明 |
|---|---|---|
window | 是 | 时间窗口(如"7d"、"1h"、"30m") |
get_cloud_costs
获取云成本数据,支持提供商、服务、区域过滤。
| 参数 | 必填 | 说明 |
|---|---|---|
window | 是 | 时间窗口(如"7d"、"1h"、"30m") |
aggregate | 否 | 聚合属性(如"provider"、"service"、"region") |
accumulate | 否 | 时间累积("day"、"week"、"month") |
provider | 否 | 按云提供商过滤(如"aws"、"gcp"、"azure") |
service | 否 | 按服务过滤(如"ec2"、"compute"、"s3") |
category | 否 | 按类别过滤(如"compute"、"storage"、"network") |
region | 否 | 按区域过滤(如"us-west-1"、"us-central1") |
accountID | 否 | 按账户 ID 过滤 |
get_efficiency
获取资源效率指标,包含规格建议(rightsizing)与成本节约分析。
| 参数 | 必填 | 说明 |
|---|---|---|
window | 是 | 时间窗口(如"7d"、"1h"、"30m") |
aggregate | 否 | 聚合属性(如"pod"、"namespace"、"controller") |
filter | 否 | 分配数据的过滤表达式 |
buffer_multiplier | 否 | 建议缓冲倍数(默认 1.2,即 20% 余量) |
step | 否 | 查询步长(如"1h"、"6h");更小的步长通过分批处理大窗口降低峰值内存,但可能增加查询时间/请求数 |
支持的资产类型
- Node:计算实例,含 CPU、RAM、GPU 详情;
- Disk:存储卷,含用量与成本分解;
- LoadBalancer:负载均衡实例,含 IP 与私有状态;
- Network:网络相关成本与用量;
- Cloud:云服务成本,含信用(credit)信息;
- ClusterManagement:Kubernetes 集群管理成本。
示例用法
配置完成后,AI Agent 可以这样查询成本数据:
// 获取最近 7 天的成本分配 const allocation = await mcpClient.callTool('get_allocation_costs', { window: '7d', aggregate: 'namespace,node' }); // 获取最近 24 小时的资产成本 const assets = await mcpClient.callTool('get_asset_costs', { window: '1d' }); // 获取 AWS EC2 在 us-west-1 的云成本 const cloudCosts = await mcpClient.callTool('get_cloud_costs', { window: '7d', aggregate: 'service', provider: 'aws', service: 'ec2', accumulate: 'day', filter: 'regionID:"us-west-1"' }); // 获取效率指标与规格建议 const efficiency = await mcpClient.callTool('get_efficiency', { window: '7d', aggregate: 'namespace,controller', step: '6h', buffer_multiplier: 1.2 });源码级剖析:MCP Server 的实现原理
MCP Server 的实现集中在 pkg/mcp/server.go,下面结合该文件与相关模块,梳理请求从进入到返回的完整链路。
查询类型与请求模型
QueryType定义了四种查询类型,与 MCP 工具一一对应:
allocation— 成本分配查询;asset— 资产查询;cloudcost— 云成本查询;efficiency— 效率与规格建议查询。
统一请求结构OpenCostQueryRequest包含必填的QueryType与Window字段,并通过validate:"required,oneof=allocation asset cloudcost efficiency"做结构校验,杜绝非法类型进入处理流程。不同查询类型携带各自的参数结构(AllocationParams、AssetParams、CloudCostParams、EfficiencyParams)。
请求处理主流程
ProcessMCPRequest是 MCP Server 的核心入口,其流程为:
- 校验请求:通过
validator校验QueryType与Window等必填字段; - 查询分发:根据
QueryType分发到对应的QueryAllocations、QueryAssets、QueryCloudCosts、QueryEfficiency; - 浮点净化:调用
sanitizeNonFiniteFloats将计算结果中的 NaN/±Inf 替换为 0——因为 MCP SDK 使用encoding/json序列化工具输出,而上游成本计算可能产生非有限浮点数(如 0/0 分解或开销比例),若不清理会导致整个工具调用失败; - 构造响应:包装
Data与QueryInfo(含随机生成的QueryID、时间戳、处理耗时)。
该函数接受context.Context,支持超时处理与取消。
各查询类型的实现要点
- QueryAllocations:先通过
opencost.ParseWindowWithOffset解析窗口,step默认取整个窗口时长;aggregate按逗号拆分;若传入filter字符串则用 allocation 过滤器解析器校验;最终调用costModel.QueryAllocation并转换为 MCP 响应格式。返回的Allocation包含 CPU/GPU/RAM/PV/网络/共享/外部成本的明细及对应的用量指标(CPU 核时、RAM 字节时等)。 - QueryAssets:仅需
window,通过costModel.ComputeAssets(start, end)计算资产集合,再按资产类型(Disk、Node、LoadBalancer、Network、Cloud、ClusterManagement)提取各自专属字段——例如 Node 的CPUCoreHours、GPUCount、Discount、Preemptible及 CPU/RAM 分解,Disk 的StorageClass、ClaimName、ByteHoursUsed等。 - QueryCloudCosts:需要 CloudCost Querier(未配置时返回错误,提示检查 cloud-integration.json)。它构建
cloudcost.QueryRequest,将provider、service、category、accountID、invoiceEntityID、labels等参数转换为过滤表达式,并以AND逻辑组合后交给过滤器解析器处理;查询使用env.GetMCPQueryTimeout()提供的超时上下文。响应中的CloudCostSummary汇总了净成本、摊销成本、开票成本,以及按提供商/服务/区域拆分的成本分解,还有按净成本加权的 Kubernetes 占比。 - QueryEfficiency:默认按
pod聚合,buffer_multiplier默认 1.2(即保留 20% 余量)。step未指定时由defaultEfficiencyStep按窗口时长自动缩放(≥30 天取 24h,≥7 天取 6h,≥1 天取 1h,否则取整个窗口),以控制大窗口查询的峰值内存;各 allocation set 通过 goroutine 并发计算效率指标。computeEfficiencyMetric以“实际用量 / 请求量”计算 CPU 与内存效率,推荐值 = 实际用量 × 缓冲倍数,并设最小下限(CPU 0.001 核、RAM 1MB),再基于请求量(而非用量)的单价估算推荐成本与节约额。测试用例见 pkg/mcp/server_test.go。
环境变量与集成点
MCP Server 的开关与端口由 pkg/env/costmodel.go 中的环境变量控制:
MCP_SERVER_ENABLED:是否启用 MCP Server(默认关闭);MCP_HTTP_PORT:MCP HTTP 端口;MCP_QUERY_TIMEOUT_SECONDS:云成本等查询的超时秒数,默认 60 秒(实现见 pkg/env/opencost.go 的GetMCPQueryTimeout)。
在 pkg/cmd/costmodel/costmodel.go 中,当MCPServerEnabled && Kubernetes 可用时调用StartMCPServer启动服务;若启用了 Cloud Cost,还会将 CloudCost Querier 注入 MCP Server,使get_cloud_costs可用。若 MCP 已启用但 Kubernetes 不可用,则会记录告警日志。此外,在 Kubernetes 未启用时,若MCP_SERVER_ENABLED未设置,会提示“MCP server 默认关闭,如需使用请设置该环境变量为 true”。
延伸:AI 推理成本追踪
README 中重点提及的AI inference cost tracking是 OpenCost 面向生成式 AI 场景的能力:它收集 vLLM 暴露的 token 指标(prompt_tokens_total、generation_tokens_total、prefill/decode 时序、KV 缓存命中),结合 OpenCost 分配层的 GPU/CPU/RAM/共享基础设施成本,在allocation与usage两种成本口径下计算混合及区分输入/输出的每百万 token 成本,并通过 Prometheus gauge 指标与/inferenceCost/total、/inferenceCost/timeseries两个 REST API 对外提供。启用方式为设置INFERENCE_COST_ENABLED=true。完整的环境变量表、指标语义、成本计算示例与故障排查,请阅读 docs/inference-cost-tracking.md。
结语
OpenCost 以“规范 + Go 实现”的开放形态,覆盖了从集群内资源分配到多云账单、从传统成本监控到 AI 推理成本追踪的完整成本观测链条;而 MCP Server 的加入,则让 AI Agent 能以标准协议直接消费这些成本数据,为智能化的成本治理、资源优化与自动报告打开了新的入口。从 README.md 出发,配合 spec/opencost-specv01.md、pkg/mcp/server.go 与 docs/inference-cost-tracking.md,你可以按需选择并落地 OpenCost 的每一项能力。
【免费下载链接】opencostCost monitoring for Kubernetes workloads and cloud costs项目地址: https://gitcode.com/GitHub_Trending/op/opencost
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考