mcp-kubernetes-ro 是一个 模型上下文协议(MCP) 服务器,它为AI助手提供对Kubernetes集群的只读访问权限。借助该服务器,AI模型能够列出资源、获取资源详情、检索Pod日志、发现API资源,并执行Base64编码/解码操作,同时通过只读访问来保障安全性。
服务器利用你本地的 kubectl 配置(即便未安装 kubectl 也能使用),为你的Kubernetes集群提供一个安全的只读接口,在允许对集群进行全面检查和故障排除的同时,防止任何破坏性操作。
kubectl:MCP服务器使用你本地的 kubectl 配置来连接Kubernetes集群,但不依赖 kubectl 二进制文件,因此即使你的机器上未安装 kubectl,它也能正常工作。KUBECONFIG 环境变量。你可以从 发布页面 下载预构建的二进制文件。
或者,你也可以在macOS或Linux系统上使用Homebrew进行安装:
brew install patrickdappollonio/tap/mcp-kubernetes-ro
你还能将其作为NPM包使用,只需确保将配置提供给你的AI代理:
npx -y @patrickdappollonio/mcp-kubernetes-ro
最后,Docker用户可以从GitHub容器注册表中拉取预构建的镜像:
docker pull ghcr.io/patrickdappollonio/mcp-kubernetes-ro:latest
将以下配置添加到你的编辑器设置中,以使用 mcp-kubernetes-ro:
{
"mcpServers": {
"kubernetes-ro": {
"command": "mcp-kubernetes-ro",
"args": [
// 按需取消注释并修改:
// "--kubeconfig=/path/to/kubeconfig",
// "--namespace=default",
// "--transport=stdio",
// "--port=8080",
// "--disabled-tools=get_logs,decode_base64"
],
"env": {
// 按需设置KUBECONFIG环境变量:
// "KUBECONFIG": "/path/to/kubeconfig",
// 按需设置MCP_KUBERNETES_RO_DISABLED_TOOLS环境变量:
// "MCP_KUBERNETES_RO_DISABLED_TOOLS": "get_logs,decode_base64",
// 或者使用通用的DISABLED_TOOLS环境变量:
// "DISABLED_TOOLS": "get_logs,decode_base64"
}
}
}
}
你可以像上面那样直接从 $PATH 中使用 mcp-kubernetes-ro,也可以提供二进制文件的完整路径(例如 /path/to/mcp-kubernetes-ro)。
你还可以通过将其作为 npx 包来简化安装过程:
{
"mcpServers": {
"kubernetes-ro": {
"command": "npx",
"args": [
"-y",
"@patrickdappollonio/mcp-kubernetes-ro"
// 按需取消注释并修改:
// "--kubeconfig=/path/to/kubeconfig",
// "--namespace=default",
// "--transport=stdio",
// "--port=8080",
// "--disabled-tools=get_logs,decode_base64"
],
"env": {
// 按需设置KUBECONFIG环境变量:
// "KUBECONFIG": "/path/to/kubeconfig",
// 按需设置MCP_KUBERNETES_RO_DISABLED_TOOLS环境变量:
// "MCP_KUBERNETES_RO_DISABLED_TOOLS": "get_logs,decode_base64",
// 或者使用通用的DISABLED_TOOLS环境变量:
// "DISABLED_TOOLS": "get_logs,decode_base64"
}
}
}
}
以下是如何使用Docker镜像的示例:
{
"mcpServers": {
"kubernetes-ro": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "KUBECONFIG=/root/.kube/config",
"-v", "/path/to/kubeconfig:/root/.kube/config",
"ghcr.io/patrickdappollonio/mcp-kubernetes-ro"
// 在此处添加其他标志,例如 --disabled-tools=get_logs,decode_base64
],
"env": {
// 按需设置KUBECONFIG环境变量:
// "KUBECONFIG": "/path/to/kubeconfig",
// 按需设置MCP_KUBERNETES_RO_DISABLED_TOOLS环境变量:
// "MCP_KUBERNETES_RO_DISABLED_TOOLS": "get_logs,decode_base64",
// 或者使用通用的DISABLED_TOOLS环境变量:
// "DISABLED_TOOLS": "get_logs,decode_base64"
}
},
}
}
请注意,你需要将你的kubeconfig文件挂载到容器中,并将 KUBECONFIG 环境变量设置为挂载文件的路径,或者使用 --kubeconfig 标志进行设置。
~/.kube/config)。get_node_metrics、get_pod_metrics),必须在你的集群中安装指标服务器。如果未安装,这些工具将返回错误消息。共有 10个工具 可供使用:
list_resources:按类型列出任何Kubernetes资源,并可选择进行过滤,结果按最新排序。get_resource:获取特定资源的详细信息。get_logs:通过高级过滤选项(包括grep模式、时间过滤和上一次日志)获取Pod日志。get_pod_containers:列出Pod内的容器,以便访问日志。list_api_resources:列出可用的Kubernetes API资源及其详细信息(类似于kubectl api-resources)。list_contexts:从kubeconfig文件中列出可用的Kubernetes上下文。get_node_metrics:获取节点指标(CPU和内存使用情况)。get_pod_metrics:获取Pod指标(CPU和内存使用情况)。encode_base64:将文本数据编码为Base64格式。decode_base64:将Base64数据解码为文本格式。你可以使用 --disabled-tools 命令行标志或环境变量来禁用特定工具,工具名称以逗号分隔。支持两个环境变量以适应不同的使用场景:
MCP_KUBERNETES_RO_DISABLED_TOOLS:特定于应用的变量,不会与其他工具冲突。DISABLED_TOOLS:通用变量,可在环境中的多个工具间共享。优先级顺序:
--disabled-tools=NAMES(优先级最高)。MCP_KUBERNETES_RO_DISABLED_TOOLS。DISABLED_TOOLS。这在以下场景中非常有用:
get_logs、decode_base64)。get_node_metrics、get_pod_metrics)。可禁用的工具名称:
list_resourcesget_resourceget_logsget_pod_containerslist_api_resourceslist_contextsget_node_metricsget_pod_metricsencode_base64decode_base64当一个工具被禁用时,它将不会在MCP服务器中注册,也不会出现在可用工具列表中。同时,会在标准错误输出中记录一条消息,指示哪些工具已被跳过。
示例:
# 使用命令行标志(优先级最高)
mcp-kubernetes-ro --disabled-tools=encode_base64,decode_base64,get_logs
# 使用特定于应用的环境变量
export MCP_KUBERNETES_RO_DISABLED_TOOLS=encode_base64,decode_base64,get_logs
mcp-kubernetes-ro
# 使用通用环境变量
export DISABLED_TOOLS=encode_base64,decode_base64,get_logs
mcp-kubernetes-ro
# 优先级演示:命令行标志优先于环境变量
export MCP_KUBERNETES_RO_DISABLED_TOOLS=get_logs
export DISABLED_TOOLS=get_pod_metrics
mcp-kubernetes-ro --disabled-tools=encode_base64,decode_base64
# 优先级演示:特定于应用的环境变量优先于通用环境变量
export MCP_KUBERNETES_RO_DISABLED_TOOLS=encode_base64,decode_base64
export DISABLED_TOOLS=get_logs,get_pod_metrics
mcp-kubernetes-ro
# 输出:Skipping disabled tool: "encode_base64"
# 输出:Skipping disabled tool: "decode_base64"
默认情况下,mcp-kubernetes-ro 以stdio模式运行,适用于与通过标准输入/输出进行通信的编辑器和其他工具集成。
mcp-kubernetes-ro
你也可以将 mcp-kubernetes-ro 作为支持SSE的HTTP服务器运行,以实现基于Web的集成:
mcp-kubernetes-ro --transport=sse --port=8080
在SSE模式下,服务器将监听指定端口(默认:8080),并通过HTTP使用服务器发送事件提供相同的MCP工具。这对于Web应用程序或不适合使用stdio通信的环境非常有用。
以下命令行标志可用于配置MCP服务器:
--kubeconfig=PATH:kubeconfig文件的路径(默认为 KUBECONFIG 环境变量,然后是 ~/.kube/config)。--namespace=NAME:操作的默认命名空间(默认为当前命名空间)。--transport=TYPE:传输类型:stdio 或 sse(默认:stdio)。--port=PORT:SSE服务器的端口(默认:8080,仅在使用 --transport=sse 时使用)。--disabled-tools=NAMES:以逗号分隔的要禁用的工具名称列表(可选)。MCP_KUBERNETES_RO_DISABLED_TOOLS:特定于应用的环境变量,用于禁用工具(命令行标志优先级更高)。DISABLED_TOOLS:通用环境变量,用于禁用工具(优先级低于 MCP_KUBERNETES_RO_DISABLED_TOOLS)。服务器支持单命令上下文,这在处理同一 $KUBECONFIG 文件中的多个Kubernetes集群或上下文时提供了更大的灵活性。
配置优先级:
context 参数。Kubeconfig解析优先级:
--kubeconfig 参数。KUBECONFIG 环境变量。~/.kube/config。示例:
{
"resource_type": "pods",
"namespace": "default",
"context": "production-cluster"
}
这种方法允许你:
按类型列出任何Kubernetes资源,并可选择进行过滤,结果按最新排序。
参数:
resource_type(必需):要列出的资源类型 - 使用复数形式(例如 'pods'、'deployments'、'services')。api_version(可选):资源的API版本(例如 'v1'、'apps/v1')。namespace(可选):目标命名空间(为空则表示集群范围的资源)。context(可选):要使用的Kubernetes上下文(默认为kubeconfig中的当前上下文)。label_selector(可选):用于过滤资源的标签选择器(例如 'app=nginx,version=1.0')。field_selector(可选):用于过滤资源的字段选择器(例如 'status.phase=Running')。limit(可选):要返回的最大资源数量(默认为所有)。continue(可选):分页的继续令牌(来自上一次响应)。示例:
{
"resource_type": "pods",
"namespace": "default",
"context": "production",
"label_selector": "app=nginx"
}
获取特定资源的详细配置信息。
参数:
resource_type(必需):要获取的资源类型。name(必需):资源名称。api_version(可选):资源的API版本(例如 'v1'、'apps/v1')。namespace(可选):目标命名空间(对于命名空间资源是必需的)。context(可选):要使用的Kubernetes上下文(默认为kubeconfig中的当前上下文)。示例:
{
"resource_type": "deployment",
"name": "nginx-deployment",
"namespace": "default",
"context": "production"
}
通过高级过滤选项(包括grep模式、时间过滤和上一次日志)获取Pod日志。
参数:
namespace(必需):Pod所在的命名空间。name(必需):Pod名称。container(可选):容器名称(对于多容器Pod是必需的)。context(可选):要使用的Kubernetes上下文(默认为kubeconfig中的当前上下文)。max_lines(可选):要检索的最大行数。grep_include(可选):仅包含匹配这些模式的行(以逗号分隔)。类似于grep - 包含包含任何这些模式的行。grep_exclude(可选):排除匹配这些模式的行(以逗号分隔)。类似于grep -v - 排除包含任何这些模式的行。use_regex(可选):是否将grep模式视为正则表达式而不是字面字符串。since(可选):返回比此时间更新的日志。支持持续时间(如 "5m"、"1h"、"2h30m"、"1d")或绝对时间(如 "2023-01-01T10:00:00Z")。previous(可选):返回上一次终止的容器实例的日志(类似于kubectl logs --previous)。示例:
{
"namespace": "default",
"name": "nginx-pod-12345",
"container": "nginx",
"context": "production",
"max_lines": "100",
"grep_include": "error,warning",
"since": "5m"
}
列出Pod内的容器,以便访问日志。
参数:
namespace(必需):Pod所在的命名空间。name(必需):Pod名称。context(可选):要使用的Kubernetes上下文(默认为kubeconfig中的当前上下文)。示例:
{
"namespace": "default",
"name": "nginx-pod-12345",
"context": "production"
}
列出可用的Kubernetes API资源及其详细信息(类似于kubectl api-resources)。
参数: 无
示例:
{}
从kubeconfig文件中列出可用的Kubernetes上下文。这对于发现可用于其他工具中 context 参数的上下文非常有用。
参数: 无
示例:
{}
示例响应:
{
"contexts": [
{
"name": "production",
"cluster": "prod-cluster",
"user": "prod-user",
"namespace": "default",
"current": true
},
{
"name": "staging",
"cluster": "staging-cluster",
"user": "staging-user",
"namespace": "staging",
"current": false
}
],
"count": 2
}
从指标服务器获取节点指标(CPU和内存使用情况)。由于内置的指标服务器端点不支持基于指针的分页,结果按时间戳(最新优先)排序,以实现一致的排序和分页。
参数:
node_name(可选):要获取指标的特定节点名称。如果未提供,则返回所有节点的指标。context(可选):要使用的Kubernetes上下文(默认为kubeconfig中的当前上下文)。limit(可选):要返回的最大节点指标数量。如果未提供,则返回所有可用指标。continue(可选):分页的继续令牌(来自上一次响应)。错误处理:
示例:
{
"node_name": "worker-node-1",
"context": "production",
"limit": 5
}
示例响应(单个节点):
{
"kind": "NodeMetrics",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {
"name": "worker-node-1",
"creationTimestamp": "2023-01-01T12:00:00Z"
},
"timestamp": "2023-01-01T12:00:00Z",
"window": "10.062s",
"usage": {
"cpu": "137m",
"memory": "1368128Ki"
}
}
示例响应(带分页的列表):
{
"kind": "NodeMetricsList",
"apiVersion": "metrics.k8s.io/v1beta1",
"count": 5,
"items": [
{
"kind": "NodeMetrics",
"metadata": { "name": "node-1" },
"timestamp": "2023-01-01T12:00:00Z",
"usage": { "cpu": "137m", "memory": "1368128Ki" }
}
],
"continue": "eyJvZmZzZXQiOjUsInR5cGUiOiJub2RlIiwibmFtZXNwYWNlIjoiIn0="
}
从指标服务器获取Pod指标(CPU和内存使用情况)。由于内置的指标服务器端点不支持基于指针的分页,结果按时间戳(最新优先)排序,以实现一致的排序和分页。
参数:
namespace(可选):要获取Pod指标的命名空间。如果未提供,则返回所有命名空间中所有Pod的指标。pod_name(可选):要获取指标的特定Pod名称。如果指定,则需要 namespace。context(可选):要使用的Kubernetes上下文(默认为kubeconfig中的当前上下文)。limit(可选):要返回的最大Pod指标数量。如果未提供,则返回所有可用指标。continue(可选):分页的继续令牌(来自上一次响应)。错误处理:
pod_name 时是否提供了 namespace。分页说明:
示例(特定Pod):
{
"namespace": "kube-system",
"pod_name": "metrics-server-557ff575fb-9dcl4",
"context": "production"
}
示例(带分页):
{
"namespace": "kube-system",
"context": "production",
"limit": 10,
"continue": "eyJvZmZzZXQiOjEwLCJ0eXBlIjoicG9kIiwibmFtZXNwYWNlIjoia3ViZS1zeXN0ZW0ifQ=="
}
示例响应(单个Pod):
{
"kind": "PodMetrics",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {
"name": "metrics-server-557ff575fb-9dcl4",
"namespace": "kube-system",
"creationTimestamp": "2023-01-01T12:00:00Z"
},
"timestamp": "2023-01-01T12:00:00Z",
"window": "18.888s",
"containers": [
{
"name": "metrics-server",
"usage": {
"cpu": "8020419n",
"memory": "48164Ki"
}
}
]
}
示例响应(带分页的列表):
{
"kind": "PodMetricsList",
"apiVersion": "metrics.k8s.io/v1beta1",
"namespace": "kube-system",
"count": 10,
"items": [
{
"kind": "PodMetrics",
"metadata": { "name": "pod-1", "namespace": "kube-system" },
"timestamp": "2023-01-01T12:00:00Z",
"containers": [
{
"name": "container-1",
"usage": { "cpu": "8020419n", "memory": "48164Ki" }
}
]
}
],
"continue": "eyJvZmZzZXQiOjIwLCJ0eXBlIjoicG9kIiwibmFtZXNwYWNlIjoia3ViZS1zeXN0ZW0ifQ=="
}
将文本数据编码为Base64格式。
参数:
data(必需):要编码的文本数据。示例:
{
"data": "username:password"
}
将Base64数据解码为文本格式。
参数:
data(必需):要解码的Base64数据。示例:
{
"data": "dXNlcm5hbWU6cGFzc3dvcmQ="
}
# 使用默认的kubeconfig和上下文启动
mcp-kubernetes-ro
# 使用特定的kubeconfig启动
mcp-kubernetes-ro --kubeconfig ~/.kube/config
# 使用KUBECONFIG环境变量启动
export KUBECONFIG=~/.kube/config
mcp-kubernetes-ro
# 使用特定的命名空间启动
mcp-kubernetes-ro --namespace kube-system
# 以SSE模式启动
mcp-kubernetes-ro --transport=sse --port=3000
# 使用特定的kubeconfig启动生产集群
mcp-kubernetes-ro \
--kubeconfig ~/.kube/prod-config \
--namespace monitoring
# 使用环境变量以SSE模式启动开发环境
export KUBECONFIG=~/.kube/dev-config
mcp-kubernetes-ro \
--transport=sse \
--port=8080
# 使用单命令上下文(在工具调用中指定上下文)
# 现在上下文在工具级别指定,而不是全局指定
# 出于安全或性能原因禁用特定工具
mcp-kubernetes-ro --disabled-tools=get_logs,decode_base64
# 当指标服务器不可用时禁用指标工具
mcp-kubernetes-ro --disabled-tools=get_node_metrics,get_pod_metrics
# 在生产环境中禁用多个工具
mcp-kubernetes-ro \
--kubeconfig ~/.kube/prod-config \
--disabled-tools=encode_base64,decode_base64,get_logs
# 使用特定于应用的环境变量禁用工具
export MCP_KUBERNETES_RO_DISABLED_TOOLS=get_logs,decode_base64
mcp-kubernetes-ro
# 使用通用环境变量禁用工具
export DISABLED_TOOLS=get_logs,decode_base64
mcp-kubernetes-ro
# 命令行标志优先于两个环境变量
export MCP_KUBERNETES_RO_DISABLED_TOOLS=get_logs,decode_base64
export DISABLED_TOOLS=get_pod_metrics
mcp-kubernetes-ro --disabled-tools=get_node_metrics,get_pod_metrics
虽然此MCP服务器为Kubernetes集群检查提供了全面的工具,但一些AI助手可能存在限制或策略,即使技术上可用,也会阻止它们使用某些工具组合:
get_resource 和 decode_base64 工具)。如果你的AI助手因安全原因拒绝使用可用工具,可以采取以下措施:
kubectl 进行敏感操作,并让AI提供要运行的命令,例如:kubectl get secret -n -o yaml
echo "" | base64 -d
这种行为反映了不同的安全方法:
MCP服务器在启动时会自动进行连接检查,以验证是否能够成功连接到你的Kubernetes集群。此检查包括:
启动成功后,你将看到如下输出:
Testing connectivity to Kubernetes cluster...
✓ Successfully connected to Kubernetes cluster (version: v1.28.0, 4 namespaces accessible)
如果连接检查失败,你将看到详细的错误消息。常见问题包括:
get、list、watch)。指标工具(get_node_metrics 和 get_pod_metrics)包含复杂的错误检测机制,用于检测指标服务器的可用性:
metrics-server 服务未找到。metrics.k8s.io API组不可用。两个指标工具都实现了客户端分页,以确保结果的一致性,因为内置的指标服务器端点不支持基于指针的分页,同时也为AI工具提供了一种安全的方式来请求所需的数据,尤其适用于小上下文窗口。
offset:结果集中的当前位置。type:资源类型(“node” 或 “pod”)。namespace:上下文命名空间(对于Pod指标)。eyJvZmZzZXQiOjEwLCJ0eXBlIjoicG9kIiwibmFtZXNwYWNlIjoia3ViZS1zeXN0ZW0ifQ==服务器为常见问题提供详细的错误消息: