写点什么

谷歌的容器之路:从 Borg 到 Kubernetes

  • 2015 年 5 月 12 日
  • 本文字数:2391 字

    阅读完需:约 8 分钟

作为谷歌公司的开源容器集群管理系统,Kubernetes 在 Docker 技术之上,为容器化的应用提供了资源调度、部署运行、服务发现和扩容缩容等丰富多样的功能。在项目公开后不久,微软、IBM、VMware、Docker、CoreOS 以及 SaltStack 等多家公司便纷纷加入了 Kubernetes 社区,为该项目发展作出贡献。谷歌高级副总裁Urs Hölzle 也曾表示,通过多家公司及社区的共同合作,要确保Kubernetes 在任何应用程序和任何环境(私有云、公共云以及混合云任何环境)都是一个强大并且开放容器的管理架构。

目前,Kubernetes 正处在快速发展的阶段,努力成长为容器管理领域的领导者。其迅速崛起吸引了大量开发人员的注意。除了对产品本身的兴趣,人们更感兴趣的是Kubernetes 背后成功的原因和其发展过程中所经历的教训。但是,谷歌公司在之前对于内部管理系统Borg 相关的信息都一直避而不谈,让外界很难了解Borg 以及Borg 与Kubernetes 的关系。在2015 年的Eurosys 会议上,谷歌终于公布了相关的细节,让大家可以了解谷歌从Borg 到Kubernetes 的成功之路。接下来,本文就从全角度多方面分析,详细揭示Kubernetes 与Borg 的关系,从而探究谷歌领先全球技术的奥秘。

Borg 是谷歌公司的内部容器管理系统。早在十几年前,该公司就已经部署 Borg 系统对来自于几千个应用程序所提交的 job 进行接收、调试、启动、停止、重启和监控。该项目的目的是实现资源管理的自动化以及跨多个数据中心的资源利用率最大化。Kubernetes 项目的创始人 Brendan Burns 曾表示,针对 Borg 系统 ,谷歌进行了很多尝试,积累了大量经验。Kubernetes 项目的目的就是将 Borg 最精华的部分提取出来,使现在的开发者能够更简单、直接地应用。它以 Borg 为灵感,但又没那么复杂和功能全面,更强调了模块性和可理解性。因此,在 2013 年启动的 Kubernetes 项目只是谷歌公司顺应时代发展步伐,把 Borg 相关的技术和经验予以公开和定制化的产物。接下来,我们首先从四个方面来分析 Kubernetes 从 Borg 项目所继承的内容,展示 Borg 所带来的经验。

Pod 是 Kubernetes 最基本的部署调度单元,用来定义一个或多个相关的容器。通过定义一个 Replication Controller,Kubernetes 可以将同一个模块部署到任意多个容器中,并自动管理这些容器,大大简化了系统管理的难度和工作量。其实,在 Borg 项目中已经有完成类似功能的模块——Alloc。在 Borg 中,Alloc 主要用于运行服务集群文件系统相关的日志以及数据传输工作的 web 服务器以及用户自定义的一些处理函数。Kubernetes 在提供这种一个容器运行一个应用的服务模式的基础上,又包含了一个虚拟机运行多个进程的功能。可以看出,谷歌在 Kubernetes 的开发过程中,既继承了 Alloc 的优势,又结合实际需求进行了改进,促进了 Pod 这一核心概念的成熟。

另外一方面,Kubernetes 继承了 Borg 项目中集群管理的理念。在 Borg 项目中,其所管理的对象是细粒度的任务或者机器。但是,Borg 中运行的应用程序用到了针对集群层次的重命名和负载平衡服务。正是这些服务令开发人员认识到了集群层次进行管理的高效之处。因此,Kubernetes 项目直接把 service 作为了基本操作单元。Service 是真实应用服务的抽象,对外表现为一个单一访问接口。这样,外部不需要了解后端运行情况就可以直接使用 service,方便了扩展和后端维护工作。

调试技术是 Kubernetes 从 Borg 项目中受益的另一个方面。在 Borg 项目中,由于使用人员都是谷歌公司内部员工,开发人员采用了把调试信息直接暴露给用户的方式。在遇到问题时,用户可以首先通过相互沟通来解决普遍存在的问题。此外,Borg 还提供了各种层次的 UI 和调试工具,让用户可以在面对大量数据时很好的针对自己遇到的据情况进行详细分析。通过借鉴 Borg 中的成功经验,Kubernetes 提供了 cAdvisor 资源监控工具、基于 Elasticserach 等日志聚合工具等。这些工具和机制为用户调试相关问题提供了很大的方便。

最后一方面是关于分布式系统的主节点 Master。Master 是一个控制器进程,在单元的级别上运行,并保存着所有 Borglet 上的状态数据。作为 Borg 生态系统中的核心,Master 包含了准入控制、周期性任务提交等服务。Kubernetes 在此基础上进一步提供了处理请求和管理下层状态对象的 API 服务器。类似节点控制器和复制控制器的集群管理逻辑都变为了 API 服务器的客户端。

