本节摘要:eBPF 程序是能改变内核行为的制品,发布应像发内核补丁那样克制:构建可复现、签名可验证、灰度可观察、回滚可秒级。pin、能力位、挂钩清单、与平台数据平面的契约,决定它是基础设施还是下一场全网事故。
阅读完本节,你应当能够:
第 1.2 节批评模块发布太慢。eBPF 若走“SSH 上去现场编译”,你只是换了一种同样不可复现的危险。正确的快,是制品已经过矩阵,节点上只做加载与挂载。
构建机产出:带 BTF 的对象、用户态加载器、版本号、所测内核列表。对象进制品库,不进工程师笔记本。签名验证的是“这是我们 CI 出的那一份”,防止节点上被替换成能过验证的恶意程序——验证器不审业务意图,恶意计数器也能过。
权限用能力位而不是长期 root。观测程序用最小集。需要 LSM 拦截或覆盖返回值的,单独角色、单独审批。开发机 sudo 习惯必须在生产切断。
灰度节点要有对照。只看探针自己的指标会自欺。看:业务 P99、错误率、CPU 尾延迟、Map 内存、插入失败、事件丢失、无条件计数是否符合流量。
拦截类程序灰度更严:先只记“本该拒绝”的计数,再打开真拒绝。这是双开关。观测类可以一轮完成;LSM 必须两轮。
与平台共处:发布前读挂钩清单,XDP/TC 归属若已有主权方,走平台扩展点。发布后把你的程序登记上去,包括所有者与卸载方式。
| 项目 | 观测程序 | 拦截程序 |
|---|---|---|
| 灰度规模 | 可从一池开始 | 更小,按工作负载 |
| 默认动作 | 旁观 | 先计数后拒绝 |
| 回滚时限 | 秒级卸挂载 | 秒级,且要有业务确认 |
| 审批 | 平台登记 | 额外安全审批 |
| 失败策略 | 加载失败则该功能关闭 | 不得静默变成全放或全拦 |
⚠️ 常见坑:回滚只停用户态加载器,却把程序 pin 在 bpf 文件系统。看起来发布撤回了,钩子还在。回滚剧本必须写清是否unpin。
💡 关键直觉:回滚是卸载内核对象,不是停进程。进程只是引用之一。
剧本里写死:
日常巡检:列出本节点 eBPF 程序与 Map 内存,对账清单。对不上就是幽灵。额度模板随节点规格走,不让每个人自己调 ulimit。
发布允许上线的条件 - 矩阵内核全部加载过 - 有开关能停出栈和拦截 - 回滚演练过,unpin 行为明确 - 挂钩点已登记 - 丢失与失败桶已接入告警
海关可以加快通关,但不能取消铅封和抽检。eBPF 让内核策略发布变快,铅封就是签名与清单,抽检就是灰度对照。

