环境准备

k8s集群

已经部署成功的openClaw

可以参考我的另一篇openClaw部署教程

openClaw服务器安装kubectl

sudo rm -f /usr/local/bin/kubectl
rm -f ./kubectl

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.30/deb/ /" \
  | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubectl
kubectl version --client

k8s集群配置

为 Kubernetes MCP Server 准备只读凭据

企业里不要直接把管理员的 ~/.kube/config 交给大模型。推荐专门创建一个只读 ServiceAccount,并生成独立 kubeconfig。

创建命名空间和ServiceAccount

kubectl create namespace mcp
kubectl create serviceaccount mcp-viewer -n mcp

授予集群范围只读权限

kubectl create clusterrolebinding mcp-viewer-crb \
  --clusterrole=view \
  --serviceaccount=mcp:mcp-viewer

验证权限

kubectl auth can-i list pods --as=system:serviceaccount:mcp:mcp-viewer --all-namespaces

# 期望得到  说明这个 ServiceAccount 可以跨命名空间只读查看资源
yes

# 得到一个24小时token
TOKEN="$(kubectl create token mcp-viewer --duration=24h -n mcp)"
echo "${TOKEN:0:20}..."

生成专用kubeconfig

API_SERVER="$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')"
CA_FILE="$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.certificate-authority}')"
if [ -z "$CA_FILE" ]; then
  CA_FILE="/tmp/k8s-ca-$$.crt"
  kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d > "$CA_FILE"
fi
CONTEXT_NAME="mcp-viewer-context"
KUBECONFIG_FILE="$HOME/.kube/mcp-viewer.kubeconfig"
kubectl config --kubeconfig="$KUBECONFIG_FILE" set-cluster mcp-viewer-cluster \
  --server="$API_SERVER" \
  --certificate-authority="$CA_FILE" \
  --embed-certs=true
kubectl config --kubeconfig="$KUBECONFIG_FILE" set-credentials mcp-viewer \
  --token="$TOKEN"
kubectl config --kubeconfig="$KUBECONFIG_FILE" set-context "$CONTEXT_NAME" \
  --cluster=mcp-viewer-cluster \
  --user=mcp-viewer
kubectl config --kubeconfig="$KUBECONFIG_FILE" use-context "$CONTEXT_NAME"
chmod 600 "$KUBECONFIG_FILE"
if [[ "$CA_FILE" == /tmp/k8s-ca-*.crt ]]; then
  rm -f "$CA_FILE"
fi

验证是否可用

# 查看文件是否生成
[root@master01 ~]# ll /root/.kube/
总用量 28
drwxr-x--- 4 root root    35 8月   4 19:42 cache
-rw-r--r-- 1 root root 12405 8月   4 20:39 completion.bash.inc
-rw------- 1 root root  5960 8月  12 16:27 config
-rw------- 1 root root  2692 8月  19 10:25 mcp-viewer.kubeconfig

# 验证是否可用
kubectl --kubeconfig="$HOME/.kube/mcp-viewer.kubeconfig" get pods -A

# 期望得到
[root@master01 ~]# kubectl --kubeconfig="$HOME/.kube/mcp-viewer.kubeconfig" get pods -A
NAMESPACE        NAME                                              READY   STATUS    RESTARTS       AGE
kube-system      calico-kube-controllers-5cc564f9c5-7jt88          1/1     Running   11 (20m ago)   7d18h
kube-system      calico-node-j6s8f                                 1/1     Running   4 (23m ago)    7d18h
kube-system      calico-node-v5kvn                                 1/1     Running   5 (27m ago)    7d18h
kube-system      calico-node-zx4rk                                 1/1     Running   5 (20m ago)    7d18h
kube-system      coredns-857d9ff4c9-nsj4q                          1/1     Running   14 (27m ago)   14d
kube-system      coredns-857d9ff4c9-zplqw                          1/1     Running   14 (27m ago)   14d
kube-system      csi-nfs-controller-8bbf85dbb-wmcsk                5/5     Running   75 (19m ago)   8d
kube-system      csi-nfs-node-m28wz                                3/3     Running   23 (23m ago)   8d
kube-system      csi-nfs-node-ntmtn                                3/3     Running   22 (20m ago)   8d
kube-system      csi-nfs-node-qzrv2                                3/3     Running   29 (27m ago)   8d
...

注册 Kubernetes MCP Server 到 OpenClaw

# scp 将k8s集群生成的kubeconfig复制到openclaw本地
scp root@192.168.60.100:/root/.kube/mcp-viewer.kubeconfig ubuntu:~

mkdir -p ~/.kube
mv ~/mcp-viewer.kubeconfig ~/.kube/
chmod 600 ~/.kube/mcp-viewer.kubeconfig
ls -l ~/.kube/mcp-viewer.kubeconfig

注册MCP Server

openclaw mcp set kubernetes '{
  "type": "stdio",
  "command": "npx",
  "args": [
    "-y",
    "kubernetes-mcp-server@latest",
    "--kubeconfig",
    "'"$HOME"'/.kube/mcp-viewer.kubeconfig",
    "--read-only",
    "--disable-multi-cluster"
  ]
}'

查看已注册配置

openclaw mcp show kubernetes
openclaw mcp list

测试底层调用

npx -y kubernetes-mcp-server@latest --kubeconfig ~/.kube/mcp-viewer.kubeconfig --read-only --disable-multi-cluster

# 期望得到的结果是不报错,卡住,说明已经拉起来了
# 这一步成功以后,说明 OpenClaw 已经可以在本地拉起 Kubernetes MCP Server,并通过只读 kubeconfig 访问集群。OpenClaw 文档明确说明,配置好的 MCP server 会在普通 coding 和 messaging 工具配置中暴露给 embedded runtime,因此后面的 openclaw agent --local 可以直接调用这些工具

端对端测试

openclaw agent --local --session-id k8s-smoke \
  --message "请使用可用的 Kubernetes MCP 工具,统计当前集群一共有多少个 Pod,并列出 kube-system 命名空间中Pod"

# 期望返回k8s集群pod信息,返回成功证明对接完成了  

功能测试

模拟k8s故障

起一个pod,镜像不存在,模拟故障

kubectl create namespace mcp-demo
kubectl apply -n mcp-demo -f - <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bad-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bad-nginx
  template:
    metadata:
      labels:
        app: bad-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:not-exists
        ports:
        - containerPort: 80
EOF

等待k8s完全报错

openclaw解决非本地k8s集群问题

把排错指令给到牛来

openclaw agent --local --session-id k8s-smoke \
  --message "请使用 Kubernetes MCP 工具排查 mcp-demo 命名空间中 bad-nginx Deployment 对应 Pod 启动失败的原因。输出格式必须包含:1.故障现象 2.根因 3.证据 4.修复命令。"

牛来一顿分析,得到处理方案,还想自己解决,生产环境中尽量只拿方案,自己手动处理,防止智能体权限过大,造成不可控操作

拿牛来给的方案,手动执行一下

kubectl -n mcp-demo set image deployment/bad-nginx nginx=nginx:1.27

注意保证网络通畅,k8s从国外镜像仓库拉取镜像,需要解决网络问题,或者替换国内镜像

新的pod已经运行正常,坏的pod也在删除中了,openclaw对接k8s完成,已经实现openclaw远程操作k8s,如果愿意将权限给openclaw,它可以做任何事情

牛来很棒!!!

更多推荐