kubectl MCP服务器
一个模型上下文协议(MCP)服务器,通过以下方式提供对Kubernetes集群的只读访问 kubectl,明确阻止Secrets访问。
特性
- 只读操作:只允许使用安全的只读kubectl动词
- 秘密被封锁:显式阻止对Kubernetes Secrets的任何访问
- 壳牌保险箱:不允许使用shell元字符,防止命令注入
- 可配置的:支持配置文件和环境变量
- 优雅关闭:正确处理信号情报/信号
安装
npm install用法
作为HTTP MCP服务器
服务器作为HTTP服务器运行,可以通过网络访问:
node index.js默认情况下,服务器会监听 http://0.0.0.0:3005
配置
配置可以通过以下方式提供:
- 配置文件 (按顺序检查):
- 中指定的路径 KUBECTL_MCP_CONFIG 环境变量 - ./kubectl-mcp.json 在当前目录中 - ~/.kubectl-mcp.json 在主目录中
- 环境变量:
- KUBECTL_PATH -kubectl二进制文件的路径(默认: kubectl) - KUBECTL_MCP_LOG_LEVEL -日志级别:调试、信息、警告、错误、静默(默认值: info) - KUBECTL_MCP_CONFIG -配置文件的路径 - PORT -HTTP服务器端口(默认值: 3005) - HOST -HTTP服务器主机(默认值: 0.0.0.0)
示例 kubectl-mcp.json:
{
"kubectlPath": "kubectl",
"logLevel": "info",
"port": 3005,
"host": "0.0.0.0",
"additionalResources": [],
"additionalFlags": []
}使用MCP客户端(网络接入)
服务器公开以下HTTP端点:
- 发布
/mcp-主MCP协议端点 - 获取
/health-健康检查端点 - 获取
/sse-用于流式传输的服务器发送事件端点
要通过网络从MCP客户端连接:
// Example connection
const mcpEndpoint = 'http://your-server-ip:3005/mcp';
// To list tools
const response = await fetch(mcpEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/list',
params: {}
})
});
// To call kubectl tool
const response = await fetch(mcpEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 2,
method: 'tools/call',
params: {
name: 'kubectl',
arguments: {
command: 'get pods -n default'
}
}
})
});可用工具
kubectl
执行只读kubectl命令。
输入:
command(string):kubectl命令为字符串(例如。,"get pods -n default")- 或
args(array):kubectl命令作为数组(例如。,["get", "pods", "-n", "default"])
例子:
{
"name": "kubectl",
"arguments": {
"command": "get pods -n kube-system"
}
}kubectl_status
获取kubectl代理服务器的状态信息。
例子:
{
"name": "kubectl_status",
"arguments": {}
}安全策略
允许的动词
get-获取资源describe-描述资源logs-查看容器日志top-显示资源使用情况api-resources-列出API资源api-versions-列出API版本cluster-info-显示集群信息version-显示kubectl和Kubernetes版本config view-查看kubeconfig(仅查看子命令)
受阻资源
secrets/secret-明确阻止- 名称中包含“secret”的任何资源
允许的资源
核心命名空间:
- Pod、部署、状态集、守护进程、作业、cronjobs
- 服务、端点、复制集、配置映射
- 服务帐户、播客中断预算、网络策略
- 租赁、事件、持续的财产索赔
核心集群范围:
- 节点、命名空间、组件状态
自定义资源(CRD):
- Traefik:入口路由、中间件、服务器端口
- 证书管理器:证书、颁发者、集群颁发者、订单、挑战
- Calico:ippools、bgppeers、bgp配置、felix配置、阻塞性
- 自定义:endpointalias(根据需要扩展)
允许的标志
允许使用常见的只读标志:
- 输出:
-o,--output - 选择器:
-l,--selector,--field-selector - 命名空间:
-n,--namespace,-A,--all-namespaces - 观看:
-w,--watch - 显示器:
--show-labels,--show-kind,--no-headers - 日志:
--tail,--since,--follow,-f,--previous,--timestamps - 集装箱:
-c,--container - 其他:
--context,--kubeconfig,--sort-by等等。
被拒旗帜
任何可能引发突变或危险操作的标志:
--force,--grace-period,--cascade--dry-run,--field-manager,--overwrite--patch,--prune,--filename,--from-file--save-config,--record
附加保护
- 不允许使用shell元字符(
|,;,&,回溯,>等等) - 无球形图案
- 命令直接通过spawn执行,而不是通过shell执行
- 所有命令都在启动环境中从启动目录执行
示例命令
有效命令
# Get all pods in default namespace
kubectl get pods
# Get deployments with labels
kubectl get deployments -l app=nginx -n production
# Describe a specific node
kubectl describe node worker-1
# View logs with tail
kubectl logs my-pod -n default --tail=100 -f
# Get resource usage
kubectl top nodes
# List API resources
kubectl api-resources
# View cluster info
kubectl cluster-info
# Get services across all namespaces
kubectl get svc -A
# Describe a certificate
kubectl describe certificate my-cert -n cert-manager被拒绝的命令
# Blocked: mutation verb
kubectl delete pod my-pod
# Blocked: accessing secrets
kubectl get secrets
# Blocked: applying changes
kubectl apply -f config.yaml
# Blocked: shell metacharacters
kubectl get pods | grep nginx
# Blocked: dangerous flag
kubectl get pods --force发展
项目结构
cluster-info-mcp/
├── index.js # Main MCP server
├── validator.js # Command validation logic
├── executor.js # kubectl command execution
├── config.js # Configuration management
├── package.json # Node.js dependencies
└── README.md # This file日志记录
通过环境变量或配置文件设置日志级别:
KUBECTL_MCP_LOG_LEVEL=debug node index.js日志被写入stderr以避免干扰stdio协议。
故障排除
未找到kubectl
确保kubectl在您的PATH中或设置kubectl_PATH环境变量:
export KUBECTL_PATH=/usr/local/bin/kubectl
node index.js权限不足
确保脚本可执行:
chmod +x index.js连接问题
检查你的kubeconfig配置是否正确:
kubectl config view
kubectl cluster-info许可证
麻省理工学院