滚动只是时间错开,没有对照指标就不能叫灰度。先小池、有开关、有业务指标,再滚全集群。
不可以。签名解决来源,验证器解决内存安全。两道闸叠在一起才是第 1 章相对模块的优势。
灰度失败不可惜,不留下可复用的原因才可惜。复盘至少写:哪一步对照被破坏(P99、错误率、内存、丢失);是频率问题还是拷贝问题;回滚是否碰到了 pin;清单是否在灰度前登记;平台是否在同时调和挂钩。五项能回答,下次变更单就能改条件,而不是再写一句“加强测试”。
失败后的制品不要立刻删除。保留签名版本,便于对比字节码与 Map 布局。删除会让人无法确认线上残留是否就是那一版。残留检查是复盘的现场部分:节点上是否还有同名程序、内存是否回去、心跳是否恢复。现场没清干净就开总结会,总结会只会再生产一条幽灵。
成功的灰度也要记录数字,当作以后的预算上限。这次抽样率百分之一可接受,下次有人想改成百分之十,拿本次数字挡回去。没有成功基线,每次都在重新发明安全边际。
权限方面,灰度操作应使用角色账号,而不是个人 sudo。个人账号发布的程序,人一走就变成无主。角色账号配合签名,所有者是系统不是某个人。人员流动在平台团队很常见,所有权模型必须假设人会离开。
把发布检查做成机器门禁:矩阵绿、签名在、清单有 diff、回滚演练日期未过期。门禁拦下的发布,比值班手册里的红色警告更有效。人在赶时间时会跳过手册,不会轻易跳过红灯 CI。eBPF 的快应当来自门禁内的自动化,而不是来自跳过门禁。
发布系统显示回滚成功,因为加载器进程没了。pin 还在,拦截仍在生效,支付被误拒。用户比仪表盘先发现。回滚剧本补上 unpin 和心跳必须停止两条,演练按季度做。没演练的剧本是小说。小说不能挡流量。
个人 sudo 发布的程序在同事离职后变成无主。角色账号加签名之后,所有者是系统。人员流动不再制造幽灵。所有权模型必须假设人会离开,因为人会离开。
门禁拦过一次“矩阵没跑完就想全量”。当时很讨厌红灯。红灯救了那晚。后来没人再建议跳过矩阵。门禁的价值要用被拦住的事故来讲,讲一次够用很久。eBPF 的快,来自门禁内的自动化,不是来自拆门。
剧本写清关开关、毁 link、心跳停、是否 unpin、记录版本。演练按季度。没演练的剧本是小说。个人 sudo 禁止,角色账号加签名,所有者是系统。门禁:矩阵绿、签名在、清单有 diff、演练未过期。滚动不是灰度,灰度要对照业务指标。拦截双开关:先计数后拒绝。失败灰度保留制品做字节码对比,现场确认无残留再开会。残留检查是复盘的一部分。签名不让验证器放松。来源和安全是两道闸。平台挂钩清单是共处法律。法律写进发布检查,不写进口头约定。口头约定在人员流动后消失。消失后下一次发布会去抢 XDP。抢 XDP 能让整张数据平面变瞎。变瞎比一次观测失败更像事故。所以法律要比观测欲望硬。硬的方式是机器门禁。门禁讨厌,讨厌过的人后来会感谢。感谢来得晚,所以不能靠感谢维持,要靠红灯维持。红灯是生产的朋友。朋友看起来不友好,但会拦你跳楼。跳楼在这里叫全量未对照。
发布想快,闸门就要在前面,不在 SSH 上。前面的闸门是矩阵、签名、清单、演练。四件齐了,节点上的动作才只是加载。加载很快。很快是因为慢的事情已经在白天做完。白天不做完,夜里就会用 sudo 补。sudo 补出来的程序没有角色账号,人一走就无主。无主程序会在下一次回滚里被漏掉。漏掉的回滚是假回滚。假回滚让支付先于仪表盘发现拦截还在。发现权交给用户,是发布失败的一种。失败要靠心跳停止来自己发现。自己发现才配叫回滚成功。成功不看发布系统的绿灯。绿灯太容易亮。内核对象列表比较难说谎。
\n\n## 课堂补充\n\n慢在白天,快在加载。三道闸不互相替代。滚动不是灰度。拦截两轮。回滚碰到对象。角色账号。门禁四件。残留查完再开会。挂钩先读清单。剧本写死。额度模板化。没炸的莽撞仍当事故。\n\n\n\n## 生产验收条\n\n1. 围绕「生产部署灰度签名与回滚」,生产验收只认能关掉、能计数、能对账,不认口头保证。\n2. 围绕「生产部署灰度签名与回滚」,把所有者、版本、卸载方式写成清单三件套,缺一视为幽灵。\n3. 围绕「生产部署灰度签名与回滚」,对照实验必须能回答开关前后业务指标动了没有。\n4. 围绕「生产部署灰度签名与回滚」,失败要分类到验证、额度、挂载、未触发、丢失,禁止只丢一句笼统错误。\n5. 围绕「生产部署灰度签名与回滚」,热路径默认克制,阈值之后才出栈,出栈之前先证明钩子活着。\n6. 围绕「生产部署灰度签名与回滚」,和平台已有挂钩点冲突时先登记再加载,禁止手工抢挂。\n7. 围绕「生产部署灰度签名与回滚」,内核版本矩阵没跑绿就不能把功能写成必成功路径。\n8. 围绕「生产部署灰度签名与回滚」,回滚必须碰到内核对象,心跳停止才算撤回成功。\n\n## 重点提炼
附录把术语与现场检查单收在一起,供你在故障夜少翻章节。