如今,Kubernetes 已成为容器编排的标准,但它的架构并非凭空诞生,而是深受 Google 管理大规模基础设施经验的影响。 要理解 Kubernetes 的起源,就必须追溯其技术血统——源自 Google 的两个内部系统:Borg 和 Omega。 早在 Kubernetes 开源之前,它们就已解决了现实中的调度、可靠性与可扩展性难题。 本文将深入剖析这两个系统如何塑造了 Kubernetes 的核心设计理念、动机以及早期开发路径。 背景:谷歌的 Borg 与 Omega 系统
Borg
Kubernetes 并非横空出世,而是继承了 Google 内部集群管理器 Borg 和 Omega 的技术血脉。 Borg 是 Google 在 2003-2004 年间开发的首个大规模容器管理系统,作为 Google 数据中心的“中央大脑”,Borg 能够在大量机器上编排数十万个任务,实现高资源利用率,具有容错性和极强的可扩展性。 Borg 几乎承载了 Google 的所有核心服务(搜索、Gmail、YouTube 等)。截至 2016 年,Borg 仍是 Google 内部的主要容器管理平台。 尽管目前的使用细节未对外公开,但 Borg 的架构与运维经验为 Kubernetes 的设计奠定了基础。 然而,随着时间推移,Borg 的系统逐渐变得复杂臃肿,形成了一个由不同团队为满足各自需求而拼凑出的工具、配置语言和流程的混合体。 这种复杂性最终促使 Google 决定设计一个更加灵活的新一代系统,也就是后来的 Omega。Omega
2013 年,Google 推出了 Omega,一个作为 Borg“后代”的第二代集群管理系统。 Omega 保留了 Borg 的许多成熟理念,但以更具原则性、模块化的架构重构了整个系统。 与 Borg “全知全能”的单体式 Master 不同,Omega 采用了共享状态架构:集群状态被保存在一个中心化、事务一致的存储系统中(基于 Paxos ),所有组件(如调度器)通过乐观并发控制(Optimistic Concurrency Control,OCC)读取和写入。 这种解耦设计打破了 Borg 中那个“全知全能”的 master,将其拆分为多个平行的组件,使得多个调度器可以并行运行,并且支持可插拔的控制面模块。 本质上,Omega 将 Borg 那种严格的中心化控制,转变为一种更分布式的架构,从而提升了灵活性和系统可扩展性。 在后来的发展中,Omega 的许多创新(如多调度器架构、基于 API 的状态存储等)都深深影响了 Kubernetes 的设计。Kubernetes 设计中的 Borg 与 Omega 启示
任务分组调度
Kubernetes 的创造者大多来自 Borg 团队,他们在构建这一新系统时有意融入了 Borg 和 Omega 的经验教训,其中一个被完整继承的重要理念,是“任务分组调度”的思路。 在 Borg 中,一个作业(Job)可以包含多个任务,这些任务被统一调度进一个名为 “Alloc”(分配的简称)的容器中。用户在使用过程中,通常会将辅助守护进程 Daemons(sidecar)与主任务一同部署在同一个 Alloc 中。 这种模式表明:如果调度器能够将任务组视为一级调度单元,系统设计将更加简洁。 Google 曾在 Borg 的后期版本和 Omega 中尝试引入这个概念(当时称为 “Scheduling Units” 或 SUnits),但由于 Borg 系统已非常成熟,强行加入这种新机制相当困难。 Kubernetes 直接采纳了这一设计思想:Pod 由一个或多个始终同时调度的容器组成,成为 Kubernetes 中最基本的部署单位,相当于 Omega 中的 SUnit。 Pods 的设计天然支持 Sidecar 模式与紧密耦合的服务协作运行,并共享网络和存储资源——这是对 Borg 使用模式的直接吸收与演化。 另一个重要影响是是对丰富元数据和灵活 API的需求。 Borg 起初缺乏针对工作负载的通用标记(tag)机制。Borg Job 最初不支持任意键/值标签,用户只能在冗长的 Job名称中编码版本、环境等信息,再事后解析,既低效又易出错。 2013 年,Google 工程师提出将一级标签(key-value metadata)引入 Borg 和 Google Cloud Platform,以统一描述应用程序属性。 最终,这一机制在 Kubernetes 中得以原生实现——Kubernetes 一开始就包含了标签和标签选择器,允许用户标记 Pod 和其他资源对象,然后选择其中一组对资源进行调度、监控、负载均衡。 这些标签系统还借鉴了 Google 监控系统的经验:有意避免使用 “OR” 逻辑,以确保选择器之间不会产生重叠,简化服务发现与发布管理。 Kubernetes 还引加入了注释 (Annotations),是非结构化键/值元数据,用于为对象附加任何辅助信息。补充了 Borg 仅有的 notes 字段,从而实现更强的可扩展性。 这些元数据机制使 Kubernetes 的用户体验和可扩展性远远超出其前身。工作负载管理
Kubernetes 另一个显著演进的方向是工作负载管理。 在 Borg 中,所有类型的工作负载从长期运行的服务到批处理任务,再到系统守护进程都使用一种统一的抽象模型:Job(由多个任务组成的数组)。 Borg 的 Job 拥有大量配置参数,但在实际操作中仍需依赖外部辅助进程来实现某些特定行为。例如:
在早期(2013–2016)的发展阶段,Kubernetes 借鉴了 Google 十余年在 Borg 和 Omega 上的实战经验,将这些久经考验的设计思想,重新打磨为一个模块化、可扩展、开放可用的容器编排平台。 从 Pod 和控制器,到标签 API 和状态存储机制,几乎每一项核心设计都能追溯到 Borg 与 Omega 的技术遗产。 与此同时,Kubernetes 的架构师有意识地避开了 Borg 的一些设计陷阱,同时也保留并优化了它的优势(高效调度、自我修复、高资源利用等),并将这些能力以更加开发者友好的方式呈现出来。 Kubernetes 的开源成功并非偶然,背后有着非常清晰的动因:解决容器使用爆炸式增长所带来的新问题,并以一种任何公司或开发者都能受益的方式来实现,而不仅仅是为 Google 自己服务。 Google 在早期将 Kubernetes 捐赠给 CNCF,并推动社区共建,这一关键决策让 Kubernetes 不只是一个内部工具,而是成为了现代云计算基础设施的基石。 如今回顾 2013–2016 年的演进,从首次提交到 v1.0 的发布,再到广泛社区参与,这段历史是 Kubernetes 从 Google 原型成长为全球生态标准的真实缩影。 即便发展至今,Kubernetes 的核心理念仍植根于当年 Borg 和 Omega 所开创的技术传统,成为推动软件部署方式变革的原动力。彩蛋
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!