Kubernetes正迅速成为云计算中部署和管理软件的新标准。不过,Kubernetes既然能提供极高的价值,也肯定会附带一个陡峭的学习曲线。作为一个新手,试图解析官方文档可能会很困难。这个系统由许多不同的片段组成,并且很难区分哪些与你的用例相关。这篇文章将提供Kubernetes的简化视图,但它会对最重要的组件和它们如何组合在一起提供一个高层次的概述。
首先,让我们看一下硬件是如何表述的:
硬件
节点(Node)
节点是Kubernetes中最小的计算硬件单元。它是集群中单个机器的表示。在大多数生产系统中,节点很可能是数据中心中的物理机器,或者是托管在像谷歌云平台这样的云供应商上的虚拟机。不过,不要让惯例限制了你的想象力,从理论上讲,你可以把任何东西做成一个结点。
把机器看作一个节点,可以让我们插入一个抽象层。现在,我们不必担心任何单个机器的独特特性,而是可以简单地将每台机器看作一组可以使用的CPU和RAM资源。这样,任何机器都可以替代Kubernetes集群中的任何其他机器。
集群(Cluster)
虽然使用单个节点是有用的,但它与Kubernetes理念不同。一般来说,你应该将集群看作一个整体,而无需担心单个节点的状态。
在Kubernetes中,节点汇聚资源,形成更强大的机器。当你将程序部署到集群中时,它将智能地处理将工作分配给你的各个节点。如果添加或删除了任何节点,集群将根据需要在工作中进行转换。这对程序或程序员来说都不重要,因为机器实际上是在运行代码。
如果这种类似母巢的系统让你想起《星际迷航》中的Borg,实话告诉你,你不是一个人,Borg是Kubernetes内部谷歌项目的名称。
持久卷(Persistent Volumes)
因为在集群上运行的程序不能保证在特定的节点上运行,所以无法将数据保存到文件系统中的任意位置。如果一个程序试图将数据保存到一个文件中,但随后又被转移到一个新的节点上,那么该文件将不再是程序期望的位置。由于这个原因,与每个节点相关的传统本地存储被当作临时缓存来保存程序,但本地保存的任何数据都不能持久。
为了永久存储数据,Kubernetes使用持久卷(Persistent Volumes)。虽然所有节点的CPU和RAM资源都被集群有效地汇集和管理,但持久的文件存储却不是。相反,本地或云驱动器可以作为持久卷附加到集群上。这可以看作是将外部硬盘插入到集群中。持久卷提供了可以挂载到集群的文件系统,而不与任何特定节点相关联。
软件
容器(Container)
在Kubernetes上运行的程序被打包成Linux容器。容器是一个被广泛接受的标准,因此已经有许多预先构建的映像可以部署在Kubernetes上。
容器化允许你创建自足式的Linux执行环境。任何程序和它的所有依赖项都可以打包成一个文件,然后在网络上共享。任何人都可以下载该容器并在其基础设施上部署它,所需的设置非常少。创建一个容器可以通过编程方式完成,从而形成强大的CI和CD管道。
可以将多个程序添加到单个容器中,但是如果可能的话,你应该将自己限制为每个容器的一个进程。拥有很多小容器比一个大容器好。如果每个容器都有一个紧密的焦点,那么更新更容易部署,并且问题更容易诊断。
Pod
与你过去使用的其他系统不同,Kubernetes不直接运行容器;相反,它将一个或多个容器封装到一个称为Pod的高级结构中。相同Pod中的任何容器都将共享相同的名称空间和本地网络。容器可以很容易地与其他容器在相同的容器中进行通信,就像它们在同一台机器上同时保持一定程度的隔离。
Pod被用作Kubernetes的复制单元。如果你的应用程序太受欢迎,单个的Pod实例无法承载负载,那么可以配置Kubernetes以在必要时将你的Pod的新副本部署到集群。即使在没有重载的情况下,在生产系统中任何时候都要有多个副本,以保证负载均衡和故障抵抗。
Pod可以容纳多个容器,但在可能的情况下应该限制自己。因为Pod作为一个单位被放大和缩小时,所有在一个Pod里的容器都必须在一起缩放,不管它们是否需要。这将导致资源的浪费和成本增加。为了解决这个问题,Pod应该保持尽可能小的大小,通常只保留一个主进程和紧密耦合的辅助容器(这些辅助容器通常被称为侧三轮摩托车)。
部署(Deployment)
虽然Pod是Kubernetes的基本计算单元,但它们通常不是直接在集群上启动的。相反,Pod通常由一个抽象层来管理:部署。
部署的主要目的是声明一个Pod应该同时运行多少个副本。当将部署添加到集群中时,它将自动地旋转加速所需的Pod数量,然后监视它们。如果一个Pod消失,部署将自动重新创建它。
使用部署,你不必手动处理Pod。你只需声明系统的期望状态,它将自动为你管理。
入口(Ingress)
使用上面描述的概念,你可以创建一个节点集群,并将Pod部署到集群上。不过,还有一个问题需要解决:允许外部通信流进入你的应用程序。
默认情况下,Kubernetes提供隔离舱和外部世界。如果你想要与运行在Pod中的服务通信,你必须打开一个通信通道。称作入口(ingress)。
有多种方法可以将入口添加到集群中。最常见的方法是添加入口控制器或负载均衡器。这两个选项之间的精确权衡超出了本文的范围,但是你必须知道,在你可以与Kubernetes进行实验之前,你需要处理的是入口。
接下来是什么
以上是对Kubernetes的简单描述,旨在为你提供开始试验所需的基础知识。想必现在你已经了解了组成系统的部分,现在是时候使用它们来部署一个真正的应用程序了。
要在本地使用Kubernetes,可以使用Minikube在你的个人硬件上创建一个虚拟集群。如果你准备尝试云服务,谷歌Kubernetes引擎有一系列教程,可帮助你入门。