容器和Kubernetes简介

容器Kubernetes底层概念的入门知识,以及它们如何为应用程序开发启用新模式。

容器是新过程

最初有电脑。 计算机启动时,会运行一个名为init的程序。 然后,init程序运行所有其他需要的程序:服务器,终端和窗口管理器。 init可以做一些有趣的事情,例如在启动时启动程序,以固定的时间间隔运行程序,并确保已运行的程序没有失败并崩溃,然后它将重新启动它们。 正在运行的程序可以查看计算机上的所有内容:其他正在运行的程序,所有文件和网络。

因为它为程序员提供了一个更容易的模型,可以通过划分事物来推理事物,所以开发了用于创建名称空间的工具。 在名称空间中运行的程序或进程只能看到同一名称空间中的其他进程。 如果他们查找文件,则只会看到分配给该名称空间的硬盘部分。 从安全性的角度来看,名称空间中受损的进程只能影响该名称空间。

开发了诸如Docker和Rkt之类的工具来系统地使用这些功能。 这些工具提供了将名称空间打包为容器的优点,因此可以很容易地将其移动到另一台计算机,这是因为众所周知,由于其隔离的性质,它将继续以完全相同的方式运行。 实际上,通常很容易想到像完全独立运行的微型计算机这样的容器。 由于这些新工具易于使用,因此它们已成为构建软件的非常流行的方式。

容器是新过程。

规模:一个好问题

一台计算机的资源有限,它只能处理大量数据并同时运行许多程序。 处理增加的负载(例如更多的用户或更大的数据集)的一种简单方法是垂直扩展或为计算机增加更多的处理能力和内存,但是这很快变得非常昂贵,并且可以走多远。 另一种方法是通过添加更多计算机来横向扩展。 这些计算机现在形成一个群集。

需要以不同的方式构建应用程序,以便在集群上良好运行。 例如,如果我们确保同一程序的两个副本可以运行而无需访问其他人的数据,那么我们可以放心地在多台计算机上运行同一程序的多个副本,并且不会发生任何不良情况。

尽管容器本身并没有为我们提供任何额外的工具来构建分布式应用程序,但是在这种抽象级别上进行思考可以使为集群构建应用程序变得更加容易。 容器模型鼓励以下假设:

  • 可能正在运行多个副本(为并发而构建),
  • 可以在集群中的任何计算机上动态启动和停止容器(首选无状态,短暂性),并且
  • 计算机或进程可能随时出现故障或不可用,但整个系统仍应保持工作状态(为故障和恢复而构建)。

集群中要管理的计算机如此之多,我们面临着其他挑战。

  • 首先,我们需要在计算机上管理诸如处理和存储之类的资源。 这意味着我们必须在不同的计算机上有效地分配和调度消耗它们的进程。
  • 我们还需要关联性或方法来一起运行相关流程,以实现资源的有效共享; 和反亲和力,以确保争夺相同资源的进程不会在同一台计算机上运行。
  • 例如,如果我们要运行应用程序服务器进程的两个副本以处理两倍数量的请求,我们希望这些进程在群集中的不同计算机上运行。
  • 随着许多流程在各地运行,我们需要一种发现所有流程并与之进行交流的方法。 如果我们知道运行该进程的计算机的IP地址,则可以与该进程进行通信。

一台计算机只有一个IP地址。 对于多台计算机,我们需要维护到ip地址的进程映射,例如在诸如etcd之类的分布式数据库中。 当进程在计算机上启动时,我们将此信息添加到数据库中。 如果处理失败或计算机出现故障,我们还需要从数据库中删除该条目。

程序员已经非常擅长于编写在一台计算机上运行的应用程序。 理想情况下,我们想要做的是拥有一个工具,该工具可以将群集中的所有计算机作为一台大型计算机呈现给程序员。

朝这个方向迈出的一步是CoreOS上的Fleet,它基本上是将一台计算机上的init进程扩展为整个集群的init的想法。

由Google推出的Kubernetes项目使我们更接近拥有一台巨型计算机的模型。

Kubernetes:Pod是新计算机

Kubernetes要做的第一件事是拿走您的计算机,并将一台巨型计算机还给您,作为Kubernetes集群。

Kubernetes容器指定一组要运行的Docker或Rkt容器。

现在,我们可以看到与Kubernetes集群中不同Pod中运行的不同进程进行交互,而不是与集群中不同计算机上运行的不同进程进行交互。

在此之前,我们考虑过要在同一台计算机上一起运行的进程。 现在,我们可以考虑围绕哪些流程组构建哪些吊舱; Pod成为对应用程序的功能单元建模的好方法。 我们甚至可以直接放入社区构建的Pod,并使其立即工作,例如进行日志记录和监视。

Pod中的所有进程都在同一台计算机上运行,​​这解决了共享资源(如已安装的磁盘)的问题。 在后台,Kubernetes将Pod分配给不同的计算机或Kubernetes节点。 我们可以设置发生这种情况的标准,例如资源限制以及对其他吊舱和节点的亲和力。

计算机是资源,一些处理,内存,磁盘和网络接口的集合。 就像计算机一样,也可以从基础池中为Pod分配一定数量的资源。 它还在虚拟网络上为Pod接收自己的网络接口和IP地址。

吊舱是新计算机。

如果需要扩展某个特定功能,则只需在集群上运行Pod的更多副本即可。 当硬件受到限制时,我们只需向群集添加更多的计算或存储资源。 通过将资源与创建后要执行的功能分离,调度程序可以确保尽可能高效地使用所有可用的计算资源。

Kubernetes复制控制器负责确保同一Pod的一定数量的副本始终在任何时间运行。 就像分布式初始化一样,如果pod失败了 因为其中的一个进程失败,由于pod依赖项失败或由于它所在的节点故障而导致; Kubernetes会检测到它,并在可用节点上显示另一个副本。

Kubernetes服务跟踪集群中某种类型的所有Pod。 例如,我们可以使用一个应用服务器服务来跟踪集群中的所有应用服务器容器。 服务形成了非常方便的抽象; 我们的应用程序可以快速找到特定类型的所有功能单元,并在它们上分配工作。

Kubernetes不仅是一个用于管理和调度集群上的进程的框架,它还是一种新的思维模型,可以在Pod中的进程分组和服务支持的发现的基础上构建应用程序。

整圈和未来之路

管理一台计算机已经是一个难题。 管理一大堆彼此交谈的事情要复杂得多。 多亏那些正在制作令人难以置信的工具(如Docker和Kubernetes)的好人,我们现在有了容器之类的简单模型,以及使计算机集群像一台计算机一样工作的工具。 大规模构建应用程序从未如此简单。

容器和集群管理工具也影响了人们构建应用程序的方式。 它们创建了新的模式和抽象,其含义仍在探索中。 例如,使用容器构建可重用的应用程序组件和库将很有趣。 在Hasura,我们正在构建数据库,搜索,用户管理和文件管理等组件,以便可以通过组装这些组件并将它们捆绑在一起来快速构建应用程序。

总的来说,我们在创建更简单模型的过程中走的更远。 事实是,当今所有软件都与运行代码和执行功能有关。 在这方面,我们构建的所有内容都只是关于管理这些功能的:将它们分组,运行它们的多个副本,与它们定位和交谈以及处理故障。 推到逻辑上的结论,也许有一天我们会看到一个仅指定功能的系统,而该系统实际上负责其他所有事情。 那样就好了。

使用Hasura平台在几分钟内将后端API添加到您的应用程序。 在这里旋转一下:https://hasura.io