生产部署(多节点)
Neutree Agent Platform — 私有化部署在你自己的 Kubernetes 集群上安装平台 —— 从公共镜像仓库拉取镜像,或从你自己的私有仓库完全离线部署
一次安装能得到什么
同一条 ./install.sh 既支持联网安装(镜像来自公共仓库),也支持完全隔离网络(镜像来自你自己的仓库)—— 两条路径都在「安装」标签页。它会装出:
核心平台(始终安装)
- Control plane — Agent 管理、调度、用户与 Workspace 管理
- Channel gateway — 外部事件(webhook、Slack 等)到达 Agent 的入口
- 数据层 — PostgreSQL(CloudNativePG)+ 共享 NFS
- Agent Workspace 运行时 — 每个 Workspace 一个 pod 运行 Agent;Agent 之间可以互相
@、共享文件并共用记忆存储
可选模块(默认关闭)
- Code Sandbox — 让 Agent 运行代码并提供临时 web 预览。由第三方 OpenSandbox 提供能力,需自行安装;平台通过
OPENSANDBOX_URL指向它 - Agent Browser — 自托管的 browser as a service:Agent 驱动真实浏览器,用户通过 WebRTC 实时观看。内置 TURN 中继(coturn)和已发布的有头 Chromium 镜像
- LDAP — 让用户用 LDAP 账号登录
前置条件
基础设施
| 资源 | 要求 | 说明 |
|---|---|---|
| Kubernetes | v1.28+(多节点),或单个 k3s 节点(single-node profile) | 推荐 3 个及以上 worker |
| Worker 节点 | 至少 4 vCPU / 8GB 内存 | Agent pod 按 Workspace 动态创建 |
| 容器镜像仓库 | 一个所有节点都能拉取的仓库 —— 公共仓库(联网)或你自己的私有仓库(隔离网络) | 把 REGISTRY 指向它;仓库需要登录时填写 REGISTRY_USERNAME / REGISTRY_PASSWORD |
| RWX 共享存储 | 支持 ReadWriteMany 的 CSI(最常见的是 NFS) | 承载 AFS 共享目录,默认 500Gi |
| RWO 卷存储 | 任何能运行 PostgreSQL 的 CSI(Ceph RBD、vSAN 等;同一套 NFS 也可以) | PostgreSQL 数据卷 + Agent Workspace 容器磁盘 |
网络
| 项目 | 要求 |
|---|---|
| 节点 IP | 至少一个用户可达的 worker IP(NodePort 会用到) |
| NodePort | 30000–32767 范围内的空闲端口:NAP_NODE_PORT;启用对应可选模块时还需 BROWSER_NODE_PORT / SANDBOX_NODE_PORT |
| TURN 端口 | 启用 Agent Browser 的 TURN 中继时:在 coturn 节点上开放 3478/tcp+udp 和 49152-49252/udp |
| 存储可达性 | 所有节点都能挂载上面两个 storage class(NFS / 块存储 CSI 等) |
| 仓库可达性 | 所有节点都能从上面那个仓库拉取镜像(公共仓库,或你的私有仓库) |
LLM API
平台不内置任何模型。根据启用的 Agent 类型,你需要提供协议兼容的 API endpoint:
| Agent 类型 | 所需 API 协议 |
|---|---|
| Codex | OpenAI Responses API(注意:不是 Chat Completions) |
| Claude Code | Anthropic API |
| Goose | OpenAI Chat Completions API |
如果你现有的模型服务只支持 OpenAI Chat Completions API,Goose Agent 可以直接使用;若还想运行 Claude Code 类 Agent,可在其前面加一个把 OpenAI Chat 协议转成 Anthropic 协议的转换代理。
kubeconfig 权限
安装需要 cluster-admin — install.sh 会操作命名空间级管理员无法操作的资源(CRD、webhook、ClusterRole、StorageClass 等)。安装完成后可立即回收该权限;稳态运行时,control plane 通过它自己的集群内 ServiceAccount 鉴权,权限范围收得很紧(命名空间内的常规读写 + 仅对 nodes 的集群级 get/list)。
操作者的 kubeconfig 永远不会挂载进任何平台 pod。如果无法接受临时的 cluster-admin,这里给出一个等价的最小 ClusterRole。
等价的最小 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nap-installer
rules:
- apiGroups: [apiextensions.k8s.io]
resources: [customresourcedefinitions]
verbs: [get, list, watch, create, update, patch, delete]
- apiGroups: [admissionregistration.k8s.io]
resources: [validatingwebhookconfigurations, mutatingwebhookconfigurations]
verbs: [get, list, watch, create, update, patch, delete]
- apiGroups: [""]
resources: [namespaces]
verbs: [get, list, create, update, patch]
- apiGroups: [rbac.authorization.k8s.io]
resources: [clusterroles, clusterrolebindings, roles, rolebindings]
verbs: [get, list, watch, create, update, patch, delete]
- apiGroups: [storage.k8s.io]
resources: [storageclasses]
verbs: [get, list, create, update, patch]
- apiGroups: [postgresql.cnpg.io]
resources: ["*"]
verbs: ["*"]
- apiGroups: [opensandbox.alibaba.com]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["", apps, batch, networking.k8s.io, policy]
resources: ["*"]
verbs: ["*"]
- apiGroups: [""]
resources: [nodes]
verbs: [get, list, watch]实际上这仍然接近 cluster-admin(在 core/apps/batch 这几个组上是 */*),但把资源逐项列出来会让安全评审更容易。
前置条件就绪后: