Kubernetes 零损发布实战:Pod 全绿背后的 23 个丢失请求

简介: 订单服务滚动发布看似成功,实则因Pod优雅终止与业务请求时序错配,导致23笔订单状态不明、7笔重复支付。根本在于未协同流量摘除、在途请求排空与幂等设计,零损发布需以业务语义而非K8s状态为验收标准。

订单服务做滚动发布,Deployment 显示更新成功,Pod 没有 CrashLoop,发布平台也全绿。半小时后对账却发现:23 个创建订单请求在发布窗口没有形成明确结果,其中 7 个被客户端重试后生成了重复支付意图。

组件都没有明显“坏掉”,事故发生在 Pod 下线、流量摘除、长请求执行和客户端超时之间的竞态里。

image.png

Kubernetes 管理生命周期,不理解你的业务提交点

Pod 被删除时会进入终止流程,端点状态变化、容器生命周期钩子和终止信号共同参与优雅关闭。但应用是否还能接受请求、一个请求何时产生不可逆副作用、失败后能否恢复,只有业务代码知道。

如果收到终止信号后立刻退出,正在支付的请求会被切断;如果继续对外保持 ready,上游在收敛期间还会送来新请求;如果只 sleep 20 秒,却没有统计在途任务,团队只是把问题推迟了 20 秒。

image.png

正确顺序是:摘流量、停入口、排在途、再退出

应用收到终止信号后,应先进入 draining 状态,让 readiness 返回失败;HTTP 入口拒绝新的高成本请求,消息消费者停止拉取新任务,定时任务不再领取租约;已经开始的请求继续执行,直到完成或进入可恢复状态。

下面是一个简化的 Python 状态控制器,核心在于显式跟踪在途请求,而不是固定等待:

import asyncio
from contextlib import asynccontextmanager

class DrainState:
    def __init__(self):
        self.draining = False
        self.inflight = 0
        self.done = asyncio.Event()
        self.done.set()

    @asynccontextmanager
    async def request(self):
        if self.draining:
            raise RuntimeError("instance_draining")
        self.inflight += 1
        self.done.clear()
        try:
            yield
        finally:
            self.inflight -= 1
            if self.inflight == 0:
                self.done.set()

    async def drain(self, timeout_seconds=35):
        self.draining = True
        await asyncio.wait_for(self.done.wait(), timeout=timeout_seconds)

真实服务还要防止“检查 draining 后、inflight 加一前”出现竞争,可用同一个异步锁保护状态切换。网关或服务网格的连接排空也要与应用宽限期对齐。

订单类请求必须能回答“到底提交了吗”

最棘手的时序是数据库已提交,响应还没返回,Pod 就被终止。客户端只看到超时,无法知道订单是否存在,随后重试可能生成第二单。

因此创建订单要使用业务幂等键,查询接口能按该键返回既有结果;支付、库存等后续动作也要有独立状态与恢复机制。优雅下线只能减少中断,不能替代副作用幂等。

CREATE UNIQUE INDEX uq_order_request
ON orders(tenant_id, client_request_id);

-- 重试时先按 tenant_id + client_request_id 查询已有终态

配置要为应用的最坏完成时间留空间

如果业务请求 P99 为 12 秒,支付超时上限 20 秒,terminationGracePeriodSeconds 却只有 15 秒,那么“正常最坏路径”在发布时必然被杀死。宽限期应覆盖停止接流量、上游传播和在途请求完成,并留有安全余量。

配置示例:

spec:
  terminationGracePeriodSeconds: 45
  containers:
    - name: order-api
      lifecycle:
        preStop:
          httpGet:
            path: /internal/drain
            port: 8080
      readinessProbe:
        httpGet:
          path: /ready
          port: 8080
        periodSeconds: 2
        failureThreshold: 1

preStop 接口应幂等,并立即切换 draining;不要把固定 sleep 当作唯一动作。还要确保探针失败后,应用不会继续从其他入口领取新任务。

image.png

零损发布应该怎样测试

持续按真实到达率发送创建、查询、取消三类请求,在每次发布的随机时刻删除 Pod。把请求按“终止前开始、终止中到达、终止后重试”分桶,最后对账数据库、支付和客户端结果。

验收不只看 5xx:每个 client_request_id 最多一个订单;每个已扣款请求都有可查询订单;每个客户端超时都有明确恢复路径;终止中的新请求快速失败并带可重试语义;Pod 在宽限期内完成退出。再主动让下游支付延迟到 25 秒,验证最坏路径。

生产监控增加 draining 实例数、终止时在途请求、强制结束次数、终止窗口的未知结果数和幂等命中数。它们比 Deployment 成功状态更接近用户事实。

