博格:Kubernetes的前身

Google在生产中运行容器化工作负载已有十多年了。无论是像Web前端和状态服务器之类的服务工作,还是诸如 大表扳手或类似的批处理框架 MapReduce磨轮,实际上Google的所有内容都是作为容器运行的。今天,我们揭开了Google长期以来一直传闻的面向内部容器的集群管理系统Borg的序幕,并在学术计算机系统会议上发布了详细信息 欧洲系统。你可以找到论文 这里.

Kubernetes直接从Borg追溯其血统。谷歌使用Kubernetes的许多开发人员以前都是Borg项目的开发人员。我们在Kubernetes中结合了Borg的最佳创意,并尝试解决了用户多年来在Borg中发现的一些痛点。

为了给您带来风味,以下是我们在Borg的经验中提供的四个Kubernetes功能:

  1. 豆荚。吊舱是Kubernetes中调度的单位。它是一个或多个容器在其中运行的资源信封。保证属于同一容器的容器可以一起调度到同一台计算机上,并且可以通过本地卷共享状态。

Borg有一个类似的抽象,称为alloc(“资源分配”的缩写)。 Borg中alloc的流行用法包括运行Web服务器,该服务器生成日志以及轻量级日志收集过程,该过程将日志发送到群集文件系统(与流利的或logstash不同);运行Web服务器,该Web服务器从磁盘目录提供数据,该磁盘目录由从群集文件系统读取数据并为Web服务器准备/暂存的进程填充(与内容管理系统不同);并与存储分片一起运行用户定义的处理功能。 Pod不仅支持这些用例,而且还提供类似于在单个VM中运行多个进程的环境-Kubernetes用户可以在Pod中部署多个位于同一地点的协作过程,而不必放弃一个每个容器的应用程序部署模型。

  1. 服务。尽管Borg的主要角色是管理任务和计算机的生命周期,但是在Borg上运行的应用程序还可以从许多其他群集服务中受益,包括命名和负载平衡。 Kubernetes使用服务抽象支持命名和负载平衡:服务具有名称,并映射到由标签选择器定义的动态Pod集(请参阅下一节)。群集中的任何容器都可以使用服务名称连接到服务。在幕后,Kubernetes会自动在与标签选择器匹配的Pod之间对与服务的连接进行负载平衡,并跟踪Pod在哪里运行,因为它们由于故障而随着时间重新安排。

  2. 标签。 Borg中的容器通常是一组相同或几乎相同的容器中的一个副本,该容器对应于Internet服务的一层(例如Google Maps的前端)或批处理作业的工人(例如MapReduce)。该集合称为作业,每个副本称为任务。尽管Job是一个非常有用的抽象,但它可能是有限的。例如,用户经常希望将其整个服务(由许多Jobs组成)作为一个实体进行管理,或者统一管理其服务的几个相关实例,例如单独的Canary和稳定的发行版。另一方面,用户经常希望推理和控制作业中的任务子集-最常见的示例是在滚动更新期间,此时作业的不同子集需要具有不同的配置。

Kubernetes supports more flexible collections than Borg by organizing pods using labels, which are arbitrary key/value pairs that users attach to pods (and in fact to any object in the system). Users can create groupings equivalent to Borg Jobs by using a “job:<jobname>” label on their pods, but they can also use additional labels to tag the service name, service instance (production, staging, test), 和 in general, any subset of their pods. A label query (called a “label selector”) is used to select which set of pods an operation should be applied to. Taken together, labels 和 复制控制器 允许非常灵活的更新语义,以及跨等效于Borg Jobs的操作。

  1. 每个IP位。在Borg中,计算机上的所有任务都使用该主机的IP地址,从而共享主机的端口空间。虽然这意味着Borg可以使用普通网络,但是它给基础结构和应用程序开发人员带来了许多负担:Borg必须将端口作为资源进行调度;任务必须预先声明它们需要多少个端口,并将要使用的端口作为启动参数。 Borglet(节点代理)必须强制端口隔离;命名和RPC系统必须处理端口以及IP地址。

由于软件定义的覆盖网络的出现,例如 绒布 或内置 公共云,Kubernetes能够为每个Pod提供服务并为其提供自己的IP地址。这消除了管理端口的基础架构的复杂性,并允许开发人员选择他们想要的任何端口,而不需要其软件适应基础架构选择的端口。后一点对于在Kubernetes上轻松运行现成的开源应用程序至关重要-Pod可以像VM或物理主机一样对待,可以访问整个端口空间,而不必理会它们与其他Pod共享同一台物理计算机。

随着基于容器的微服务架构的日益普及,Google从内部运行此类系统所汲取的经验教训已引起外部DevOps社区越来越多的兴趣。通过揭示我们的集群管理器Borg的一些内部工作原理,并将我们的下一代集群管理器构建为一个开源项目(Kubernetes)和一个公开可用的托管服务(Google容器引擎),我们希望这些课程可以使Google以外的广大社区受益,并推动容器调度和集群管理方面的最新技术发展。