ChatGPT 共享站项目复盘:基于 new-api 的 AI 网关运维实践
我做了一个基于 new-api 的 AI 对话共享站:对外提供”聊天界面 + OpenAI 兼容 API”的统一 AI 服务。
适用岗位:运维工程师 / 技术支持工程师 / AI 运维工程师 / DevOps 工程师(AI运维岗必考)
一、项目速览
我做了一个基于 new-api 的 AI 对话共享站:对外提供”聊天界面 + OpenAI 兼容 API”的统一 AI 服务。
- 定位:new-api 是开源项目(GitHub: Calcium-Ion/new-api),本质是 OpenAI 接口的聚合/中继网关——上游接多家模型渠道(deepseek、OpenAI、本地 vLLM 等),下游对外只暴露一个 OpenAI 风格接口,并提供令牌管理、额度计费、限流能力。
- 我的工作:先是 docker-compose 版本(new-api + Redis + MySQL 8.2),后来完整重构到 Kubernetes(namespace + Redis + PostgreSQL + Ingress,文档记录了全过程),并把对外入口做成
https://api.internal/v1(OpenAI SDK 直接可调)。 - 技术栈:Kubernetes、Docker、nginx Ingress、cert-manager(私有 CA)、PostgreSQL、Redis、Harbor 私有镜像仓库。
- 结果:服务长期稳定运营,团队和用户用”一个 base_url + 一个 key”就能调用多模型,我负责从部署、K8s 化、证书到运维文档的全链路。
二、项目背景
动机:给团队/用户提供统一的 AI 对话与 API 服务;网关选型
1. 动机(为什么做)
- 团队和个人站点都需要 AI 对话能力,但直接各家用各家的:官网网页版散乱、不好管理;直接对接各家 API 需要自己解决密钥分发、额度控制、多模型切换,成本高又容易失控。
- 想要一个”统一出口”:对外只暴露一个 OpenAI 兼容接口,对内能接多家模型渠道,且能管人(令牌)、管钱(额度)、管量(限流)。
- 个人站点(sharedchat.fun 标注”基于 GPT-4.0 的公共服务、长期运营”)是这套能力对外的呈现,技术底座就是 new-api 网关。
- 团队环境里`` 里已有 qdrant、open-webui、vllm 等同类容器编排,说明”开源组件 + 私有化部署 + 容器化”是团队统一的基础设施模式,本项目是其中一环。
2. 网关选型(为什么是 new-api)
- 对比过 one-api / new-api / 自研轻量代理。自研要自己解决令牌、计费、限流、多渠道管理,工作量远大于收益;one-api 停更风险高、渠道支持少。
- new-api 是 one-api 的分支并持续迭代:渠道管理(接 deepseek/OpenAI/本地 vLLM 都行)、令牌系统(每人一个 key,带额度)、模型倍率计费、限流、日志审计,全部开箱即用;社区活跃,踩坑有现成方案。
- 官方 docker-compose 开箱即跑(new-api + Redis + MySQL 8.2,自带
/api/statushealthcheck),上手成本低。
3. 为什么上 K8s(重构动机)
- docker-compose 是单机形态,服务发现靠容器名、存储靠本地卷,无法支撑集群化、探针、证书管理和后续扩展。
- 公司已有 RKE2/k3s 集群和 Harbor 私有仓库、cert-manager 证书体系,把 new-api 迁进来才能纳入统一的发布、证书、存储规范。
三、完成情况
技术架构:new-api 网关 + Redis + PostgreSQL + Ingress,K8s 化部署,HTTPS/私有 CA,调用链路
1. 架构总览(面试可以现场画)
1 | 用户浏览器 / OpenAI SDK(api.internal,HTTPS,私有 CA 证书) |
2. 第一版:docker-compose(原始素材)
new-api:calciumion/new-api:latest,SQL_DSN=root:123456@tcp(mysql:3306)/new-api、REDIS_CONN_STRING=redis://redis、TZ=Asia/Shanghai;healthcheck 用wget请求http://localhost:3000/api/status检查"success":true。- 配套
redis+mysql:8.2(带数据卷mysql_data)。
3. 第二版:K8s 化重构(k8s-services/new-api/,文档 docs/250311_new_api.md 完整记录)
- namespace:
create-namespace.yaml(new-api)。 - Redis:Deployment + Service(6379),镜像走私有 Harbor(
harbor.internal/library/redis:latest),带资源 requests/limits。 - PostgreSQL 替换 MySQL:PVC(5Gi,ReadWriteOnce)+ Deployment(
POSTGRES_USER=root、POSTGRES_DB=new-api)+ Service(5432);postgres-cleaner一次性清理 Pod 解决首次初始化失败(详见 Q6)。 - new-api:Deployment 用 initContainers(busybox
nc -z postgres 5432/nc -z redis 6379循环等待依赖就绪),env 改为SQL_DSN=postgres://root:***@postgres:5432/new-api?sslmode=disable、REDIS_CONN_STRING=redis://redis、TZ=Asia/Shanghai、LOG_DIR=/app/logs;livenessProbe httpGet/api/status(initialDelaySeconds 30 / periodSeconds 30 / failureThreshold 3);Service 为 ClusterIP:3000。 - Ingress:
networking.k8s.io/v1,ingressClassName: nginx,hostapi.internal,path/Prefix → Service 3000,TLS 引用 cert-manager 签发的 secret。
4. HTTPS / 私有 CA(证书管理)
- cert-manager 的 CA 型 ClusterIssuer(
cluster-issuer,基于内部 CA 的rancher-casecret)→Certificate资源(api-cert,dnsNames: api.internal)→ 自动写入api-tls-secret→ Ingress TLS 引用。 - 代价:证书是私有 CA 签发,客户端必须信任
ca.crt才能无告警访问(浏览器导入 CA;Python/OpenAI SDK 调用要传verify=ca.crt)。
5. 调用链路与放号流程(对外可交付)
- OpenAI SDK 调用示例(运维文档):
base_url="https://api.internal/v1",model="deepseek-chat",http_client=httpx.Client(verify=ca.crt路径)。 - 申请 key 流程:加 hosts 记录 → 浏览器打开
api.internal登录 → 申请/查看自己的 key → 按文档调用。 - 文档体系:部署实录、调用方法、申请 key 与浏览器信任私有 CA 的步骤等,沉淀成完整运维文档。
四、负责内容
独立或主导:部署、K8s 化、证书、文档
本项目由我独立完成,主要分四块:
- 初版部署:按官方 docker-compose 落地 new-api + Redis + MySQL 8.2,验证
/api/status健康检查与基本对话链路,跑通放号(申请 key → 调用)全流程。 - K8s 化重构(主导):把 compose 三个服务拆成 namespace 下的 Deployment + Service;PostgreSQL 替换 MySQL(改连接串、加 PVC 持久化、写 postgres-cleaner 排障);new-api 加 initContainers 依赖检查与 livenessProbe;镜像全部切到公司私有 Harbor。
- 证书与入口:对接 cert-manager + 私有 CA ClusterIssuer,为
api.internal签发证书,配置 Ingress 的 TLS 与路由规则;解决客户端信任问题(写导入 ca.crt 的教程)。 - 运维文档沉淀:撰写/维护完整的部署、调用、申请与排障文档,让后来者按文档即可自助开通。
五、完成成效
长期稳定运营、统一 API 出口;客观说明规模
- 长期稳定运营:服务自上线后长期在线(个人站点 sharedchat.fun 持续对外提供服务),遇到故障有完整的”发现 → 定位 → 修复 → 沉淀文档”闭环(详见 Q13)。
- 统一 API 出口:团队和用户只需记住”一个域名
api.internal/v1+ 一个 key”,就能调用网关背后的多模型渠道,省去各家对接成本;聊天界面(open-webui 一类)也可直接接这个 OpenAI 兼容端点。 - 工程规范落地:完成 docker-compose → K8s 的迁移样板,纳入了公司统一的 Harbor 镜像、cert-manager 证书、PVC 存储、文档规范,后续同类服务可复制这套模式。
- 客观说明规模(诚实边界,别吹):这是个人/小团队量级的服务,单副本部署(new-api、Redis、PostgreSQL 各 1 个 Pod),高可用冗余有限——面试时主动讲清楚这个边界反而加分:说明你知道”单副本 ≠ 生产级高可用”,并给出多副本/数据库高可用的演进方案(见 Q15)。
六、面试官提问与参考回答
题量分布:基础问题 4 题 + 深入问题 6 题 + 刁钻/压力问题 5 题 = 15 题。
| 分组 | 题号 | 问题一句话 |
|---|---|---|
| 基础 | Q1 | new-api 是什么?这个项目做什么? |
| 基础 | Q2 | 整体架构怎么画?数据流怎么走? |
| 基础 | Q3 | 为什么用 new-api 而不是自研代理? |
| 基础 | Q4 | 数据怎么存?MySQL 换 PostgreSQL 怎么做的? |
| 深入 | Q5 | docker-compose 迁到 K8s 的思路与步骤? |
| 深入 | Q6 | postgres-cleaner 是什么?解决什么问题? |
| 深入 | Q7 | Redis 在 new-api 里起什么作用? |
| 深入 | Q8 | 健康检查从 docker 到 K8s 怎么改的? |
| 深入 | Q9 | HTTPS/私有 CA 怎么做?为什么不用 Let’s Encrypt? |
| 深入 | Q10 | 令牌、额度、限流怎么管理? |
| 压力 | Q11 | 简历写”GPT-4.0”但调用是 deepseek-chat,底层到底是什么模型? |
| 压力 | Q12 | “无限制的 AI 对话体验”——没有成本控制吗?被薅羊毛怎么办? |
| 压力 | Q13 | 长期运营稳定吗?遇到过什么故障、怎么恢复的? |
| 压力 | Q14 | 公共服务对外暴露,密钥泄露、内容合规怎么防? |
| 压力 | Q15 | 流量涨 10 倍,你的架构怎么扛? |
第一组:基础问题(4 题)
Q1. 介绍一下这个项目?new-api 是什么?
- 【面试官意图】考察你能否用 1 分钟讲清项目定位,以及是否真的理解 new-api 是什么(很多简历写了”网关”但说不清)。
- 【参考回答】结论一句话:这是一个基于 new-api 网关的 AI 服务共享站,对外提供 OpenAI 兼容的对话 API。new-api 是 GitHub 上的开源项目 Calcium-Ion/new-api,本质是 OpenAI 接口的聚合/中继网关:上游可以接多家模型渠道,比如 deepseek、OpenAI、本地 vLLM,下游对外只暴露一个统一的 OpenAI 风格接口,同时内置令牌管理、额度计费、限流这些能力。我的角色是把这套东西从 docker-compose 重构到 Kubernetes,并把 HTTPS、放号流程、运维文档整个链路补齐,最后对外就是
https://api.internal/v1这个入口。 - 【追问】
- 追问 1:new-api 和 one-api 是什么关系?→ new-api 是从 one-api fork 出来的分支,渠道支持更多、社区更新更活跃,很多国内团队在用;它兼容 one-api 的用法,所以迁移成本低。
- 追问 2:它对外暴露的接口长什么样?→ 就是 OpenAI SDK 兼容:
base_url设成https://api.internal/v1,model传deepseek-chat,OpenAI 官方 Python/JS SDK 直接能调,不用改业务代码。
- 【岗位侧重】通用
Q2. 整体架构是什么样?帮我画一下,数据流怎么走?
- 【面试官意图】考察架构表达能力和对数据面的理解,是否只停留在”我部署过”。
- 【参考回答】结论:客户端 → Ingress → new-api → 上游渠道,Redis 和 PostgreSQL 做支撑。用户请求打到
api.internal,nginx Ingress 终止 TLS 后转发到 new-api 的 ClusterIP Service(3000 端口);new-api 先查 Redis 做令牌校验和限流计数,再从 PostgreSQL 读渠道、令牌、额度配置,最后把请求转发到上游模型渠道并把流式响应原路回传。数据面上,PostgreSQL 管配置和账务,Redis 管缓存和高频计数。 - 【追问】
- 追问 1:为什么中间非要一个 Redis?→ new-api 通过
REDIS_CONN_STRING连接,令牌校验、额度/用量计数、限流这些高频读写放 Redis,避免每次请求都打数据库;不配也能跑(退化成直查库/内存),但性能和多实例共享状态都不行。 - 追问 2:Ingress 挂了会怎样?→ Ingress 本身是集群级组件,我们用的是多副本高可用的 nginx ingress-controller,单个 Pod 挂掉会自动重启;真正的入口风险在证书和域名解析,而不是 Ingress 本身。
- 追问 1:为什么中间非要一个 Redis?→ new-api 通过
- 【岗位侧重】通用 / 运维
Q3. 为什么用 new-api,而不是自己写一个代理?
- 【面试官意图】考察选型思路和对比能力,看你是不是”拿来就用、没想过为什么”。
- 【参考回答】结论:自研代理要自己解决令牌、计费、限流、多渠道管理,工作量远大于收益,而 new-api 这些全开箱即用。它提供渠道管理(deepseek、OpenAI、本地 vLLM 都能接)、令牌系统(每人一个 key 带独立额度)、模型倍率计费、限流和日志审计,社区活跃、文档全,踩坑有现成方案。另外我们公司仓库里 qdrant、open-webui、vllm 也都是”开源组件 + 私有化容器部署”的模式,选 new-api 和团队的基础设施风格是一致的。
- 【追问】
- 追问 1:open-webui 和 new-api 是什么关系?→ open-webui 是聊天前端,它可以配置 OpenAI 兼容端点作为后端;我这边 open-webui 的 docker-compose 也在仓库里,两者组合就是”聊天界面 + API 网关”,这也是共享站”既能网页聊、又能 API 调”的原因。
- 追问 2:选型时还对比过什么?→ 主要对比 one-api 和 new-api,还考虑过自研轻量代理;因为需要计费和令牌管理,自研性价比低,最终选 new-api。
- 【岗位侧重】通用 / DevOps
Q4. 数据怎么存的?MySQL 换 PostgreSQL 是怎么做到的?
- 【面试官意图】考察是否真部署过、以及数据库层替换的细节(很多人只会”换镜像”)。
- 【参考回答】结论:数据存在 PostgreSQL,替换 MySQL 只改了连接串,应用层零改动。原始 docker-compose 里 new-api 的
SQL_DSN指向mysql:3306;K8s 化时我改用 PostgreSQL,连接串变成postgres://root:xxx@postgres:5432/new-api?sslmode=disable,通过 Deployment 的环境变量注入,因为 new-api 兼容 MySQL 和 PostgreSQL 两种方言,所以应用代码不用动。PG 是 Deployment + 5Gi 的 PVC 持久化,数据不随 Pod 重启丢失。 - 【追问】
- 追问 1:为什么换成 PostgreSQL?→ 团队数据库栈以 PG 为主(仓库
docker_archive/container/postgres/就是现成的编排模板),统一技术栈便于维护;new-api 官方支持 PG,替换成本低。 - 追问 2:MySQL 里的存量数据迁移了吗?→ 当时是全新部署,没有存量迁移;如果真有,我会用 new-api 的备份/导出接口先把数据倒出来,再导入 PG,并做一轮全链路验证。
- 追问 1:为什么换成 PostgreSQL?→ 团队数据库栈以 PG 为主(仓库
- 【岗位侧重】通用 / 运维
第二组:深入问题(6 题)
Q5. docker-compose 迁到 K8s 的具体思路和步骤是什么?
- 【面试官意图】这是本项目最核心的考点,考察 K8s 基本功和迁移方法论。
- 【参考回答】结论:思路是”服务拆分 + 配置外置 + 依赖就绪 + 存储持久化 + 入口接管”五步。① 把 compose 里的 new-api、redis、mysql 三个服务拆成各自独立的 Deployment + Service,放进
new-apinamespace;② 环境变量(SQL_DSN、REDIS_CONN_STRING、TZ)从 compose 的 environment 搬进 Deployment env,并且用 K8s Service 名做服务发现,比如数据库就叫postgres、缓存就叫redis;③ 用 initContainers 做依赖检查,busybox 循环nc -z postgres 5432,直到依赖就绪才启动主容器,避免启动即报”连不上库”;④ 有状态的部分挂 PVC,docker 的 healthcheck 翻译成 livenessProbe;⑤ 对外入口从端口映射改成 Ingress,TLS 交给 cert-manager。 - 【追问】
- 追问 1:hostPath 和 PVC 怎么取舍?→ 生产数据用 PVC(我们的 PG 数据就是 5Gi PVC,跨 Pod 调度不丢);当时 new-api 的日志目录用了 hostPath,单节点没问题,要上多副本就得换成 PVC 或共享存储。
- 追问 2:镜像从哪拉?→ 全部从公司私有 Harbor(
harbor.internal)拉取,走内网化/离线化,符合公司镜像统一管理规范;这也避免了直接依赖 Docker Hub 的网络问题。
- 【岗位侧重】DevOps / 运维
Q6. postgres-cleaner 是什么?解决什么问题?
- 【面试官意图】考察踩坑与排障能力——这是部署实录里最真实的细节,能说出来说明你真做过。
- 【参考回答】结论:它是解决”PostgreSQL 首次初始化失败”的一次性清理 Pod。原因:PG 官方镜像要求数据目录为空才能初始化,但第一次部署时 PVC 挂载的数据目录里已经有残留内容(比如之前部署失败留下的数据、挂载点元数据),PG 初始化直接报错。cleaner 是一个 busybox 一次性 Pod,挂载同一个 PVC,执行
rm -rf /data/*清空目录,restartPolicy: Never跑完即止;清完后再正常启动 postgres 就成功了。 - 【追问】
- 追问 1:为什么不直接在 postgres 启动命令里清?→ 正常流程不该有残留,把清理做成独立的一次性 Pod,是为了保持”故障 → 诊断 → 修复”的过程可见、可审计,而且只清这个 PVC 的挂载目录,避免误删别的东西。
- 追问 2:现在集群里还有这个 Pod 吗?→ 没有,跑完就删了,它是排障专用;正常路径是 PVC 干净 → 直接部署 postgres。
- 【岗位侧重】运维 / AI运维
Q7. Redis 在 new-api 里到底起什么作用?
- 【面试官意图】考察对中间件角色的理解,而不是”我照文档配了”。
- 【参考回答】结论:Redis 主要做缓存和计数:令牌校验结果、额度/用量计数、限流计数、会话这类高频数据。new-api 通过
REDIS_CONN_STRING连接 Redis;不配也能跑(退化为直查数据库或内存态),但配上能显著减轻数据库压力,而且多实例部署时必须靠 Redis 共享状态。我把 Redis 也搬进了 K8s(Deployment + Service,6379 端口),镜像走私有 Harbor。 - 【追问】
- 追问 1:Redis 挂了会怎样?→ new-api 有容错,会退回数据库直查,功能不中断但性能下降、限流可能失效;我们当时 Redis 是单副本,这是个人/小团队量级可接受的边界,真挂了重启即可。
- 追问 2:new-api 多副本部署时必须配 Redis 吗?→ 必须。多实例要共享令牌/额度状态就靠 Redis;对应 new-api 多机部署的配置还有
SESSION_SECRET(多机必须改)、NODE_TYPE=slave、SYNC_FREQUENCY、FRONTEND_BASE_URL,这些在官方 compose 注释里都写着。
- 【岗位侧重】运维 / AI运维
Q8. 健康检查怎么从 docker 搬到 K8s 的?
- 【面试官意图】考察探针知识(liveness/readiness 区别、参数含义),运维岗常考。
- 【追问】
- 追问 1:为什么用
/api/status这个端点?→ 它是 new-api 内置的状态接口,返回{"success":true}这类 JSON,能真实反映应用可用,而不是只验证端口通不通。 - 追问 2:liveness 和 readiness 有什么区别?→ liveness 决定”要不要重启”,readiness 决定”能不能接流量”;网关类服务主要用 liveness 就够了,有启动耗时、依赖迁移的应用才需要 readiness 控制流量什么时候放进来。
- 追问 1:为什么用
- 【岗位侧重】运维 / DevOps
Q9. HTTPS 和私有 CA 是怎么做的?为什么不用 Let’s Encrypt?
- 【面试官意图】考察证书体系理解(cert-manager、ClusterIssuer、私有 CA 的取舍),这是本项目最容易暴露”只配置不理解”的点。
- 【参考回答】结论:用 cert-manager + CA 型 ClusterIssuer 给
api.internal自动签发证书;不用 Let’s Encrypt 是因为这是私有域名 + 内网环境,没有公网 ACME 验证通道。具体做法:集群里先有 cert-manager 和一个 CA 型cluster-issuer(基于内部根 CA 的rancher-casecret),再创建Certificate资源(api-cert,dnsNames: api.internal),cert-manager 自动把签好的证书写进api-tls-secret,Ingress 的 TLS 段引用这个 secret 即可。代价是客户端必须信任我们内部 CA——所以文档里专门写了浏览器导入ca.crt的步骤,Python/OpenAI SDK 调用要传verify=ca.crt路径。 - 【追问】
- 追问 1:证书到期怎么办?→ cert-manager 自动续期,到期前自动重签并更新 secret,ingress-nginx 会自动加载新证书,运维无感;这是当初选 cert-manager 而不是手工签证书的主要原因。
- 追问 2:为什么客户端要装 ca.crt?→ 因为根 CA 是我们自签的内部 CA,不在系统和浏览器的信任库里;客户端信任这个 CA 后,所有内部域名签发的证书都被信任,相当于内网 PKI 的根。
- 【岗位侧重】运维 / DevOps
Q10. 令牌、额度、限流是怎么管理的?
- 【面试官意图】考察 new-api 核心功能的理解和成本控制思维——AI 运维岗必考。
- 【参考回答】结论:new-api 的令牌系统就是答案:在管理后台给每个用户/应用创建一个 Token(key),并配置额度(quota)、可用模型、模型倍率、有效期、限流(比如每分钟请求数),用量按模型倍率实时扣减。对外放号就是”申请 key → 设额度 → 用户用 OpenAI SDK 调”。这正好回答”怎么防滥用”:额度用完 key 自动失效,超限流直接 429,管理员随时可以吊销某个 key。
- 【追问】
- 追问 1:额度是什么单位?怎么扣的?→ new-api 里有额度(quota)概念,每个模型配一个倍率,请求时按模型倍率从令牌额度里扣减,贵模型倍率高、扣得快,天然引导用户用便宜模型。
- 追问 2:有人拿 key 去调他没权限的模型怎么办?→ 令牌可以限定可用的渠道/模型范围;后台还有每个 key 的调用明细日志,异常行为一眼可见,直接吊销重发。
- 【岗位侧重】AI运维
第三组:刁钻/压力问题(5 题)
Q11. 简历写”基于 GPT-4.0 的公共服务”,但调用示例是 deepseek-chat,底层到底是什么模型?
- 【面试官意图】压力测试 + 诚信测试:看你会不会为了圆谎越编越大,或直接露怯。这是本项目常见的高难度问题。
- 【追问】
- 追问 1:你能保证用户每次请求用的就是 GPT-4.0 吗?→ 不能拍胸脯保证每个请求都落到 GPT-4.0,路由由网关按渠道配置和可用性决定;如果我对外承诺”100% GPT-4.0”而实际路由到别的模型,那是不严谨的。
- 【岗位侧重】通用(所有岗位重点)
Q12. 你说”无限制的 AI 对话体验”,没有成本控制吗?被薅羊毛怎么办?
- 【面试官意图】考察成本意识与限流设计——“无限制”三个字是简历里的高危表述,面试官一定会抓。
- 【追问】
- 追问 1:如果真有人刷爆你的额度怎么办?→ 单个 key 额度独立封顶,刷爆的是他那个 key,不影响别人;网关层还有全局限流和告警,可以在总预算被打穿前人工介入、吊销 key。
- 追问 2:实际遇到过滥用吗?→ 遇到过有人拿 key 到处乱发的情况,处理是吊销 key、收紧新 key 的默认额度、在申请文档里写明使用规范,之后基本没有再犯。
- 【岗位侧重】AI运维
Q13. 你说长期运营,稳定吗?遇到过什么故障、怎么恢复的?
- 【面试官意图】考察故障处理能力和诚实度——编一个”零故障”的故事比讲真故障更危险。
- 【参考回答】结论:服务整体长期在线,但确实踩过坑,印象最深三个:① PostgreSQL 首次初始化失败(数据目录非空),用 postgres-cleaner 一次性清理后恢复正常,并把原因和修法写进了部署文档;② new-api Pod 偶发重启,靠 livenessProbe 自动拉起,用户基本无感知;③ 证书信任问题——用户第一次访问总报不安全,排查发现是浏览器没导入内部 ca.crt,后来把导入步骤写进申请文档,问题就消失了。这三次都是”发现 → 定位 → 修复 → 沉淀文档”的完整闭环。
- 【追问】
- 追问 1:Pod 重启算不算故障?→ 单副本下重启会有秒级抖动,对个人/小团队服务可接受;真正做 SLA 的场合要上多副本 + readiness 探针 + 数据库高可用,我在 Q15 里讲了演进路径。
- 追问 2:有没有丢过数据?→ 没有。PG 数据在 PVC 上持久化,Pod 重启不丢数据;这也验证了当时坚持挂 PVC 而不是裸跑容器是对的。
- 【岗位侧重】运维 / AI运维
Q14. 公共服务暴露在外网,密钥泄露、内容合规怎么防?
- 【面试官意图】考察安全合规意识——运维和技术支持岗都爱问,答得不好会显得没有生产安全意识。
- 【参考回答】结论:核心是”最小化暴露 + 可追溯 + 可熔断”。最小化:key 按人/按应用独立发放、额度独立,泄露一个只影响一个;可追溯:每个请求都能查到是哪个 key、哪个 IP、调了什么模型;可熔断:发现异常随时吊销 key、封禁 IP。内容合规方面:网关自身不做内容审核时,靠平台使用规则 + 渠道侧策略约束,日志按规范保留、最小化收集用户输入,敏感内容不额外留存。
- 【追问】
- 追问 1:key 泄露了怎么处理?→ 立刻吊销并重新签发,查泄露 key 的调用记录评估影响,再收紧该用户的额度默认值,最后把泄露原因记入文档避免再犯。
- 追问 2:用户对话内容会被记录下来吗?→ 网关会保留调用日志(排障和审计需要),但按”最小必要”原则,明文对话内容不做额外留存,日志和后台的访问都做权限控制。
- 【岗位侧重】通用 / 运维 / 技术支持
Q15. 如果流量涨 10 倍,你的架构怎么扛?
- 【面试官意图】考察扩展性思考和诚实边界——看你是吹”天生高可用”还是能讲清演进路径。
- 【参考回答】结论:当前是单副本的个人/小团队量级,涨 10 倍我会按三步走:① new-api 扩多副本,配置
SESSION_SECRET、NODE_TYPE=slave、SYNC_FREQUENCY、FRONTEND_BASE_URL做多机部署,前面由 Ingress 自带负载均衡分发;② Redis 承担更多缓存和计数,保证多实例间令牌/额度状态一致;③ 数据库是单点,PG 从单实例升级为主从或直接复用公司现成的 PG 高可用方案。再往上就是补监控告警、分层限流和容量规划。 - 【追问】
- 追问 1:数据库会是瓶颈吗?→ 网关这种读写比,PG 单实例能扛的量级其实不低,但多副本后连接数和写放大要关注,所以第二步就把 PG 高可用提上日程,而不是等爆了再动。
- 追问 2:现在有什么监控?→ 当时主要通过 K8s 探针、Pod 状态和 new-api 自带日志/后台统计看健康度;生产级会补 Prometheus + Grafana 和告警,这是我后续迭代的方向,也正好是我想在岗位上补足的能力。
- 【岗位侧重】DevOps / AI运维
附:一句话总结
我用 new-api 网关搭了一个统一 AI 服务出口:docker-compose 起步,后来完整重构到 K8s(Redis 做缓存计数、PostgreSQL 持久化、Ingress + cert-manager 私有 CA 提供 HTTPS),对外是 OpenAI 兼容的
api.internal/v1,用令牌、额度、倍率、限流控制成本与滥用,踩过的坑(PG 初始化失败、证书信任)都沉淀成了运维文档。规模是个人/小团队单副本,但我清楚往多副本、数据库高可用演进的路径。