滚动发布真正的“成功”,不是新 Pod 都 Ready,而是旧 Pod 离开的过程中,每一个业务请求都能说明自己完成、拒绝,还是可恢复。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12天前
|
JSON 人工智能 测试技术
别再给大模型输出写死期望值:Hypothesis + Pydantic + pytest 把非确定性回答测成一组『不变量』
本文揭示大模型测试中“固定值断言”的致命缺陷:因模型输出天然非确定(字段顺序、类型漂移、冗余文本等),`assert == 固定字典` 导致假红或漏检。提出用属性测试(Hypothesis + Pydantic)替代——聚焦守业务不变量(如金额非负、必填字段存在、不泄露提示),而非形态一致。解耦“输出长什么样”与“输出对不对”,让测试真正守住底线。
别再给大模型输出写死期望值:Hypothesis + Pydantic + pytest 把非确定性回答测成一组『不变量』
|
9天前
|
人工智能 安全 开发者
Jev 发布不到一周,为什么它这么快进入 Agent 工程?
Jev 是专为 Agent 设计的轻量级决策模型,不生成文本,专注快速输出 Choice/Score/Boolean。它被 Vercel AI Gateway、LangChain 等迅速集成,用于路由、流程控制、安全守卫和评估等高频判断场景,显著降本增效,推动 Agent 架构向“分层智能”演进。
Jev 发布不到一周,为什么它这么快进入 Agent 工程?
|
9天前
|
人工智能 测试技术 开发工具
Google 开源 ARTEMIS:AI Agent 如何接管 Android 真机测试?
Google开源AI测试框架ARTEMIS,支持自然语言驱动Android真机自动化:理解任务、识别界面、跨App操作、自动截图/日志采集并生成报告。原生集成MCP,可接入Antigravity等AI IDE,实现“描述目标→自主执行→分析结果”闭环。(239字)
Google 开源 ARTEMIS:AI Agent 如何接管 Android 真机测试?
|
9天前
|
人工智能 数据挖掘 开发工具
RAG 不一定需要大模型重排:Jev 能不能做 Context Filtering?
RAG中检索易召回冗余内容,Jev作为决策层可精准筛选高相关Chunk,替代简单Top-K输入。它支持多维度判断(如版本、时效性),提升Context质量与LLM答案准确性,降低幻觉与Token成本。(239字)
RAG 不一定需要大模型重排:Jev 能不能做 Context Filtering?
|
10天前
|
SQL 人工智能 安全
Agent Harness 又要多一层?Jev 开始接管这些高频判断
本文探讨Agent架构新范式:LLM专注复杂推理,而高频判断(如Tool/Skill路由、上下文过滤、安全守门、执行复核)可交由轻量级“System One Model”(如Jev)高效处理。这将重塑Agent Harness设计,推动分层智能协作。
Agent Harness 又要多一层?Jev 开始接管这些高频判断
|
19天前
|
人工智能 供应链 测试技术
DeepSeek Harness火了,但你知道怎么用它生成测试用例吗?
DeepSeek Harness是开源AI测试助手,一行命令即可启动。它能自动解析API文档,10分钟生成50+覆盖等价类、边界值与异常场景的测试用例,准确率高但需人工复核8条左右。专为测试工程师设计,大幅提升用例设计效率,降低重复劳动。
|
15天前
|
人工智能 供应链 JavaScript
别再手写用例了!DeepSeek Harness + Workbuddy 10分钟生成可评审用例
本文介绍如何用DeepSeek Harness(DSH)与腾讯Workbuddy协同,10分钟自动生成高质量测试用例:DSH提供执行能力,Workbuddy提供模型与规范封装;支持PRD/接口文档输入,覆盖正常流、异常场景与边界值。手写低效,AI初稿+人工复核才是提效关键。(239字)
|
2月前
|
人工智能 NoSQL 测试技术
AI岗位渗透率升至37.56%:2026届秋招,测试开发应届生的准备方式也该变了
2026秋招AI岗位激增47.3%,渗透率达37.56%,但门槛同步升高:简历堆砌AI术语难过关,真能力看项目深度。应届生需夯实测试开发基础,再以RAG、Agent等真实AI测试项目体现工程力——会用AI不值钱,能测AI才稀缺。
|
2月前
|
人工智能 自然语言处理 Java
RAG系统测试实战:如何验证企业知识库AI助手是否可靠?
近两年,企业纷纷构建基于RAG的AI应用:不训大模型,而是将产品文档、制度流程等内部知识接入,通过检索增强生成实现智能问答。但其质量保障远超传统测试——需覆盖知识库完整性、检索准确性、生成忠实度与答案相关性等多层验证,是AI时代测试工程师的核心新能力。
RAG系统测试实战:如何验证企业知识库AI助手是否可靠?
|
2月前
|
SQL 人工智能 算法
AI岗位渗透率升到37.56%:测试岗正在分成“新旧两种人”
2026秋招AI岗位渗透率达37.56%,测试岗正加速分层:传统执行岗溢价消失,懂AI应用、Agent工程、LLM评估的全栈测开人才需求暴增340%,薪资高30%-50%。转型,刻不容缓。

热门文章

最新文章