openClaw对接k8s平台
·
环境准备
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,它可以做任何事情

牛来很棒!!!
更多推荐
所有评论(0)