Files
MyGoNavi/deploy/k8s/gonavi-mcp-server

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 暴露 /mcp
  • overlays/ingress-with-drivers-pvc:同时启用 Ingress 和 drivers PVC

前提

容器仍然依赖 GoNavi 的活动数据目录。至少要准备:

  • connections.json
  • daily_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、ingressClassName
  • overlays/drivers-pvc/patch-deployment.yaml 里的 PVC 名称 gonavi-drivers
  • overlays/nas-hostpath/patch-deployment.yaml 里的宿主机目录 /volume1/docker/gonavi/data

nas-hostpath overlay 会直接把整个 GoNavi 数据目录挂到 /data,因此 connections.jsondaily_secrets.jsondrivers/ 都从宿主机目录读取;此时仍建议保留 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.jsondaily_secrets.json。如果保存连接里包含 Dameng、ClickHouse、DuckDB 等依赖 driver agent 的数据源,请在 Deployment 中额外补一个卷,把宿主机或 PVC 中的 drivers/ 目录挂载到:

/data/drivers

否则对应连接会因为缺少 driver agent 无法使用。