原文地址:

Kubernetes 101: Pods, Nodes, Containers, and Clusters?

medium.com

Kubernetes正在迅速成为在云中部署和管理软体的新标准。 然而,Kubernetes提供的所有功能都带来了陡峭的学习曲线。 作为一个新手,试图解析官方文档可能被压倒。 组成系统有许多不同的部分,很难说哪些部分与你的用例相关。 这篇博文将提供Kubernetes的简化视图,但描述他的最重要的组件以及他们如何组合在一起。

首先,让我们看一下硬体的表示方式

硬体(Hardware)

节点(Nodes)

节点是Kubernetes中计算硬体的最小单元。 它表示集群(cluster)中的单台计算机。 在大多数生产系统中,节点可能是数据中心中的物理机,也可能是托管在云提供商(如Google Cloud Platform、阿里云等)上的虚拟机。 但是,不要让约定限制你; 从理论上讲,你几乎可以使用任何东西创造一个节点。

将机器视为「节点」允许我们插入一个抽象层。 现在,我们可以简单地将每台机器视为一组可以使用的CPU和RAM资源,而不必担心任何单个机器的独特特性。 这样,任何机器都可以替换Kubernetes集群中的任何其他机器。

集群(The Cluster)

虽然使用单个节点可能很有用,但它不是Kubernetes方式。 通常,您应该将集群视为一个整体,而不是担心单个节点的状态。

在Kubernetes中,节点将它们的资源集中在一起以形成更强大的机器。 将程序部署到集群时,它会智能地为您分配工作到各个节点。 如果添加或删除任何节点,集群将根据需要转移工作。 对于程序或程序员来说,单个机器实际运行代码并不重要。

持久卷(Persistent Volumes)

由于无法保证在集群上运行的程序在特定节点上运行,因此无法将数据保存到文件系统中的任何位置。 如果程序试图将数据保存到文件中以供日后使用,但随后重新定位到新节点上,则该文件将不再是程序所期望的数据文件。 因此,与每个节点关联的传统本地存储被视为用于保存程序的临时高速缓存,但是不能期望本地保存的任何数据都保持不变。

为了永久存储数据,Kubernetes使用持久卷。 虽然所有节点的CPU和RAM资源都由集群有效地池化和管理,但持久性文件存储却没有。 相反,本地或云驱动器可以作为持久卷附加到集群。 这可以被认为是将外部硬碟插入集群。 持久卷提供可以挂载到集群的文件系统,而不与任何特定节点关联。

软体(Software)

容器(Containers)

在Kubernetes上运行的程序打包为Linux容器。 容器是一种被广泛接受的标准,因此已经有许多可以在Kubernetes上部署的预构建映像(pre-built images)。

容器化(Containerization)允许您创建自包含(self-contained)的Linux执行环境。 任何程序及其所有依赖项都可以捆绑到一个文件中,然后在Internet上共享。 任何人都可以下载容器并将其部署在他们的基础设施上,只需要很少的配置。 可以通过编程方式创建容器,从而形成强大的CI和CD管道。

可以将多个程序添加到单个容器中,但是如果可能的话,您应该将自己限制为每个容器一个进程。 拥有许多小容器比一个大容器更好。 如果每个容器都具有紧密关注(tight focus),则更新更易于部署,并且问题更易于诊断

Pods

与您过去使用的其他系统不同,Kubernetes不直接运行容器;相反,它将一个或多个容器包装到称为pod的更高级的结构中。同一pod中的任何容器将共享相同的资源和本地网路。容器可以轻松地与同一个容器中的其他容器进行通信,就像它们位于同一台机器上一样,同时保持与其他容器的隔离程度。

Pod用作Kubernetes中的复制单元。如果您的应用程序变得过于流行并且单个pod实例无法承载负载,则可以将Kubernetes配置为根据需要将pod的新副本部署到集群中。即使在不负载的情况下,在生产系统中随时运行多个pod的副本也是标准的,以允许负载平衡和抵抗故障。

Pod可以容纳多个容器,但是你应该尽可能限制自己。由于pod是作为一个扩容和缩容的单元,因此pod中的所有容器必须一起扩展,无论其个人需求如何。这导致资源浪费和昂贵的账单。为了解决这个问题,pod应该保持尽可能小,通常只保持一个主进程及其紧密耦合的辅助容器(这些辅助容器通常称为「side-cars(侧车)」)。

部署(Deployments)

尽管pod是Kubernetes中的基本计算单元,但它们通常不直接在集群上启动。 相反,pod通常由另一层抽象管理:deployment(部署)。

deployment部署的主要目的是声明一次应该运行多少个pod副本。 将deployment部署添加到集群后,它将自动启动请求的pod数量,然后监视它们。 如果pod死亡,deployment部署将自动重新创建它。

使用deployment部署,您不必手动处理pod。 您只需声明所需的系统状态,即可自动为您管理。

入口(Ingress)

使用上述概念,您可以创建节点集群,并将pod的deployments部署启动到集群上。 但是,还有一个问题需要解决:允许外部流量到您的应用程序。

默认情况下,Kubernetes提供pod和外部世界之间的隔离。 如果要与在pod中运行的服务进行通信,则必须打开通信通道。 这被称为ingress入口。

有多种方法可以向集群添加入口。 最常见的方法是添加入口控制器或负载均衡器。 这两个选项之间的确切权衡超出了这篇文章的范围,但是你必须意识到在你使用Kubernetes之前需要处理入口。


推荐阅读:
相关文章