FDE W7D7 学习手册 · K8s 基础拓扑、灰度回滚与企业平台整合
W7 Day7 · B 级(平台整合与交付收口)· 4h · 学完能讲清"K8s 下 AI 服务怎么部署/灰度/回滚 + W7 整体如何串成企业 Agent 平台最小版"
一、K8s 基础概念与核心对象
1.1 为什么 AI 平台要用 K8s
K8s 提供声明式编排、自动调度、自愈、扩缩容、服务发现、滚动发布 。对一个要 7×24 的企业 AI 平台(网关 + 业务 + 模型服务),这些是生产必备,手动 Docker 做不到。
1.2 三大核心对象(本次重点)
对象 做什么 AI 场景对应
Deployment 管理无状态应用的副本与版本 Spring AI 业务、LiteLLM 网关
Service 稳定虚拟 IP + 负载均衡,屏蔽 Pod 变化 网关/业务内部互访的固定地址
Ingress 对外暴露 HTTP 路由 外部流量进网关/业务
对企业交付,K8s 是"生产级"的代名词。D6 讲的 Docker/Compose 是演示,K8s 才是生产。Java 候选人要能说清:业务和网关都是 Deployment 跑多副本,Service 给稳定地址,Ingress 管外部入口——模型服务若有 GPU 也用 Deployment/StatefulSet 调度。
K8s 给 AI 平台自愈、扩缩容、滚动发布。三大对象:Deployment 管副本版本(业务/网关)、Service 给稳定地址+负载均衡、Ingress 管外部 HTTP 入口。这是生产级部署骨架。
① Deployment 管无状态 ;模型权重/有状态存储别放 Pod 本地(用 Volume/外部存储),否则 Pod 重建数据丢。② Service 的 ClusterIP 只在集群内,外部访问必须靠 Ingress/LoadBalancer。③ K8s 不是"装了就高可用",控制面/节点也要有冗余,单节点集群不等于高可用。
二、Deployment:AI 服务的无状态部署
2.1 结构
Deployment 定义"我要跑几个副本、用哪个镜像、探针怎么配",K8s 保证实际状态向期望状态收敛(自愈)。
apiVersion: apps/v1
kind: Deployment
metadata: { name: litellm-gateway }
spec:
replicas: 3 # 多副本高可用
selector: { matchLabels: { app: litellm } }
template:
metadata: { labels: { app: litellm } }
spec:
containers:
- name: litellm
image: ghcr.io/berriai/litellm:main
ports: [{ containerPort: 4000 }]
readinessProbe: # 模型/依赖就绪才接流量
httpGet: { path: /health/liveliness, port: 4000 }
initialDelaySeconds: 10
livenessProbe: # 进程死才重启
httpGet: { path: /health/liveliness, port: 4000 }
resources:
requests: { cpu: "500m", memory: "512Mi" }
limits: { cpu: "1", memory: "1Gi" }
2.2 AI 场景注意
网关/业务 :无状态,多副本横向扩展,资源按 CPU/内存限。
GPU 模型服务 :用 resources.limits.nvidia.com/gpu 申请 GPU,节点需有 GPU 且装 device plugin。
探针阈值 :呼应 D6,模型加载慢,initialDelaySeconds 给足。
Deployment 的"期望状态"模型是 K8s 的核心心智:你声明要 3 个副本,K8s 自己维持。挂一个它补一个,这就是自愈。对交付而言,副本数 + 资源 limit + 探针,是 Deployment 三要素。
Deployment 声明副本数/镜像/探针,K8s 维持期望状态(自愈、挂了补)。AI 场景:网关业务多副本无状态;GPU 模型要申 GPU 资源;探针阈值适配模型加载。
① 不设 resources.limits,Pod 可能吃光节点资源拖垮他人(呼应 D6 OOM)。② 副本数=1 没有高可用,网关挂全瘫(呼应 D5)。③ GPU 资源是节点级稀缺 ,限量申请,别贪婪。
三、Service:服务发现与负载均衡
3.1 作用
Pod 会漂、会重建、IP 会变。Service 给一组 Pod 一个稳定虚拟 IP + DNS 名 ,自动负载均衡到健康 Pod。调用方只认 Service 名,不认 Pod IP。
Spring AI ──▶ Service(litellm-gateway:4000) ──▶ 多个网关 Pod(负载均衡)
3.2 类型
类型 暴露范围 用法
ClusterIP 仅集群内 内部互访(业务↔网关)
NodePort 节点端口 测试用,少用
LoadBalancer 云负载均衡器 云上对外(常配合 Ingress)
Spring AI 配置的 base-url 在 K8s 里就该写成 Service 名(如 http://litellm-gateway:4000/v1),而不是某个 Pod IP。这样网关扩缩容、Pod 重建,Java 侧完全无感——这正是 D6"调用链稳定"的落地。
Service 给稳定虚拟 IP+DNS,负载均衡到健康 Pod,屏蔽 Pod IP 变化。内部用 ClusterIP,Spring AI 的 base-url 写 Service 名,网关扩缩容业务无感。
① Service 不解决"服务挂了"的问题,它只转发到健康 Pod;若全部 Pod 挂,Service 也无响应——要结合副本数+探针+Ingress。② ClusterIP 外部不可达,别指望从集群外直接 curl。③ Service 的负载均衡是四层(IP:端口) ,按路径/域名的路由交给 Ingress。
四、Ingress:对外暴露与路由
4.1 作用
Ingress 是 K8s 的七层(HTTP)入口 :按域名/路径把外部流量路由到对应 Service。例如 /api/ai/* 进网关 Service,/admin/* 进管理界面。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: { name: ai-platform-ingress }
spec:
rules:
- host: ai.example-insurance.com
http:
paths:
- path: /v1
pathType: Prefix
backend: { service: { name: litellm-gateway, port: { number: 4000 } } }
- path: /admin
pathType: Prefix
backend: { service: { name: litellm-ui, port: { number: 80 } } }
4.2 与 Service 的配合
Ingress 是"大门+楼层指示牌",Service 是"房间号"。外部请求先到 Ingress,再按规则转到内部 Service,再到 Pod。
对保险客户,Ingress 常配 TLS(HTTPS)+ WAF + 限流,是安全边界。外部只暴露 Ingress 域名,内部 Service 不对外。这也是 D6"环境隔离"在 K8s 的落地:不同环境不同 Ingress 域名/namespace。
Ingress 是七层入口,按域名/路径路由到内部 Service(再转 Pod)。外部只暴露 Ingress,内部 Service 不对外。常配 TLS/WAF/限流做安全边界。
① Ingress 本身要有一个 Ingress Controller(如 nginx)在跑,否则规则不生效。② 路径匹配 Prefix 是前缀匹配,配错可能误伤(如 /v1 也会匹配 /v1beta),要理解 pathType。③ Ingress 不是认证,TLS 只加密传输,访问控制另做。
五、AI 服务在 K8s 的部署形态(含 GPU/资源)
5.1 三类负载
组件 K8s 对象 资源 副本/状态
Spring AI 业务 Deployment CPU/内存 无状态,多副本
LiteLLM 网关 Deployment CPU/内存 无状态,多副本(咽喉高可用)
模型推理服务 Deployment/StatefulSet GPU + 内存 可能需 GPU 节点池
Postgres(网关库) StatefulSet CPU/内存/磁盘 有状态,需持久卷
5.2 GPU 调度要点
节点打标签(如 nvidia.com/gpu),Pod 用 nodeSelector/toleration 调度到 GPU 节点。
模型权重用 PVC/对象存储挂载,不进镜像(呼应 D6)。
GPU 共享/切分(如 MIG)按场景,避免浪费。
企业 Agent 平台最小版在 K8s 的占位:业务 Deployment、网关 Deployment、数据库 StatefulSet 放同一集群不同 namespace;模型推理若用外部厂商(OpenAI 等)则无需自管 GPU,网关直接出网——这是多数保险交付的起点(先不养 GPU 集群)。
AI 平台在 K8s:业务/网关用 Deployment 多副本无状态;模型推理用 Deployment/StatefulSet 申 GPU;数据库用 StatefulSet + 持久卷。多数保险交付先接外部模型、不自管 GPU。
① 数据库用 Deployment 跑、数据存 Pod 本地 = 重启即丢,必须用 StatefulSet + PVC。② GPU 节点贵且稀缺,Pod 没配 nodeSelector 可能被调度到 CPU 节点导致起不来。③ 网关和数据库放同一 Pod/同副本=耦合,要分开部署独立伸缩。
六、滚动更新(Rolling Update)
6.1 原理
Deployment 更新镜像时,默认滚动更新 :逐批用新 Pod 替换旧 Pod,期间服务不中断(新旧并存)。
maxSurge(最多多起几个新 Pod)+ maxUnavailable(最多允许几个旧 Pod 同时下线)控制节奏
6.2 配置
spec:
strategy:
rollingUpdate:
maxSurge: 1 # 最多比期望多 1 个新 Pod
maxUnavailable: 0 # 更新期间不允许旧 Pod 低于副本数(零停机)
minReadySeconds: 15 # 新 Pod 就绪后等 15s 再继续
滚动更新是"默认的安全发布"。对网关这种咽喉,务必 maxUnavailable: 0 保证零停机,配合 Readiness(呼应 D6/D7 探针)确保新 Pod 真就绪才接流量。金融客户验收常要求"发布不影响线上业务"。
滚动更新逐批换新 Pod、新旧并存不中断。maxSurge 控新增、maxUnavailable 控下线(网关设 0 零停机)。新 Pod 经 Readiness 才接流量,发布不影响线上。
① maxUnavailable>0 在副本少时会导致"发布期间容量下降",网关若设大可能短时能力不足。② 没有 Readiness 配合,新 Pod 一启动就被打流量,模型没加载完就报错。③ minReadySeconds 不够,滚动太快,问题 Pod 没暴露就全换了,回滚来不及。
七、金丝雀发布(Canary)
7.1 原理
金丝雀:先放少量流量(如 5%~10%) 到新版本,观察指标(错误率/延迟/成本)正常,再逐步放量到 100%。是比滚动更新更稳妥的"小步验证"。
7.2 在 K8s 怎么实现
方式 做法
多 Deployment + Service 权重 新旧各一个 Deployment,用 Ingress/Service Mesh 按权重分流
Service Mesh(Istio) VirtualService 配流量比例,灰度精细
Ingress 注解 部分 Ingress Controller 支持 canary 注解(如 nginx ingress canary)
7.3 适用
模型/网关升级风险高(新模型效果未知、新网关配置可能错),先金丝雀看真实效果再全量,避免"全量上线发现更差"。
对保险 Agent 平台,模型效果直接影响理赔/核保结论,不能全量盲更 。金丝雀先放 5% 真实流量,对比新旧版本的错误率与人工抽检质量,确认不劣化再放量——这是"负责任的 AI 发布"。
金丝雀先放少量流量(5%~10%)到新版本,观察错误率/延迟/质量正常再放量。K8s 可用多 Deployment+权重、Istio、或 Ingress canary 注解实现。模型升级风险高,必须小步验证。
① 金丝雀若"只看系统指标不看业务指标",可能放过"效果变差但没报错"的坏版本(如新模型答非所问但 HTTP 200)。要结合质量评估。② 没有流量分割能力(纯 Service)做不了真金丝雀,需 Ingress/Mesh 支持。③ 金丝雀期间两套副本都跑,资源成本翻倍,注意容量。
八、回滚(Rollback)到上一版本
8.1 原理
Deployment 每次更新会生成修订版本(revision) 。出问题 kubectl rollout undo 即可回滚到上一个稳定 revision,K8s 自动把 Pod 换回旧镜像。
kubectl rollout undo deployment/litellm-gateway # 回滚到上一版
kubectl rollout history deployment/litellm-gateway # 看修订历史
8.2 回滚前提
保留旧镜像 :回滚靠旧镜像还在仓库,别删。
状态兼容 :若新版本改了数据库 schema 且不兼容,回滚后旧代码可能读不了新数据——要配迁移策略。
快速检测 :要有监控/告警,才能"及时发现→快速回滚"。
回滚是"发布安全网"。交付时必须演示:能一键回滚、旧镜像保留、监控能及时报警。金融客户尤其看重"出事 5 分钟内回退"的能力。注意:AI 平台回滚还要考虑模型版本与 Prompt 版本一致,避免代码回退但模型没回退的半吊子状态。
Deployment 有修订历史,kubectl rollout undo 一键回滚上一版。前提:旧镜像保留、状态兼容、监控能及时发现。AI 平台还要注意模型/Prompt 版本一并回退。
① 删了旧镜像/旧 revision,回滚失败——要保留历史 revision(设 revisionHistoryLimit)。② 只回滚代码不回滚数据库迁移,可能新旧不兼容崩。③ "回滚"只是换 Pod,若新版本已写入不兼容数据,旧代码读会错,需数据兼容设计。④ AI 场景模型版本没同步回退 = 代码旧模型新,行为不一致。
九、企业 Agent 平台最小版:组件清单
9.1 W7 整体产出盘点
层 组件 来源(W7 哪天) K8s 对象
应用 Spring AI 业务服务(Java) D6 调用链、D7 Deployment + Service
网关 LiteLLM Proxy D5 Deployment + Service
治理数据 Postgres(Key/预算/Spend) D5 StatefulSet + PVC
模型 厂商模型 / 私有推理 D5/D7 外部 API 或 Deployment(GPU)
入口 Ingress + TLS D7 Ingress
交付 镜像/Secret/探针/隔离 D6 Secret/ns/探针
这就是"企业 Agent 平台最小版"的落地清单。面试被问"你这一周做了什么",就按这张表讲:从网关选型(D5)、调用链与 Docker 交付(D6)、到 K8s 拓扑与灰度回滚(D7),形成一个能跑、能治理、能发布的企业 Agent 平台骨架。
最小版组件:Spring AI 业务(Deployment)、LiteLLM 网关(Deployment)、Postgres 治理库(StatefulSet)、厂商/私有模型、Ingress 入口、Secret/探针/隔离交付件。这正是 W7 三天串起来的产出。
① "最小版"不是"简陋版"——治理(Key/预算/成本)和发布安全(灰度/回滚)是标配,不是可选项。② 别漏 Postgres:网关的"记忆"在库里,没它治理失效。③ 清单要能映射到 K8s 对象,不能只说"有个网关",要说清它在 K8s 怎么跑。
十、企业 Agent 平台最小版:调用链串联
10.1 端到端调用链
用户/系统 ──(Ingress)──▶ Spring AI 业务(Deployment) ──(Service)──▶ LiteLLM 网关(Deployment)
──(虚拟 Key)──▶ 厂商/私有模型 ──▶ 结果原路返回
(网关落库 Postgres 记成本,全程 Trace id 串联)
10.2 与 D6 单一职责呼应
路由 :网关一层做(业务只选虚拟 Key)。
重试 :网络重试只一层(如 Spring AI),业务级带反馈重试在应用层。
成本 :网关落库唯一可信来源。
发布 :网关/业务各自 Deployment,独立滚动/金丝雀/回滚。
这条调用链就是 W7 的"总产出证据"。从用户请求进 Ingress,经业务编排、网关治理、模型推理,结果返回,全程成本被网关记账、Trace 串联。每一段在 W7 都有对应章节支撑——这就是"周级整合讲故事"的骨架。
调用链:Ingress→Spring AI 业务→LiteLLM 网关(虚拟Key)→模型→原路返回;网关落库记成本,Trace 串联。路由/重试/成本各一层(D6),网关与业务独立发布(D7)。
① 调用链里若业务和网关都做成本统计,又回到 D6 的 double count,整合时别退化。② Trace id 要贯穿各层(Ingress 生成、透传到业务/网关/模型),否则排障断链。③ 网关挂了业务要有降级(D6),否则整条链断。
十一、整体可观测与成本(呼应 W7 全局)
11.1 三层可观测
信号 内容 工具(非 OpenAI)
Logs 各层请求/错误日志 Loki / ELK
Metrics QPS/延迟/错误率/成本 Prometheus + Grafana
Traces 跨层调用链 Jaeger / OpenTelemetry
11.2 成本闭环
网关(LiteLLM)落库的成本数据 → Prometheus 抓取/BI 报表 → Grafana 看板,实现"哪个业务线/项目花多少"的可视化(呼应 D5 项目级成本)。结合告警,预算超 80% 自动通知。
交付企业平台,"能看"和"能管"一样重要。可观测三件套(日志/指标/链路)+ 成本看板,让运维和财务都能自助。这也是 D5 管理界面之外,更工程化的可观测方案。
可观测三件套:Logs(Loki/ELK)、Metrics(Prometheus+Grafana)、Traces(Jaeger/OTel)。成本由网关落库→Prometheus/BI→Grafana 看板,实现业务线花费可视化+预算告警。
① 只装 Prometheus 不配告警 = "出了事才知道",要配阈值告警。② Trace 不贯穿(某些层没埋点)= 调用链断裂,排障回到"猜"。③ 成本看板若数据源是"应用自己记的"(D6 反模式),会和网关对不上,必须以网关为准。
十二、W7 整体整合:从零到"企业 Agent 平台最小版"
12.1 一句话总结 W7
D5 选网关(LiteLLM) + 写决策(ADR) → D6 定调用链(单层路由/重试/成本) + Docker 交付(Secret/探针/隔离)
→ D7 上 K8s(Deployment/Service/Ingress) + 灰度回滚 → 串成企业 Agent 平台最小版
12.2 给面试官的"周成果陈述"模板
可照着讲: "这一周我搭出了一个企业级 Agent 平台的最小可用骨架。先基于 Build vs Buy 分析选了 LiteLLM 做模型网关,并用 ADR 把决策留痕;然后设计了单一调用链——路由、重试、成本统计各只在一层,避免冲突和双计;再用 Docker/K8s 落地部署,配好 Secret、双探针和环境隔离;最后在 K8s 上用 Deployment/Service/Ingress 串起业务、网关、模型,并支持滚动更新、金丝雀和一键回滚。整体具备虚拟 Key、预算、多租户成本和可观测能力,可直接往保险业务线落地。"
W7 的本质是"把 AI 能力变成可治理、可交付、可运维的企业平台",而不只是"能调通一个模型"。Java 候选人最大的卖点就是:从应用框架(Spring AI)到平台治理(网关)到生产交付(K8s),全链路都能讲清、能落地。
W7 主线:选网关+ADR → 定单一调用链+Docker 交付 → 上 K8s 灰度回滚 → 串成平台最小版。面试讲"周成果"就用这条线,体现全链路(应用→治理→交付)能力。
① 整合讲述时别堆名词,要讲"为什么这么做"(决策可追溯、调用链不冲突、发布可回退)。② 别把一个组件说成"我全做了",要分清"用了开源 LiteLLM"和"自研了什么"(路由适配/业务编排)。③ 面试若追问"这平台还差什么",要能说(如模型效果评测、权限细粒度、审计日志)——体现你知道边界。
十三、面试达标线①:K8s 部署与灰度回滚
主题 要点
拓扑 Deployment(业务/网关多副本) + Service(稳定地址+负载均衡) + Ingress(外部HTTP路由+TLS)
AI 形态 无状态多副本;GPU 模型申 GPU 资源+节点调度;数据库用 StatefulSet+PVC
滚动更新 maxSurge/maxUnavailable 控节奏,maxUnavailable=0 零停机,配合 Readiness
金丝雀 少量流量验证(看系统+业务指标),再放量;靠 Ingress/Mesh 分流
回滚 revision 历史 + rollout undo 一键回退;旧镜像保留、状态兼容、监控及时发现
核心:K8s 用 Deployment/Service/Ingress 部署 AI 服务;发布用滚动更新(零停机)或金丝雀(小步验证),出问题一键回滚。网关高可用多副本,模型按需 GPU,数据库 StatefulSet。
十四、面试达标线②:W7 整体形成"企业 Agent 平台最小版"
组件清单:Spring AI 业务 + LiteLLM 网关 + Postgres(治理) + 模型 + Ingress + Secret/探针/隔离
调用链:Ingress → 业务 → 网关(虚拟Key) → 模型 → 返回;网关落库记成本,Trace 串联
治理闭环:虚拟 Key / 预算 / 多租户 / 项目成本 / 可观测看板
发布能力:滚动更新 / 金丝雀 / 一键回滚
组件 :业务(Deployment)、网关(Deployment)、Postgres(StatefulSet)、模型(外部/Deployment)、Ingress 入口、Secret/探针/隔离交付件。
调用链 :与 D6 单一职责呼应,路由/重试/成本各一层,Trace 贯穿。
治理 :虚拟 Key、预算、多租户、项目级成本(D5),可观测三件套+成本看板(D7)。
发布 :网关与业务独立滚动/金丝雀/回滚(D7)。
决策 :Build vs Buy + ADR 留痕(D5),让平台选型可辩护。
十五、W7D7 自测清单
能说出 K8s 三大核心对象(Deployment/Service/Ingress)及其在 AI 平台的对应。
能写出 Deployment 的关键字段(副本/镜像/探针/资源)并解释 AI 场景注意点。
能讲清 Service 为什么需要(屏蔽 Pod IP 变化)、ClusterIP 与外部访问的区别。
能讲清 Ingress 的七层路由作用,及与 Service 的配合、TLS/安全边界。
能说明 AI 服务在 K8s 的部署形态(业务/网关 Deployment、数据库 StatefulSet、GPU 调度)。
能解释滚动更新的原理与 maxSurge/maxUnavailable,及为何网关设 maxUnavailable=0。
能说出金丝雀发布的做法、实现方式(多 Deployment/权重、Istio、Ingress canary)与适用。
能讲清回滚的原理(revision)、命令,以及回滚前提(旧镜像保留/状态兼容/监控)。
能列出"企业 Agent 平台最小版"的组件清单并映射到 K8s 对象。
能画出端到端调用链并说明与 D6 单一职责的呼应。
能讲清可观测三件套(Logs/Metrics/Traces)与成本看板如何闭环。
能用一段话把 W7 三天整合成"周成果"向面试官陈述。
十六、高频面试题速记卡
Q:K8s 三大核心对象是什么?
Deployment 管副本版本(业务/网关)、Service 给稳定地址+负载均衡、Ingress 管外部 HTTP 路由。生产级部署骨架。
Q:Service 解决什么问题?
Pod IP 会变,Service 给稳定虚拟 IP+DNS 并负载均衡到健康 Pod。Spring AI 的 base-url 写 Service 名,网关扩缩容无感。
Q:Ingress 和 Service 什么关系?
Ingress 是大门+路径路由(七层),Service 是房间号(四层)。外部先到 Ingress 再转 Service 到 Pod。外部只暴露 Ingress。
Q:滚动更新怎么做到不中断?
逐批换 Pod、新旧并存;maxUnavailable=0 保容量,新 Pod 经 Readiness 才接流量。结合 minReadySeconds 防过快。
Q:金丝雀和滚动更新区别?
滚动是逐批全量换;金丝雀是先放 5%~10% 流量验证(系统+业务指标)再放量,更稳,需 Ingress/Mesh 分流。
Q:K8s 怎么回滚?
Deployment 有 revision 历史,kubectl rollout undo 一键回退。前提:旧镜像保留、状态兼容、监控及时发现。
Q:AI 模型服务在 K8s 怎么部署?
GPU 推理用 Deployment/StatefulSet 申 GPU 资源+节点调度,权重走 PVC/对象存储不进镜像;数据库用 StatefulSet+PVC。
Q:企业 Agent 平台最小版有哪些组件?
Spring AI 业务 + LiteLLM 网关 + Postgres 治理库 + 模型 + Ingress 入口 + Secret/探针/隔离交付件。
Q:W7 三天怎么串成平台?
D5 选网关+ADR → D6 定单一调用链+Docker 交付 → D7 上 K8s 灰度回滚 → 串成最小版,具备治理+发布+可观测。
Q:回滚要注意什么坑?
保留旧镜像/revision;只回代码不回数据库迁移会不兼容;AI 场景要模型/Prompt 版本一并回退,否则半吊子。
FDE W7D7 学习手册 · K8s 基础拓扑、灰度回滚与企业平台整合(面试级)· 配合《FDE-W7D7-评测题.md》自测
📌 待查 ★ 重要
★0
📌0