知识卡片
Docker Machine选型踩坑:初看理想的方案暴露出扩展性、并发、自定义三重限制
内容
微博团队在做跨云资源初始化的技术选型时,最初判断Docker Machine是比较理想的方案,理由是它只需要一条SSH通道就能工作,不依赖任何预装的Agent——听起来非常轻量,团队甚至和阿里云官方几乎同时向Docker Machine社区提交了驱动相关的PR,投入不小的信心和精力。但真正深入使用之后,才发现这个方案存在三个此前没有预见到的硬限制:一是无法扩展,Machine内部的Go语言函数几乎全部是小写命名(也就是包内私有实现),外部代码根本无法调用这些API来做功能扩展,想在它的基础上定制一些能力几乎不可能;二是不支持并发,如果要并发创建多台实例,只能通过同时启动多个独立的Machine进程来实现,一旦数量上去,这种方式很快就无法承载;三是不支持自定义,Machine启动Docker Daemon的具体参数是写死在代码里的,想要按自己的需求定制Daemon启动参数,操作起来非常不美观、不优雅。这三重限制共同指向一个更深层的问题:Machine这个工具设计时的定位可能更偏向个人开发者本地快速启动单个Docker环境,而不是支撑企业级、大规模、高并发的跨云资源初始化场景——”轻量、简单”这个最初吸引团队的优点,恰恰是因为它牺牲了扩展性和并发能力换来的,在真正的生产规模化场景下这个牺牲变成了不可接受的短板。团队最终转向了用Puppet搭配去Master结构、配置纳入GitLab管理、通过CI推送变更的自建方案。这个案例提醒了一条技术选型的教训:一个工具”轻量简单”这个特性本身既可能是优点也可能是隐患,评估时必须明确问一句——这份简单是不是通过牺牲了自己业务场景真正需要的扩展性、并发能力换来的,而不能只被”简单易用”这个表面印象打动。
参考来源
- 位置:《高可用架构(第1卷)》第4章《容器与云计算》"4.1 微博基于Docker容器的混合云迁移实战"节,"4.1.2 跨云的资源管理与调度"(源文件:_epub-src/OEBPS/Text/Chapter4_1_3.xhtml)
- 结论依据:原文说明"最初在技术选型时我们认为Machine比较理想的方案,仅需要SSH通道……然后就掉进了大坑中不能自拔……无法扩展……不支持并发……不支持自定义……目前我们采用的是Puppet的方案",直接支撑本卡片结论。
- 原始内容:最初在技术选型时我们认为Machine比较理想,仅需要SSH通道,不依赖任何预装的Agent……然后就掉进了大坑中不能自拔。例举几个坑:无法扩展,Machine的golang函数几乎都是小写……不支持并发……不支持自定义……目前我们采用的是Puppet的方案。