通过以上四个方面,读者可以看到在 Borg 的设计中,谷歌公司已经采用了很多具有可扩展性的设计思路。这些想法为 Kubernetes 开发提供了成功的例子,使得谷歌可以在 Docker 崭露头角之时迅速启动 Kubernetes 项目。当然,Borg 项目也给出了一些深刻的教训,为 Kubernetes 设计提供了前车之鉴。

Borg 把 Job 作为任务 Task 的唯一成组机制。针对 Job 中的部分服务或者 Task 中的部分 Job,Borg 不能把他们进行局部成组尽心管理。针对该问题,Kubernetes 提出了 Label 的改变。Label 是用于区分 Pod、Service、Replication Controller 的 key/value 键值对,Pod、Service、 Replication Controller 可以有多个 label,但是每个 label 的 key 只能对应一个 value。正是通过 Label,Service 和 Replication Controller 能够更好的与多个容器进行沟通。另外,Borg 还存在一个机器上的所有 Task 使用同一个 IP 以及配置过于复杂等问题。Kubernetes 针对这些问题都进行了优化。

可以看出,正是在过去十年间经验与教训的基础上,Kubernetes 项目才顺势崛起,迅速成为一个强大的容器管理架构。通过比较这些方面,广大开发者可以学习到谷歌公司从 Borg 走向 Kubernetes 的艰辛之路以及其在技术发展方面的前瞻性。


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群InfoQ 好读者)。

2015 年 5 月 12 日 06:128081
用户头像

发布了 268 篇内容, 共 109.5 次阅读, 收获喜欢 23 次。

关注

评论

发布
暂无评论
发现更多内容

教你如何解决JS/TS里特定String进行拆分然后遍历各个元素

华为云开发者联盟

JavaScript string 遍历 字符串 元素

虎符交易所HOO持续创造今年新高,你的HOO囤够了吗?

区块链前沿News

加密资产 Hoo 虎符交易所 平台币

TiDB 可观测性方案落地探索 | “我们这么菜评委不会生气吧”团队访谈

PingCAP

人工智能开源录 | 对话OpenI启智社区:智能无处不在,AI开源创新的发展与探索

OpenI启智社区

软件工程 大模型 东数西算 人工智能开源

AI语音处理-文字合成语音功能

DS小龙哥

3月月更

轻松应对1亿+月活,《迷你世界》背后有啥黑科技

华为云开发者联盟

分布式数据库 中间件 RDS 迷你世界

小白入门HarmonyOS Connect设备开发的“芯”路历程

HarmonyOS开发者社区

芯片 HarmonyOS 设备

用测试来学习 Go

baiyutang

golang

RocketMQ系列文章---RocketMQ整体架构

NoLongerConfused

RocketMQ

浏览器工作原理和V8引擎

CRMEB

【ELT.ZIP】OpenHarmony啃论文俱乐部——多维探秘通用无损压缩

ELT.ZIP

OpenHarmony 压缩算法

Go语言实战之映射的内部实现和基础功能

山河已无恙

golng 3月月更

来,2W字+23张图+5W1H分析法帮你彻底拿下缓存

小梁编程汇

缓存 缓存穿透 缓存击穿 缓存并发 缓存服务

基于CREATE TYPE语法自定义新数据类型

华为云开发者联盟

数据库 数据类型 CREATE TYPE 复合类型

N个技巧,编写更高效 Dockerfile|云效工程师指北

阿里云云效

阿里云 云原生 Dockerfile 部署与维护 构建工具

【IT运维】多台海外主机运维用什么工具好?

行云管家

服务器 IT运维 服务器运维 海外主机

ICASSP 2022 | 前沿音视频成果分享:基于可变形卷积的压缩视频质量增强网络

阿里云视频云

阿里云 计算机视觉 音视频 视频编码 视频云

[ CKS 备考指南 -01 ] 总览(送免费 15% 折扣券)

baiyutang

Kubernetes 运维 k8s 开源文化 CKS

全链路压测(六):确认范围和识别风险

老张

性能测试 全链路压测 稳定性保障

Java基础系列文章---异常

NoLongerConfused

3月月更

Redis二三事之事前预防和事中恢复

NoLongerConfused

3月月更

web前端培训:react高频面试题分享

@零度

前端开发 React

程序员最讨厌的四件事,它能解决!

博文视点Broadview

HertzBeat赫兹节拍 v1.0.beta.5 发布,易用友好的监控告警系统

TanCloud探云

Java angular 告警 应用监控 开源监控系统

MySQL系列文章---初识MySQL中的锁

NoLongerConfused

3月月更

数据预处理和特征选择

云智慧AIOps社区

数据挖掘 机器学习 算法 特征选择 数据预处理

三级等保是最高的吗?有什么用?

行云管家

网络安全 等保 等保2.0

网络协议之:socket协议详解之Socket和Stream Socket

程序那些事

网络协议 程序那些事 3月月更 MIME

如何保持系统的整洁

蜜糖的代码注释

设计原则 项目开发 3月月更

Java面向对象知识点拆分(一)

逆锋起笔

面向对象 java基础 3月月更 Java面向对象

昇思MindSpore全场景AI框架 1.6版本,更高的开发效率,更好地服务开发者

Geek_32c4d0

mindspore 昇思 全场景AI框架

谷歌的容器之路:从Borg到Kubernetes_语言 & 开发_张天雷_InfoQ精选文章