节俭MCP
弗鲁加利亚 是一个GKE FinOps MCP(模型上下文协议)服务器,使AI代理能够自动识别和执行Kubernetes成本优化机会。
概述
建筑
%%{init: {'theme':'base', 'themeVariables': { 'background':'#ffffff', 'mainBkg':'#ffffff', 'secondBkg':'#ffffff', 'tertiaryBkg':'#ffffff', 'primaryColor':'#e1f5ff', 'primaryTextColor':'#000', 'primaryBorderColor':'#0288d1', 'lineColor':'#666', 'secondaryColor':'#fff3e0', 'tertiaryColor':'#f3e5f5', 'clusterBkg':'#e1f5ff', 'clusterBorder':'#0288d1', 'edgeLabelBackground':'#ffffff' }}}%%
flowchart BT
subgraph ns_monitoring["Namespace: monitoring"]
AlertRule["PrometheusRule
(e.g., frugalia-zombie-pv)"]
PromManager["Prometheus / AlertManager"]
end
subgraph MCP_Servers["MCP Servers"]
FrugaliaMCP["MCPServer
frugalia-mcp"]
GenAIMCP["MCPServer
genai-toolbox-mcp"]
SlackMCP["MCPServer
slack-mcp"]
end
subgraph ns_kagent["Namespace: kagent"]
CronJobs["CronJobs
(e.g., zombie-resources)"]
Webhook["Deployment/Service
alert-webhook"]
Agent["Agent
frugalia-agent"]
RemoteMCP["RemoteMCPServer
agw-mcp-servers"]
Gateway["kgateway
(mcp-gateway + mcp-route)"]
MCP_Servers
end
subgraph GKE["GKE Cluster"]
ns_monitoring
ns_kagent
end
AlertRule -- Triggers --> PromManager
Webhook -- kagent invoke
(Event-Driven) --> Agent
CronJobs -- kagent invoke
(Scheduled Tasks) --> Agent
Agent -- Requests Tools --> RemoteMCP
RemoteMCP -- Routes secure traffic --> Gateway
Gateway -- Routes to tool --> FrugaliaMCP & GenAIMCP & SlackMCP
PromManager -- Webhook Payload
POST /webhook/alertmanager --> Webhook
FrugaliaMCP -. Queries P99 Metrics .-> PromManager
FrugaliaMCP -. Read/Patch Resources .-> K8sAPI[("Kubernetes API")]
GenAIMCP -. Queries Billing Data .-> BigQuery[("GCP BigQuery")]
SlackMCP -. Sends Final Report .-> SlackAPI[("Slack API")]
FrugaliaMCP:::mcp
GenAIMCP:::mcp
SlackMCP:::mcp
Webhook:::webhook
CronJobs:::cronjob
Agent:::agent
K8sAPI:::external
BigQuery:::external
SlackAPI:::external
classDef k8s fill:#326ce5,stroke:#fff,stroke-width:2px,color:#fff
classDef agent fill:#10b981,stroke:#fff,stroke-width:2px,color:#fff
classDef mcp fill:#8b5cf6,stroke:#fff,stroke-width:2px,color:#fff
classDef webhook fill:#f59e0b,stroke:#fff,stroke-width:2px,color:#fff
classDef cronjob fill:#eab308,stroke:#fff,stroke-width:2px,color:#fff
classDef external fill:#475569,stroke:#fff,stroke-width:2px,color:#fffFrugalia为AI代理提供了支持(与 智能体)分析GKE集群并推荐成本节约措施:
- 合理精简:减少过度配置工作负载的CPU/内存请求
- 僵尸检测:识别并删除未使用的资源(PVC、PV、负载均衡器)
- 定点迁移:将无状态工作负载移动到Spot实例,可节省60-70%的成本
特性
- 实时Kubernetes API集成和Prometheus P99使用指标
- 安全第一:Spot迁移前的PodDisruption预算验证
- 具有genai工具箱(BigQuery计费)和Slack的双MCP架构
- 8个MCP工具+4个定时CronJobs+事件驱动的Prometheus AlertManager webhook
项目结构
frugalia-mcp/
├── src/
│ ├── tools/ # 8 MCP tools (analyze_rightsizing, detect_zombie_resources, etc.)
│ └── core/ # FastMCP server + Prometheus utils
├── kubernetes/
│ ├── cronjobs/ # 4 scheduled CronJobs (nightly FinOps workflows)
│ ├── prometheus-alerts/ # AlertManager PrometheusRules + alertmanager-values
│ ├── frugalia-agent.yaml # kagent Agent definition
│ ├── frugalia-mcp.yaml # MCPServer (frugalia-mcp)
│ ├── genai-toolbox-mcp.yaml # MCPServer (BigQuery billing) + ConfigMap/Secret
│ ├── slack-mcp.yaml # MCPServer (Slack)
│ ├── rbac.yaml # ClusterRole + ServiceAccount
│ ├── remotemcp.yaml # RemoteMCPServer (agw-mcp-servers)
│ ├── gateway.yaml # kgateway + MCPRoute
│ ├── backend.yaml # Backend resources
│ ├── httproute.yaml # HTTPRoute
│ └── trafficpolicy.yaml # TrafficPolicy
├── event-driven-webhook/ # FastAPI webhook receiver for AlertManager
│ ├── main.py # POST /webhook/alertmanager → kagent invoke
│ ├── Dockerfile # Python 3.10 + kagent CLI
│ ├── requirements.txt
│ └── even-driver-webhook-deployment.yaml
├── kagent-cmd/ # Minimal image for CronJob invocations
│ └── Dockerfile # Debian + kubectl + kagent CLI
├── .github/workflows/
│ └── docker-build.yaml # CI/CD: build, scan (Trivy), push to Docker Hub
└── kmcp.yaml # MCP configurationDocker镜像
CI/CD管道构建并推送到Docker Hub的三个映像:
| 图片 | 来源 | 描述 |
|---|---|---|
salvadorarreola/frugalia-mcp | Dockerfile | FastMCP服务器:8个K8s/Prometheus工具 |
salvadorarreola/kagent-cmd | kagent-cmd/Dockerfile | CronJob调用的最小运行器 |
salvadorarreola/event-driven-webhook | event-driven-webhook/Dockerfile | AlertManager webhook接收器 |
CI/CD管道
GitHub操作工作流(.github/workflows/docker-build.yaml)在版本标签上运行(v*.*.*, b*.*.*)或手动调度:
build (matrix: 3 images)
└── scan (Trivy: filesystem vulns, misconfigs, secrets + image CRITICAL scan)
└── push-dockerhub (matrix: 3 images) ← only on tags or main branch- 构建通过GitHub Actions Cache缓存(每个映像范围)
- 图像作为工件在作业之间传递
- 推步需要
DOCKERHUB_USERNAME和DOCKERHUB_TOKEN存储库机密
快速开始
本地开发
# Install dependencies
uv sync
# Configure Prometheus
export PROMETHEUS_URL="http://localhost:9090"
# Run server
uv run python src/main.pyKubernetes部署
# Core components
kubectl apply -f kubernetes/rbac.yaml
kubectl apply -f kubernetes/frugalia-mcp.yaml
kubectl apply -f kubernetes/genai-toolbox-mcp.yaml
kubectl apply -f kubernetes/slack-mcp.yaml
kubectl apply -f kubernetes/remotemcp.yaml
kubectl apply -f kubernetes/gateway.yaml
kubectl apply -f kubernetes/frugalia-agent.yaml
# Scheduled CronJobs
kubectl apply -f kubernetes/cronjobs/
# Event-driven webhook
kubectl apply -f event-driven-webhook/even-driver-webhook-deployment.yaml
# Prometheus alerts
kubectl apply -f kubernetes/prometheus-alerts/
# Verify
kubectl get agent frugalia-agent -n kagent
kubectl get cronjobs -n kagent
kubectl get deployment alert-webhook -n kagent
kubectl logs -n kagent -l app=frugalia -fMCP工具
8核心工具:
analyze_rightsizing:分析CPU/内存使用情况与请求(P99超过7天)detect_zombie_resources:查找未使用的PVC、PV和负载平衡器identify_spot_candidates:标识可安全进行Spot迁移的无状态工作负载check_nodepool_types:验证Spot节点池的可用性check_node_utilization:检测未充分利用的节点以优化装箱get_kubernetes_resources:查询K8s资源(Pod、部署、PDB等)get_prometheus_metrics:执行PromQL查询apply_resource_patch:应用K8s补丁(需要批准)
计划的CronJobs
四个CronJobs每晚在 kagent 命名空间使用 salvadorarreola/kagent-cmd 图像。所有时间都是 美国/墨西哥城.
| CronJob | 计划 | 工作流 |
|---|---|---|
frugalia-node-utilization | 0 20 * * * (晚上8点) | 节点利用率:装箱、未充分利用的节点检测 |
frugalia-rightsizing-audit | 0 21 * * * (晚上9点) | 调整规模:过度配置部署,节省CPU/内存 |
frugalia-spot-migration | 0 22 * * * (晚上10点) | 现场迁移:现场候选、PDB安全、成本节约 |
frugalia-zombie-resources | 0 23 * * * (晚上11点) | 僵尸检测:未使用的PVC、PV、负载均衡器、清理 |
每个CronJob都会调用 frugalia-agent 通过 kagent invoke 代理向Slack发送最终报告。
事件驱动的Webhook
这 alert-webhook 部署(event-driven-webhook/)从Prometheus AlertManager接收POST请求 /webhook/alertmanager.对于每一个 解雇 包含以下内容的警报 action 注释,它调用 kagent invoke 触发 frugalia-agent.
环境变量:
KAGENT_URL:kagent控制器终结点(默认值:http://kagent-controller.kagent.svc:8083)AGENT_NAME:目标代理名称(默认值:frugalia-agent)
Prometheus警报管理器配置(alertmanager-values.yaml): 将接收器URL指向 http://alert-webhook.kagent.svc/webhook/alertmanager.
AI代理工作流
工作流程A:定点迁移:识别无状态工作负载并迁移到Spot节点(节省60-70%)。验证PDB安全性和节点池可用性。
工作流程B:僵尸检测:查找未使用的资源(PVC、PV、LoadBalancer),计算成本,建议清理并获得批准。
工作流C:节点优化:检测未充分利用的节点,分析装箱机会,瞄准 kube:unallocated BigQuery计费中的成本。
所有工作流都与BigQuery(genai工具箱)集成,用于成本分析并将报告发送到Slack。
配置
环境变量:
PROMETHEUS_URL:Prometheus服务器端点(默认值:http://prometheus-kube-prometheus-prometheus.monitoring:9090)
RBAC权限 (参见 kubernetes/rbac.yaml):
- 阅读:Pod、部署、服务、PVC/PV、节点、PDB、事件、命名空间
- 写入:部署(补丁/更新/扩展)、服务/PVC/PV(删除)
所需的秘密:
DOCKERHUB_USERNAME/DOCKERHUB_TOKEN:Docker Hub推送凭据(GitHub操作)genai-toolbox-variables:BigQuery项目/数据集/表配置(Kubernetes Secret)
添加自定义工具
kmcp add-tool my_custom_tool
# Edit src/tools/my_custom_tool.py with @mcp.tool() decorator
uv run pytest tests/
kmcp build && kubectl apply -f kubernetes/frugalia-mcp.yaml发展
# Local testing
kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-prometheus 9090:9090
export PROMETHEUS_URL="http://localhost:9090"
uv run python src/main.py
# Build and deploy
docker build -t salvadorarreola/frugalia-mcp:latest .
docker build -t salvadorarreola/kagent-cmd:latest kagent-cmd/
docker build -t salvadorarreola/event-driven-webhook:latest event-driven-webhook/故障排除
- RBAC问题:
kubectl get clusterrolebinding frugalia-mcp并检查服务帐户 - 普罗米修斯失败: 验证
PROMETHEUS_URL吊舱环境和测试连接性 - 工具未加载: 检查
kubectl logs -n kagent -l app=frugalia-mcp - Webhook未触发: 检查
kubectl logs -n kagent -l app=alert-webhook并验证AlertManager接收器URL - CronJob未运行: 检查
kubectl get jobs -n kagent和kubectl describe cronjob -n kagent
许可证
麻省理工学院
