基于 K8s + vLLM + Dify + Milvus 的完整私有化大模型知识库系统,涵盖项目规划、架构设计、资源配置、面试问答全套指南。
某企业(500–1000人规模)业务知识分散于多部门文档、历史案例、操作手册中,员工获取信息依赖人工经验传递,
新员工上手周期长、同类问题重复沟通,内部支持响应效率低。
本项目由团队协作完成,我作为运维工程师主导底层 K8s 集群与基础设施建设,支撑大模型与 RAG 平台的整体私有化部署,
构建企业级智能知识库,实现业务知识统一沉淀与智能问答,全程数据不出内网,无需依赖外部 API。
| 节点角色 | 数量 | CPU | 内存 | 存储 | GPU |
|---|---|---|---|---|---|
| Master节点 | 3台 | 8核 | 16GB | 100GB SSD | 无 |
| 推理节点 | 1台 | 32核 | 64GB | 500GB SSD | A10 × 2张 |
| 向量化节点 | 1台 | 16核 | 32GB | 200GB SSD | A10 × 1张 |
| 存储节点 | 2台 | 16核 | 32GB | 2TB SSD | 无 |
| 节点 | GPU型号 | 显存 | 运行服务 | 显存占用 |
|---|---|---|---|---|
| 推理节点 | A10 × 2 | 48GB | DeepSeek 14B(双卡张量并行) | ~40GB(含KV Cache) |
| 向量化节点 | A10 × 1 | 24GB | BGE-M3 + Reranker-Large | ~5GB |
| 用途 | 模型 | 显存需求 | 选型理由 |
|---|---|---|---|
| 推理问答 | DeepSeek-R1-Distill-Qwen-14B | 双卡约40GB (权重28+缓存) |
中文效果强、开源免费、支持多卡并行;复杂业务逻辑可用其推理能力(备选 Qwen2.5-14B-Instruct,纯指令、延迟更低) |
| 文本向量化 | BGE-M3 | ~3GB | 中文检索最强Embedding模型 |
| 重排序 | BGE-Reranker-Large | ~2GB | 与BGE-M3配套,提升召回精度 |
"我来介绍一下我做过的一个 企业级 RAG 智能知识库私有化部署项目。 (停顿0.5秒)
项目背景是,客户是一家五六百人规模的企业,业务文档分散在各部门,员工找资料要靠问人, 新人上手特别慢,HR 每天回答的都是同样的问题。他们的核心诉求是 数据不能上云,必须私有化部署。
我负责整个底层基础设施的搭建和运维。首先我在本地搭了一个 7节点的 K8s 集群,3个Master保证高可用, 4个Worker节点按角色划分,推理节点、向量化节点、存储节点分开。
GPU 这块选了 NVIDIA A10,一共3张, 因为A10是企业级推理卡,功耗低、稳定性好,适合7×24小时运行。 用 GPU Operator 统一纳管, 通过节点亲和性把推理和向量化任务隔离调度,避免显存抢占。
推理服务用 vLLM 部署 DeepSeek 14B, 开启多卡张量并行解决单卡显存不够的问题, PagedAttention 和连续批处理让吞吐提升明显。 知识问答场景对延迟敏感,所以我做了 prompt 控制和参数调整,避免思维链拖慢响应。 上层用 Dify 做 RAG 应用平台, 对接 Milvus 向量库,搭了知识库问答和检索工作流。
整个链路全程内网,Nginx 统一入口,Harbor 管镜像,K8s 保高可用。 员工通过浏览器直接访问,外网员工走 VPN。 上线后重复问题的响应效率得到了显著提升。"
主要有三个原因:
分三个层面管理:
我们遇到过这个问题,排查思路是:
这是一个典型的企业生产环境选型问题,我们的考量是:
张量并行(Tensor Parallelism)是一种模型并行方式,把模型的权重矩阵按列或行切分到多张GPU上,每张GPU只保存一部分权重,推理时各卡并行计算再合并结果。
我们的场景:14B 模型 FP16 权重约 28GB(参数量 × 2 字节),单张 A10 只有 24GB 显存装不下,所以用 tensor-parallel-size=2 切到两张 A10 上,每张卡分到约 14GB 权重。
注意区分两个数字:14GB 是切分后的「权重显存」,但实际运行还要叠加 KV Cache 和激活值。我们设 gpu-memory-utilization=0.85,每卡实际占用约 20GB,剩下的显存留给 KV Cache 做并发缓存——这个余量直接决定能扛多少并发,不能拉满。
遇到过三个比较典型的难点:
PagedAttention 借鉴了操作系统的虚拟内存分页机制。
传统推理框架会为每个请求预分配一块连续的 KV Cache 显存,但请求的实际长度不固定,导致大量显存碎片浪费,真实利用率只有20-40%。
PagedAttention 把 KV Cache 切成固定大小的"页",按需动态分配,不同请求的页可以不连续存放,显存利用率提升到接近100%。
结果是:同样的显存能并发处理更多请求,推理吞吐量大幅提升,高并发场景下效果特别明显。
核心区别在于检索方式不同:
比如员工问"怎么请假",文档里写的是"休假申请流程",关键词搜不到,向量检索因为语义相似可以召回。这就是RAG必须用向量数据库的原因。
监控是这个项目我作为运维最核心的工作,分四层:
用 Prometheus 的 Alertmanager,告警分级推送(企业微信/钉钉机器人 + 邮件,紧急的电话)。几条核心规则:
用 EFK 方案(K8s 里更常用 Fluent Bit 替代 Logstash,更轻量):
这是运维日常,我的标准排查流程:
按状态对症:
K8s 网络排查从下往上分层定位:
有状态服务的数据必须持久化,不能存容器里(Pod 一重建就没了)。三个概念的关系:
我们的方案:存储节点用 SSD,通过 StorageClass 做动态供给。Milvus、PostgreSQL 用 StatefulSet 部署(保证 Pod 名字稳定、PVC 一一对应),配 volumeClaimTemplates 自动给每个副本分配独立存储。
Nginx 在这套系统里干三件事:反向代理、负载均衡、访问控制。
RAG 应用层(Dify 自定义组件、配置)和一些工具镜像走 CI/CD,模型镜像因为大不频繁动。流程:
靠滚动更新 + 探针配合实现不中断:
etcd 是 K8s 的大脑,存了所有集群状态,必须备份。
经典 Linux 性能排查,按 CPU → 内存 → 磁盘 → 网络 顺序定位:
设不好的后果:
按数据重要性和恢复成本分类备份:
先定位瓶颈在哪,再决定怎么扩:
这是个好问题,我的考量是高可用优先靠软件,而不是堆硬件冷备,原因有两点:
我实际的高可用设计:
我负责的是基础设施和运维保障这条线(诚实界定范围,别什么都往身上揽,容易穿帮):
量化价值(用相对值,别编绝对数字):