8.3 生产部署:灰度签名与回滚


8.3 生产部署:灰度、签名与回滚

本节摘要:eBPF 程序是能改变内核行为的制品,发布应像发内核补丁那样克制:构建可复现、签名可验证、灰度可观察、回滚可秒级。pin、能力位、挂钩清单、与平台数据平面的契约,决定它是基础设施还是下一场全网事故。

核心问题

阅读完本节,你应当能够:

  1. 写出从制品到节点的发布步骤
  2. 区分观测程序与拦截程序的发布严格度
  3. 设计秒级回滚:卸 link、保留或清理 pin
  4. 与 Cilium 一类平台共处而不抢挂钩

第 1.2 节批评模块发布太慢。eBPF 若走“SSH 上去现场编译”,你只是换了一种同样不可复现的危险。正确的快,是制品已经过矩阵,节点上只做加载与挂载。

一、制品与签名

构建机产出:带 BTF 的对象、用户态加载器、版本号、所测内核列表。对象进制品库,不进工程师笔记本。签名验证的是“这是我们 CI 出的那一份”,防止节点上被替换成能过验证的恶意程序——验证器不审业务意图,恶意计数器也能过。

权限用能力位而不是长期 root。观测程序用最小集。需要 LSM 拦截或覆盖返回值的,单独角色、单独审批。开发机 sudo 习惯必须在生产切断。

二、灰度看什么

灰度节点要有对照。只看探针自己的指标会自欺。看:业务 P99、错误率、CPU 尾延迟、Map 内存、插入失败、事件丢失、无条件计数是否符合流量。

拦截类程序灰度更严:先只记“本该拒绝”的计数,再打开真拒绝。这是双开关。观测类可以一轮完成;LSM 必须两轮。

与平台共处:发布前读挂钩清单,XDP/TC 归属若已有主权方,走平台扩展点。发布后把你的程序登记上去,包括所有者与卸载方式。

项目 观测程序 拦截程序
灰度规模 可从一池开始 更小,按工作负载
默认动作 旁观 先计数后拒绝
回滚时限 秒级卸挂载 秒级,且要有业务确认
审批 平台登记 额外安全审批
失败策略 加载失败则该功能关闭 不得静默变成全放或全拦

⚠️ 常见坑:回滚只停用户态加载器,却把程序 pin 在 bpf 文件系统。看起来发布撤回了,钩子还在。回滚剧本必须写清是否unpin。
💡 关键直觉:回滚是卸载内核对象,不是停进程。进程只是引用之一。

三、回滚剧本与日常

剧本里写死:

  1. 关闭出栈与拦截开关(Map 里的旗标,热生效)
  2. 销毁 link,确认无条件计数停止
  3. 按设计 unpin 或保留以便取证
  4. 记录版本与内核,开事后复盘

日常巡检:列出本节点 eBPF 程序与 Map 内存,对账清单。对不上就是幽灵。额度模板随节点规格走,不让每个人自己调 ulimit。

发布允许上线的条件 - 矩阵内核全部加载过 - 有开关能停出栈和拦截 - 回滚演练过,unpin 行为明确 - 挂钩点已登记 - 丢失与失败桶已接入告警

海关可以加快通关,但不能取消铅封和抽检。eBPF 让内核策略发布变快,铅封就是签名与清单,抽检就是灰度对照。

图:发布链上每一拍都能停

图:发布链上每一拍都能停

问题:DaemonSet 一滚是不是就算灰度?

滚动只是时间错开,没有对照指标就不能叫灰度。先小池、有开关、有业务指标,再滚全集群。

问题:签名之后验证器是不是可以放松?

不可以。签名解决来源,验证器解决内存安全。两道闸叠在一起才是第 1 章相对模块的优势。

四、一次失败灰度的复盘该留下什么

灰度失败不可惜,不留下可复用的原因才可惜。复盘至少写:哪一步对照被破坏(P99、错误率、内存、丢失);是频率问题还是拷贝问题;回滚是否碰到了 pin;清单是否在灰度前登记;平台是否在同时调和挂钩。五项能回答,下次变更单就能改条件,而不是再写一句“加强测试”。

失败后的制品不要立刻删除。保留签名版本,便于对比字节码与 Map 布局。删除会让人无法确认线上残留是否就是那一版。残留检查是复盘的现场部分:节点上是否还有同名程序、内存是否回去、心跳是否恢复。现场没清干净就开总结会,总结会只会再生产一条幽灵。

成功的灰度也要记录数字,当作以后的预算上限。这次抽样率百分之一可接受,下次有人想改成百分之十,拿本次数字挡回去。没有成功基线,每次都在重新发明安全边际。

权限方面,灰度操作应使用角色账号,而不是个人 sudo。个人账号发布的程序,人一走就变成无主。角色账号配合签名,所有者是系统不是某个人。人员流动在平台团队很常见,所有权模型必须假设人会离开。

把发布检查做成机器门禁:矩阵绿、签名在、清单有 diff、回滚演练日期未过期。门禁拦下的发布,比值班手册里的红色警告更有效。人在赶时间时会跳过手册,不会轻易跳过红灯 CI。eBPF 的快应当来自门禁内的自动化,而不是来自跳过门禁。

现场笔记:回滚成功、钩子还在

