GoNavi MCP Server Kubernetes 示例
这个目录提供 gonavi-mcp-server 的最小 K8s 部署清单,适合:
- Linux 服务器上的单集群部署
- NAS 自带 K8s / k3s / k8s-lite 环境
- 需要把 GoNavi MCP 通过 Ingress / Gateway 暴露给远端 Agent 的场景
如果你希望通过 values 参数统一控制镜像、Secret、Ingress、PVC/hostPath,而不是维护多份 overlay,请直接使用 deploy/helm/gonavi-mcp-server。
目录结构:
kustomization.yaml:基础部署入口base/kustomization.yaml:基础资源集合overlays/nas-hostpath:直接挂 NAS / 单机节点上的 GoNavi 数据目录base/deployment.yaml/base/service.yaml:基础资源overlays/drivers-pvc:为/data/drivers增加 PVC 挂载overlays/ingress:增加 Ingress 暴露/mcpoverlays/ingress-with-drivers-pvc:同时启用 Ingress 和 drivers PVC
前提
容器仍然依赖 GoNavi 的活动数据目录。至少要准备:
connections.jsondaily_secrets.json
如果目标连接依赖可选 driver agent,还需要额外挂载 /data/drivers。
base/deployment.yaml 默认镜像指向:
ghcr.io/syngnat/gonavi-mcp-server:latest
如果你要跟随 dev 分支,可以改成:
ghcr.io/syngnat/gonavi-mcp-server:dev-latest
如果你要使用自建镜像,再按下面方式覆盖 image:
- 在当前节点可访问的 Docker / Podman / containerd 环境中构建并导入这个镜像
- 把镜像推送到你的私有仓库,并同步修改
base/deployment.yaml里的image
例如:
docker build -f Dockerfile.mcp-server -t gonavi-mcp-server:local .
# or
podman build -f Dockerfile.mcp-server -t localhost/gonavi-mcp-server:local .
1. 创建 Secret
推荐直接从现有 GoNavi 数据文件生成:
kubectl create secret generic gonavi-mcp-server-data \
--from-file=connections.json=/absolute/path/to/gonavi-data/connections.json \
--from-file=daily_secrets.json=/absolute/path/to/gonavi-data/daily_secrets.json \
--from-literal=GONAVI_MCP_HTTP_TOKEN=replace-with-a-random-token
如需单独 namespace,请先执行:
kubectl create namespace gonavi
kubectl -n gonavi create secret generic gonavi-mcp-server-data \
--from-file=connections.json=/absolute/path/to/gonavi-data/connections.json \
--from-file=daily_secrets.json=/absolute/path/to/gonavi-data/daily_secrets.json \
--from-literal=GONAVI_MCP_HTTP_TOKEN=replace-with-a-random-token
2. 应用清单
kubectl apply -k deploy/k8s/gonavi-mcp-server
如果使用独立 namespace,请先把 YAML 里的 namespace 改成你的目标值,或自行用 kustomize / Helm 做二次封装。
清单内已经带了基础安全上下文和默认资源配额;如果你的连接数量、对象规模或并发访问更高,建议按实际负载调整 resources。
常用 Overlay
仅基础部署:
kubectl apply -k deploy/k8s/gonavi-mcp-server
需要可选 driver agent:
kubectl apply -k deploy/k8s/gonavi-mcp-server/overlays/drivers-pvc
NAS / k3s 单机节点直接挂宿主机目录:
kubectl apply -k deploy/k8s/gonavi-mcp-server/overlays/nas-hostpath
需要对外暴露 /mcp:
kubectl apply -k deploy/k8s/gonavi-mcp-server/overlays/ingress
同时需要 Ingress 与 drivers PVC:
kubectl apply -k deploy/k8s/gonavi-mcp-server/overlays/ingress-with-drivers-pvc
应用 overlay 前,记得先改里面的占位值,例如:
overlays/ingress/ingress.yaml里的域名、TLS Secret、ingressClassNameoverlays/drivers-pvc/patch-deployment.yaml里的 PVC 名称gonavi-driversoverlays/nas-hostpath/patch-deployment.yaml里的宿主机目录/volume1/docker/gonavi/data
nas-hostpath overlay 会直接把整个 GoNavi 数据目录挂到 /data,因此 connections.json、daily_secrets.json、drivers/ 都从宿主机目录读取;此时仍建议保留 GONAVI_MCP_HTTP_TOKEN 的 Secret 注入,不要把 token 直接硬编码进 Deployment。
3. 校验
kubectl get pods -n gonavi
kubectl get svc -n gonavi
kubectl port-forward -n gonavi svc/gonavi-mcp-server 8765:8765
curl -H "Authorization: Bearer replace-with-a-random-token" http://127.0.0.1:8765/healthz
/healthz 返回 ok 说明 Pod 已对外提供 HTTP 服务。
4. 暴露给远端 Agent
- 集群内使用:直接访问
http://gonavi-mcp-server.gonavi.svc.cluster.local:8765/mcp - 集群外使用:通过 Ingress / Gateway / 反向代理暴露
/mcp - 远端 Agent 请求头:
Authorization: Bearer <你的 token>
5. drivers 挂载
当前示例默认只挂载 connections.json 与 daily_secrets.json。如果保存连接里包含 Dameng、ClickHouse、DuckDB 等依赖 driver agent 的数据源,请在 Deployment 中额外补一个卷,把宿主机或 PVC 中的 drivers/ 目录挂载到:
/data/drivers
否则对应连接会因为缺少 driver agent 无法使用。