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
相关文章
|
8天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1323 6
|
7天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
1168 23
|
2天前
|
存储 人工智能 自然语言处理
阿里云千问办公官网登录入口:qwenwork.cn网页版免下载,注册送2000积分、登录每日再送100积分
千问办公(QwenWork)是阿里巴巴推出的一站式AI办公平台,定位"不止于对话,更注重交付"。它基于千问大模型,具备任务拆解与多步骤自动执行能力,用户一句话即可完成PPT生成、数据分析、网页搭建、视频剪辑、信息调研等复杂任务,覆盖网页端、桌面端及钉钉生态。网页版免下载,访问qwenwork.cn注册即得2000积分,每日登录再送100积分。个人版免费起用,另有付费版与企业版可选。
|
11天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
6天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
588 6
|
1月前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
10045 33
|
8天前
|
安全 Linux 芯片
【万字长文】Ollama下载、安装、配置、使用保姆级教程(2026最新图解)
Ollama 是一款免费开源的本地大模型运行工具,支持 DeepSeek、Qwen 等主流模型,一条命令即可下载运行。2026 最新版 v0.35.1 官方安装包(1.47GB)已提供国内直连下载,纯本地、离线可用、无广告、无隐私泄露风险。
715 1
|
17天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
8天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
810 2
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA