知识卡片
In-Tree到Out-of-Tree迁移体现设计正确性向现实兼容性的妥协
内容
Kubernetes早期内置了大量In-Tree(代码写在Kubernetes代码树里)存储驱动,
这个策略在诞生初期是有意义的——能在云存储提供商发布官方驱动之前就把
支持能力加进来、减轻管理员维护负担,帮Kubernetes快速占领市场。但它的
代价随时间显现:驱动只能跟着Kubernetes大版本发布节奏更新,云存储提供商
被迫迁就Kubernetes的节奏;第三方存储代码混进Kubernetes二进制文件本身,
也带来可靠性和安全性隐患。从1.14版本起,Kubernetes启动In-Tree驱动向
Out-of-Tree(基于[[FlexVolume与CSI两代存储扩展机制的能力差距]]里的CSI
规范)的迁移,计划到1.21⁄1.22版本(约2021年中)让AWS EBS、GCE PD、
vSphere等主要驱动全部改为Out-of-Tree实现。但这个”设计上无疑正确”的
迁移撞上了Kubernetes一贯坚持的原则——升级版本不应该让仍在大范围使用的
已有功能突然失效:原来用awsElasticBlockStore字段声明存储的Pod
YAML,字面意义上应该要全部改写成CSI的driver: ebs.csi.aws.com写法才能
继续工作,这对存量用户是不可接受的破坏性变更。Kubernetes 1.17因此
又设计了CSIMigration方案,让Out-of-Tree驱动能自动伪装成In-Tree接口对
用户提供服务,用户的旧YAML完全不用改。这个案例是本章反复出现的
Kubernetes设计哲学的又一次印证:好设计要在多方利益之间权衡,很多时候
必须向现实妥协,而不能只追求理论最优方案。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第13章"持久化存储"13.2.3节
"从In-Tree到Out-of-Tree"(源文件:_epub-src对应OEBPS/Text/
chapter161.xhtml)
- 结论依据:原文说明In-Tree策略早期贡献与后期代价(跟不上迭代节奏、
混杂第三方代码的可靠性安全性问题),迁移到Out-of-Tree又与"不破坏已有
功能"原则冲突,因此设计出CSIMigration让驱动自动伪装成In-Tree接口,
并明确指出这种兼容性设计是Kubernetes设计理念的缩影,直接支撑本卡片
结论。
- 原始内容:这种做法在设计上无疑是正确的,然而,这又带来了此前提过的
该如何兼容旧功能的策略问题……好的设计需要权衡多个方面的利益,很多
时候都得顾及现实的影响,要求设计向现实妥协,而不能仅仅考虑理论最优
的方案。