在生产环境中,时常会因为磁盘故障、误操作等原因出现文件系统的错误。Chaos Mesh 很早就提供了注入文件系统错误的能力。用户只需要添加一个 IOChaos 资源,就能够让对指定文件的文件系统操作失败或返回错误的数据。在 Chaos Mesh 1.0 之前,使用 IOChaos 需要对 Pod 注入 sidecar 容器,并且需要改写启动命令;哪怕没有注入错误,被注入 sidecar 的容器也总是有较大的性能开销。随着 Chaos Mesh 1.0 的发布,提供了运行时注入文件系统错误的功能,使得 IOChaos 的使用和其他所有类型的 Chaos 一样简单方便。这篇文章将会介绍它的实现方式。
前置
本文的内容假定你已经掌握以下知识。当然,你不必在此时就去阅读;但当遇到没见过的名词的时可以回过头来搜索学习。
我会尽我所能提供相关的学习资料,但我不会将它们提炼和复述,一是因为这些知识通过简单的 Google 就能学到;二是因为大部分时候学习一手的知识效果远比二手要好,学习 n 手的知识效果远比(n+1)手的要好。
-
mount_namespaces. man, k8s Mount propagation
-
x86 assembly language. Wikipedia
-
mount. man(2) 特别是 MS_MOVE
-
Mutating admission webhooks. k8s Document
-
syscall. man(2) 注意浏览一下调用约定
-
ptrace. man(2)
-
Device node, char devices Device names, device nodes, and major/minor numbers
阅读与 TimeChaos 相关的 文章 对理解本文也有很大的帮助,因为它们使用着相似的技术。
此外,我希望在阅读这份文档时,读者能够主动地思考每一步的原因和效果。这之中没有复杂的需要头脑高速运转的知识,只有一步一步的(给计算机的)行动指南。也希望你能够在大脑里不断地构思“如果我自己要实现运行时文件系统注入,应该怎样做?”,这样这篇文章就从单纯的灌输变为了见解的交流,会有趣很多。
错误注入
寻找错误注入方式的一个普遍方法就是先观察未注入时的调用路径:我们在 TimeChaos 的实现过程当中,通过观察应用程序获取时间的方式,了解到大部分程序会通过 vDSO 访问时间,从而选取了修改目标程序 vDSO 部分内存来修改时间的方式。
那么在应用程序发起 read, write 等系统调用,到这些请求到达目标文件系统,这之间是否存在可供注入的突破口呢?事实上是存在的,你可以使用 bp

本文介绍了Chaos Mesh运行时注入文件系统错误的实现方式。此前使用IOChaos有性能开销大等问题,Chaos Mesh 1.0提供了运行时注入功能。文章阐述了错误注入方式,包括侵入命名空间、动态替换fd等,还提及了实现中遇到的细枝末节问题及解决办法。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



