不是必须,但生产环境强烈建议拆分为多服务;chroma 0.5+ 默认单进程仅限开发测试,生产需启用rust frontend、sysdb、queryservice等分层架构,否则将出现查询超时、元数据不一致、重启丢集合等问题,启动日志含“warn running in embedded mode”即为高风险信号。

Chroma在Kubernetes里必须拆成多服务吗?
不是必须,但生产环境强烈建议。Chroma 0.5+ 版本起,默认的单进程 chroma-server 已被明确标记为开发/测试用途;生产部署需启用分层架构(Rust Frontend + SysDB + QueryService 等),否则会遇到查询超时、元数据不一致、重启丢集合等隐性故障。
关键判断依据是启动日志里是否出现 WARN running in embedded mode —— 出现即表示你正在用单体模式跑生产流量,风险极高。
- 单体模式仅适合本地验证或低频 PoC,
IS_PERSISTENT=TRUE无法弥补其架构缺陷 - 分层部署后,各组件可独立扩缩容:比如
QueryService加 GPU 节点,SysDB指向高可用 PostgreSQL 实例 - Helm Chart 默认启用分层模式,但需手动关闭
embeddedMode: true(该字段在 values.yaml 中默认为true)
用 Helm 部署 Chroma 时最常踩的配置坑
Helm 是当前最稳妥的 Kubernetes 部署方式,但官方 Chart(chroma/chroma)的默认配置对生产环境极不友好,几个硬性修改点必须做:
-
global.persistence.enabled必须设为true,否则所有数据存在 emptyDir,Pod 重建即丢失 -
sysdb.backend不能用默认的duckdb,必须改为postgresql并填入真实连接串:postgresql://user:pass@postgres-chroma:5432/chroma -
frontend.service.type若暴露给集群外访问,别用LoadBalancer(云厂商收费高),改用NodePort或配合Ingress;端口映射务必检查frontend.service.port和容器内CHROMA_SERVER_PORT=8000一致 - 健康检查路径已从
/api/v1/heartbeat升级为/api/v2/healthcheck,不更新会导致 readiness probe 失败
如何让 Chroma 的 SysDB 真正高可用?
SysDB 不只是“存个表名”,它管理 collection、segment、tenant 全生命周期。用单节点 PostgreSQL 或 SQLite 直接导致集群脑裂、集合创建失败、GC 卡死。
必须满足三点:
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- PostgreSQL 后端开启
pg_stat_replication和logical replication,用于 Chroma 内部变更捕获 - 连接串中添加
?sslmode=disable(若未配 TLS)或?sslmode=require(推荐),否则 SysDB Service 启动直接报failed to connect to `host=... user=... database=...`: server error (FATAL: no pg_hba.conf entry) - 为避免连接耗尽,
sysdb.pool.max_connections建议设为 50+,且 PostgreSQL 的max_connections需同步调大(至少 100)
顺带一提:chroma-server 容器内默认不装 psql,调试连不上 SysDB 时,得进 postgres-chroma Pod 手动 psql -U user -d chroma 验证连通性。
Worker 节点扩容后查询没变快?查查 QueryService 的缓存配置
Chroma 的查询性能瓶颈往往不在向量计算本身,而在 QueryService 的本地缓存未生效。默认配置下,它只缓存最近 100 个查询结果,且缓存路径指向 /tmp(内存盘,易被清理)。
实操要点:
- 挂载持久化空目录到
/local/cache/chroma-query-service,并在queryservice.cache.path显式指定该路径 -
queryservice.cache.size_mb至少设为 512,小数据集可设 2048 - 确认
queryservice.cache.enabled为true(默认是false) - 扩容后执行
kubectl rollout restart deployment chroma-queryservice,否则旧 Pod 不加载新配置
真正容易被忽略的是:QueryService 的缓存键包含 embedding model 名称和维度,换了个 text-embedding-3-small 就算新模型,旧缓存完全失效——这点在灰度切换 embedding 模型时尤为致命。










