k8s实验室MCP服务器
A. 模型上下文协议(MCP) k8s实验室项目的服务器。它暴露了 只读Kubernetes集群可见性, Grafana Loki日志访问,以及 普罗米修斯指标API(v1) 到编码代理(例如Cursor) 超文本传输协议 使用Streamable传输,因此助手可以在没有shell访问的情况下检查工作负载、日志和指标。
堆放和运输
| 工件 | 详细信息 |
|---|---|
| 框架 | Spring Boot(参见 pom.xml) |
| MCP | spring-ai-starter-mcp-server-webmvc (春天AI 2.0.0-M3) |
| Kubernetes | Fabric8 kubernetes-client --所有集群工具都使用 Kubernetes API 通过Java(仅列表/获取;无创建/更新/删除、执行或端口转发) |
| 日志 | Spring声明式HTTP客户端(@HttpExchange)到洛基(/loki/api/v1/*),配置在 spring.http.serviceclient.loki |
| 度量 | 普罗米修斯的模式相同(/api/v1/* 在界面上),配置如下 spring.http.serviceclient.prometheus |
| 默认端口 | 9000 (server.port 在 src/main/resources/application.yaml) |
MCP服务器元数据 application.yaml: spring.ai.mcp.server — protocol: streamable, stdio: false, type: sync, version: 0.1.1.
弹簧靴执行器暴露 health 和 info 在管理web基本路径下(默认值适用)。
配置
HTTP服务客户端(spring.http.serviceclient)
弹簧靴绑定 base-url, connect-timeout,以及 read-timeout 每 客户名称。名称必须与 group 在 @ImportHttpServices(group = "…", …) 关于相应 @Configuration 班级(loki → LokiLogQueries, prometheus → PrometheusMetricQueries).
洛基 (spring.http.serviceclient.loki):
base-url--默认值http://loki.k8s.labconnect-timeout,read-timeout--默认值10s/30s
普罗米修斯 (spring.http.serviceclient.prometheus):
base-url--默认值http://prometheus.k8s.lab(仅限原产地;API前缀/api/v1继续存在PrometheusMetricQueries,不在base-url)connect-timeout,read-timeout--默认值10s/30s
可选Grafana基本身份验证 对于洛基(mcp.monitoring.loki):
username/password--经常从env绑定GRAFANA_USERNAME和GRAFANA_PASSWORD(参见application.yaml)
Kubernetes客户端 (Fabric8使用标准的kubeconfig发现,除非被覆盖):
- 在Docker中(
Dockerfile),KUBECONFIG=/app/kubeconfig为绑定挂载的kubeconfig设置。
MCP Kubernetes调优 (mcp.kubernetes):
max-events--帽子get-events(默认值500)connection-timeout,read-timeout-API服务器超时(默认值10s/30s)
洛基/普罗米修斯JSON和MCP客户端 (mcp.tool-response):
serialize-top-level-data-json-array(默认值true)--当工具输出为具有顶级JSON时data数组,它可以被重写为JSON字符串,这样一些MCP客户端就可以保留有效载荷。吃起来false如果你需要原始的洛基风格数组。
当前工具(已实施)
集群(通过Fabric8的Kubernetes API)
top-nodes 和 top-pods 需要 度量服务器 在集群中;否则,工具将返回一个明确的错误字符串。
| 工具 | 说明 |
|---|---|
cluster-status | 节点条件、kubelet版本、Ready/NotReady计数 |
list-namespaces | 包含名称、状态和年龄的命名空间 |
list-pods | 带有状态、重启、年龄的Pod。可选: namespace (默认全部), labelSelector (单人 key=value;不支持逗号分隔的选择器), podPhaseFilter (ALL, RUNNING, PENDING, FAILED, SUCCEEDED, UNKNOWN) |
describe-pod | Pod详细信息:事件、容器状态、资源限制。必修的: namespace, podName |
list-deployments | 所需/准备好的副本、图像标签、推出。可选: namespace (默认全部) |
list-services | 类型、ClusterIP、端口、选择器。可选: namespace (默认全部) |
get-events | 最近的事件;可选的 namespace, involvedObjectKind, involvedObjectName |
top-nodes | 每个节点的CPU和内存(指标API) |
top-pods | 每个吊舱的CPU和内存。可选: namespace (默认全部) |
实施生活在 SystemTools → ClusterResourceService → Fabric8ClusterResourceQueries.
日志(Loki HTTP API)
时间戳是 Unix纪元纳秒 除非特别注明。Loki的响应返回为 JSON文本 对于模型(取决于 mcp.tool-response 上文)。
| 工具 | 说明 |
|---|---|
list-loki-labels | 标签名称;可选的 startNanosInclusive, endNanosInclusive, namespace (范围通过 match={namespace="…"}).不要使用 0 用于开始/结束(历元窗口通常为空) |
list-loki-label-values | 一个人的价值观 labelName;可选开始/结束纳秒,可选 namespace 范围 |
list-loki-series | 流标签集;必需的 streamSelector, startNanosInclusive, endNanosInclusive;可选 additionalStreamSelectors (额外 match[],交叉口) |
query-logs | 时间范围日志通过 query_range: query, startNanosInclusive, endNanosInclusive;可选 limit, direction (FORWARD / BACKWARD) |
tail-logs | 近一瞬间的最新行: query, startNanosInclusive (截至最后 窗户);1小时回顾,回顾 query_range.可选 limit, delayForSeconds (摄入滞后)。 不 实时WebSocket跟踪 |
实施生活在 LogTools → LokiLogService → LokiLogQueries.
度量(Prometheus HTTP API v1)
答案是 普罗米修斯JSON (status, data等等)作为文本。查询次数使用 RFC3339或Unix秒 如在普罗米修斯API中。旨在 kube-prometheus堆栈 或任何暴露该标准的服务器 **/api/v1/*** 路线。
| 区域 | 工具 |
|---|---|
| 查询 | prometheus-query (瞬间), prometheus-query-range (需要 query, start, end, step), prometheus-query-exemplars, prometheus-parse-query, prometheus-format-query |
| TSDB/元数据 | list-prometheus-labels, list-prometheus-label-values, list-prometheus-series, prometheus-metadata |
| 目标和规则 | prometheus-targets, prometheus-targets-metadata, prometheus-scrape-pools, prometheus-alerts, prometheus-rules, prometheus-alertmanagers, prometheus-notifications |
| 服务器状态 | prometheus-status-buildinfo, prometheus-status-config, prometheus-status-flags, prometheus-status-runtimeinfo, prometheus-status-tsdb, prometheus-status-tsdb-blocks, prometheus-status-walreplay |
| 其他 | prometheus-features |
注: 如果你打电话 prometheus-rules 带着一个 group_limit 查询参数,Prometheus要求它是 大于零; 0 回报 400 bad_data.
实施生活在 MetricTools → PrometheusMetricService → PrometheusMetricQueries (@HttpExchange("/api/v1")),通过以下方式连接 PrometheusHttpClientConfiguration 和 spring.http.serviceclient.prometheus.
在集群中运行
群集设置: 从以下位置提供K8s实验室平台(多节点K3、监控、GitOps和相关布线) 尼利斯/集群基础设施该存储库是VM、k3s、Argo CD、Jenkins和可观测性堆栈的真实来源;在对实验室运行此MCP服务器之前部署它。
运行时间期望: 服务器旨在运行 旁边 集群(例如,在Jenkins/build主机或其他可以访问Kubernetes API、Loki和Prometheus的虚拟机上),不一定是集群内的Pod,尽管如果安装凭据并指向 spring.http.serviceclient.loki.base-url 和 spring.http.serviceclient.prometheus.base-url 可解析URL(在集群服务或实验室DNS中,如 loki.k8s.lab / prometheus.k8s.lab).
- 塑造形象 从该目录(请参见
Dockerfile):
cd mcp
docker build -t mcp-server:latest .- 运行容器 带着一个 只读kubeconfig 安装在图像所需的位置(
KUBECONFIG=/app/kubeconfig):
docker run -d \
--name mcp-server \
--restart=unless-stopped \
--memory=512m --memory-swap=512m \
--network=host \
-e SPRING_PROFILES_ACTIVE=runner \
-e GRAFANA_USERNAME="..." \
-e GRAFANA_PASSWORD="..." \
-v /path/to/kubeconfig:/app/kubeconfig:ro \
mcp-server:latest使用 --network=host (或其他网络模式),因此主机名如下 loki.k8s.lab 和 prometheus.k8s.lab 从 application.yaml 解决方法与在实验室机器上相同。如果Loki在您的网络上打开,请省略或调整Grafana env变量。
- 验证: 执行器健康状况和MCP HTTP端点(典型路径):
- http://:9000/actuator/health - http://:9000/mcp
图像详细信息: Dockerfile 将JAR打包为 -Xmx384m,用户 mcp,暴露端口 9000.
计划功能(尚未实施)
这些匹配中的空工具类和注释配置 application.yaml他们是 路线图 物品,而不是装运的工具。
| 区域 | 意图 | 代码/配置提示 |
|---|---|---|
| GitOps | Argo CD应用状态、同步、差异;可能的Jenkins集成 | GitOpsTools.java (存根);评论 argoCD / jenkins 在...之下 spring.http.serviceclient 和 mcp.git-ops |
| 复合/便利 | 单调用工作流(例如结合事件、日志、指标的pod诊断) | CompoundTools.java (存根)——早期设计示例: diagnose-pod, namespace-overview |
| 其他运输工具 | 今天 stdio: false;稍后可以添加stdio或其他MCP部署模式 | spring.ai.mcp.server |
实施后,此部分应缩小,工具应移入 当前工具 具有精确的参数和支持API。
