使用说明
k8s mcp
用于Kubernetes集群管理和资源查看的模型上下文协议(MCP)服务器。
特性
- 🔗 通过HTTP/SSE连接到Kubernetes集群
- 👀 查看Kubernetes资源(只读)
- 🛡️ 使用令牌身份验证进行安全访问
- 📊 用于集群管理的综合工具集
- 🔒 为安全起见,对机密数据进行编辑
- 🚀 由Cobra和Viper提供支持的CLI
建筑
- MCP服务器 (Golang):通过HTTP/SSE提供k8s集群连接和资源查看功能
- MCP客户端 (Golang):测试客户端以验证服务器功能
- pkg/mcpclient (Golang):可重用的客户端库,用于将MCP功能集成到其他Go应用程序中
快速开始
先决条件
- 转到1.23或更高版本
- kubectl配置了集群访问权限
- 有效的kubeconfig文件
- TLS证书和密钥(对于HTTPS模式,默认)
建筑
# Build MCP server
go build -o bin/k8s-mcp-server ./cmd/server
# Build test client
go build -o bin/k8s-mcp-client ./cmd/client
跑步
1.生成TLS证书(用于HTTPS模式)
# Generate a self-signed certificate for testing
openssl req -x509 -newkey rsa:4096 -nodes -days 365 -keyout key.pem -out cert.pem -subj "/CN=localhost"
2.启动MCP服务器
# Using command line flags
./bin/k8s-mcp-server --token my-secret-token --cert cert.pem --key key.pem
# Using environment variables (flags override env vars)
export MCP_TOKEN=my-secret-token
export MCP_CERT=cert.pem
export MCP_KEY=key.pem
./bin/k8s-mcp-server
3.与客户进行测试
# Connect to HTTPS server
./bin/k8s-mcp-client --server https://localhost:8443 --token my-secret-token
# Connect to HTTP server
./bin/k8s-mcp-client --server http://localhost:8443 --token my-secret-token --insecure-skip-verify
配置
服务器支持通过命令行标志和环境变量进行配置。
服务器配置
| 标志 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
--port |
MCP_PORT |
8443 | 要监听的端口 |
--cert |
MCP_CERT |
TLS证书文件的路径(HTTPS需要) | |
--key |
MCP_KEY |
TLS密钥文件的路径(HTTPS需要) | |
--insecure |
MCP_INSECURE |
false | 在不安全的HTTP模式下运行(默认为HTTPS) |
--token |
MCP_TOKEN |
身份验证令牌(必需) | |
--kubeconfig |
MCP_KUBECONFIG |
kubeconfig文件的路径(可选) |
日志记录配置
该服务器提供了一个基于Uber Zap和Lumberjack的综合日志系统。
| 标志 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
--log-level |
info | 日志级别(调试、信息、警告、错误) | |
--log-format |
text | 日志格式(json、text) | |
--log-to-file |
false(服务器:true) | 启用文件日志记录(服务器默认为true) | |
--log-file |
logs/app.log | 日志文件路径 | |
--log-max-size |
100 | 每个日志文件的最大大小(MB) | |
--log-max-backups |
3 | 要保留的旧日志文件的最大数量 | |
--log-max-age |
30 | 保留旧日志文件的最大天数 | |
--log-compress |
true | 是否压缩旧日志文件 | |
--log-caller |
true | 是否包含调用者信息(文件和行) | |
--log-stacktrace |
false | 是否在错误级别包含堆栈跟踪 |
当 --log-to-file 启用后,日志将写入stdout/stderr和指定的日志文件。日志记录系统根据备份的大小、时间和数量自动处理日志轮换。
客户端配置
| 标志 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
--server |
MCP_CLIENT_SERVER |
https://localhost:8443 | MCP服务器URL |
--token |
MCP_CLIENT_TOKEN |
身份验证令牌(必需) | |
--insecure-skip-verify |
MCP_CLIENT_INSECURE_SKIP_VERIFY |
false | 跳过TLS证书验证 |
MCP工具
服务器提供以下工具:
群集管理
get_cluster_status:获取集群状态信息(版本、节点计数、命名空间计数)list_nodes:列出群集中的所有节点list_namespaces:列出群集中的所有命名空间
资源管理
-
list_pods:列出命名空间中的Pod -
list_services:列出命名空间中的服务 -
list_deployments:列出命名空间中的部署 -
get_resource:获取特定资源的详细信息(JSON格式)。秘密将被编辑。 -
get_resource_yaml:获取资源的完整YAML定义。秘密将被编辑。
可观察性和调试
get_events:获取集群事件get_pod_logs:获取pod日志。默认尾线=100,最大字节数=1MB
安全
check_rbac_permission:检查当前用户是否有权限执行操作(kubectl auth-can-i)
安全
- 默认情况下,所有操作都是只读的
- 所有连接都需要基于令牌的身份验证
- 检索到机密数据时会自动编辑
- 支持RBAC权限验证
- 安全的kubeconfig处理
- 连接超时和重试机制
整合
用作图书馆
这 pkg/mcpclient 包可以导入并用于其他Go应用程序:
package main
import (
"context"
"fmt"
"log"
"github.com/AceDarkknight/k8s-mcp/pkg/mcpclient"
)
func main() {
// Create configuration
config := mcpclient.Config{
ServerURL: "https://localhost:8443",
AuthToken: "your-token",
InsecureSkipVerify: true,
}
// Create client with optional custom headers
client, err := mcpclient.NewClient(config,
mcpclient.WithHeader("X-Custom-Header", "value"),
)
if err != nil {
log.Fatal(err)
}
defer client.Close()
// Connect to server
ctx := context.Background()
if err := client.Connect(ctx); err != nil {
log.Fatal(err)
}
// List tools
tools, err := client.ListTools(ctx)
if err != nil {
log.Fatal(err)
}
for _, tool := range tools {
fmt.Printf("Tool: %s\n", tool.Name)
}
// Call a tool
result, err := client.CallTool(ctx, "get_cluster_status", nil)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Result: %v\n", result)
}
有关更多详细信息,请参阅 pkg/mcpclient/README.md.
MCP协议集成
k8s-mcp遵循标准mcp协议,可以集成到任何兼容mcp的应用程序中:
- 克劳德桌面:AI助手可以查看和分析Kubernetes资源
- VS Code:通过MCP扩展获取Kubernetes上下文
- 自定义应用程序:使用MCP客户端库进行集成
发展
要添加新功能,请执行以下操作:
- 新工具:在中添加新的工具定义和处理程序函数
internal/mcp/server.go - 新资源:在中添加新的资源类型
internal/k8s/resources.go
该项目采用模块化设计,便于扩展和维护。