发布系统显示回滚成功,因为加载器进程没了。pin 还在,拦截仍在生效,支付被误拒。用户比仪表盘先发现。回滚剧本补上 unpin 和心跳必须停止两条,演练按季度做。没演练的剧本是小说。小说不能挡流量。

个人 sudo 发布的程序在同事离职后变成无主。角色账号加签名之后,所有者是系统。人员流动不再制造幽灵。所有权模型必须假设人会离开,因为人会离开。

门禁拦过一次“矩阵没跑完就想全量”。当时很讨厌红灯。红灯救了那晚。后来没人再建议跳过矩阵。门禁的价值要用被拦住的事故来讲,讲一次够用很久。eBPF 的快,来自门禁内的自动化,不是来自拆门。

延伸讨论:回滚必须碰到内核对象

剧本写清关开关、毁 link、心跳停、是否 unpin、记录版本。演练按季度。没演练的剧本是小说。个人 sudo 禁止,角色账号加签名,所有者是系统。门禁:矩阵绿、签名在、清单有 diff、演练未过期。滚动不是灰度,灰度要对照业务指标。拦截双开关:先计数后拒绝。失败灰度保留制品做字节码对比,现场确认无残留再开会。残留检查是复盘的一部分。签名不让验证器放松。来源和安全是两道闸。平台挂钩清单是共处法律。法律写进发布检查,不写进口头约定。口头约定在人员流动后消失。消失后下一次发布会去抢 XDP。抢 XDP 能让整张数据平面变瞎。变瞎比一次观测失败更像事故。所以法律要比观测欲望硬。硬的方式是机器门禁。门禁讨厌,讨厌过的人后来会感谢。感谢来得晚,所以不能靠感谢维持,要靠红灯维持。红灯是生产的朋友。朋友看起来不友好,但会拦你跳楼。跳楼在这里叫全量未对照。

对照清单

  1. 制品在 CI 诞生,节点只加载不现场编译。
  2. 签名管来源,验证器管安全,人审管意图,三道闸不能互相替代。
  3. 灰度要对照业务 P99 错误率,滚动不是灰度。
  4. 拦截双开关:先计数后拒绝,观测可以一轮,LSM 必须两轮。
  5. 回滚卸载内核对象,写清是否 unpin,心跳必须停止。
  6. 个人 sudo 禁止,角色账号加签名,所有者是系统不是某个人。
  7. 门禁:矩阵绿、签名在、清单有 diff、演练未过期。
  8. 失败灰度保留制品对比字节码,现场无残留再开会。
  9. 与平台共处先读挂钩清单,发布后登记所有者与卸载方式。
  10. 剧本写死关开关、毁 link、确认计数停、记录版本。
  11. 额度模板随节点规格走,不让每个人自己调 ulimit。
  12. 能停做成发布条件,不能停的成功当作事故复盘即使当时没炸。

发布想快,闸门就要在前面,不在 SSH 上。前面的闸门是矩阵、签名、清单、演练。四件齐了,节点上的动作才只是加载。加载很快。很快是因为慢的事情已经在白天做完。白天不做完,夜里就会用 sudo 补。sudo 补出来的程序没有角色账号,人一走就无主。无主程序会在下一次回滚里被漏掉。漏掉的回滚是假回滚。假回滚让支付先于仪表盘发现拦截还在。发现权交给用户,是发布失败的一种。失败要靠心跳停止来自己发现。自己发现才配叫回滚成功。成功不看发布系统的绿灯。绿灯太容易亮。内核对象列表比较难说谎。

\n\n## 课堂补充\n\n慢在白天,快在加载。三道闸不互相替代。滚动不是灰度。拦截两轮。回滚碰到对象。角色账号。门禁四件。残留查完再开会。挂钩先读清单。剧本写死。额度模板化。没炸的莽撞仍当事故。\n\n\n\n## 生产验收条\n\n1. 围绕「生产部署灰度签名与回滚」,生产验收只认能关掉、能计数、能对账,不认口头保证。\n2. 围绕「生产部署灰度签名与回滚」,把所有者、版本、卸载方式写成清单三件套,缺一视为幽灵。\n3. 围绕「生产部署灰度签名与回滚」,对照实验必须能回答开关前后业务指标动了没有。\n4. 围绕「生产部署灰度签名与回滚」,失败要分类到验证、额度、挂载、未触发、丢失,禁止只丢一句笼统错误。\n5. 围绕「生产部署灰度签名与回滚」,热路径默认克制,阈值之后才出栈,出栈之前先证明钩子活着。\n6. 围绕「生产部署灰度签名与回滚」,和平台已有挂钩点冲突时先登记再加载,禁止手工抢挂。\n7. 围绕「生产部署灰度签名与回滚」,内核版本矩阵没跑绿就不能把功能写成必成功路径。\n8. 围绕「生产部署灰度签名与回滚」,回滚必须碰到内核对象,心跳停止才算撤回成功。\n\n## 重点提炼

  • 制品在 CI 诞生,节点只加载,不现场编译。
  • 签名管来源,验证器管安全,人审管意图。
  • 灰度要对照业务指标,不只看探针自报。
  • 拦截双开关:先计数后拒绝。
  • 回滚卸载内核对象,写清 pin 行为。
  • 挂钩清单是与平台共处的法律。

附录把术语与现场检查单收在一起,供你在故障夜少翻章节。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U