Kubernetes是一个用于容器集群的自动化部署、扩容以及运维的开源平台。程序员
节点是Kubernetes中最小的计算硬件单元。它是集群中单个机器的表示。在大多数生产系统中,节点极可能是数据中心中的物理机器,或者是托管在像谷歌云平台这样的云供应商上的虚拟机。不过,不要让惯例限制了你的想象力,从理论上讲,你能够把任何东西作成一个结点。编程
把机器看做一个“节点”,可让咱们插入一个抽象层。如今,咱们没必要担忧任何单个机器的独特特性,而是能够简单地将每台机器看做一组可使用的CPU和RAM资源。这样,任何机器均可以替代Kubernetes集群中的任何其余机器。缓存
虽然使用单个节点是有用的,但它与Kubernetes理念不一样。通常来讲,你应该将集群看做一个总体,而无需担忧单个节点的状态。网络
在Kubernetes中,节点汇聚资源,造成更强大的机器。当你将程序部署到集群中时,它将智能地处理将工做分配给你的各个节点。若是添加或删除了任何节点,集群将根据须要在工做中进行转换。这对程序或程序员来讲都不重要,由于机器其实是在运行代码。负载均衡
由于在集群上运行的程序不能保证在特定的节点上运行,因此没法将数据保存到文件系统中的任意位置。若是一个程序试图将数据保存到一个文件中,但随后又被转移到一个新的节点上,那么该文件将再也不是程序指望的位置。因为这个缘由,与每一个节点相关的传统本地存储被看成临时缓存来保存程序,但本地保存的任何数据都不能持久。运维
为了永久存储数据,Kubernetes使用持久卷(PersistentVolumes)。虽然全部节点的CPU和RAM资源都被集群有效地聚集和管理,但持久的文件存储却不是。相反,本地或云驱动器能够做为持久卷附加到集群上。这能够看做是将外部硬盘插入到集群中。持久卷提供了能够挂载到集群的文件系统,而不与任何特定节点相关联。3d
在Kubernetes上运行的程序被打包成Linux容器。容器是一个被普遍接受的标准,所以已经有许多预先构建的映像能够部署在Kubernetes上。cdn
容器化容许你建立自足式的Linux执行环境。任何程序和它的全部依赖项均可以打包成一个文件,而后在网络上共享。任何人均可如下载该容器并在其基础设施上部署它,所需的设置很是少。建立一个容器能够经过编程方式完成,从而造成强大的CI和CD管道。blog
能够将多个程序添加到单个容器中,可是若是可能的话,你应该将本身限制为每一个容器的一个进程。拥有不少小容器比一个大容器好。若是每一个容器都有一个紧密的焦点,那么更新更容易部署,而且问题更容易诊断。教程
与你过去使用的其余系统不一样,Kubernetes不直接运行容器;相反,它将一个或多个容器封装到一个称为Pod的高级结构中。相同Pod中的任何容器都将共享相同的名称空间和本地网络。容器能够很容易地与其余容器在相同的容器中进行通讯,就像它们在同一台机器上同时保持必定程度的隔离。
Pod被用做Kubernetes的复制单元。若是你的应用程序太受欢迎,单个的Pod实例没法承载负载,那么能够配置Kubernetes以在必要时将你的Pod的新副本部署到集群。即便在没有重载的状况下,在生产系统中任什么时候候都要有多个副本,以保证负载均衡和故障抵抗。
Pod能够容纳多个容器,但在可能的状况下应该限制本身。由于Pod做为一个单位被放大和缩小时,全部在一个Pod里的容器都必须在一块儿缩放,无论它们是否须要。这将致使资源的浪费和成本增长。为了解决这个问题,Pod应该保持尽量小的大小,一般只保留一个主进程和紧密耦合的辅助容器(这些辅助容器一般被称为“侧三轮摩托车”)。
虽然Pod是Kubernetes的基本计算单元,但它们一般不是直接在集群上启动的。相反,Pod一般由一个抽象层来管理:部署。
部署的主要目的是声明一个Pod应该同时运行多少个副本。当将部署添加到集群中时,它将自动地旋转加速所需的Pod数量,而后监视它们。若是一个Pod消失,部署将自动从新建立它。
使用部署,你没必要手动处理Pod。你只需声明系统的指望状态,它将自动为你管理。
使用上面描述的概念,你能够建立一个节点集群,并将Pod部署到集群上。不过,还有一个问题须要解决:容许外部通讯流进入你的应用程序。
默认状况下,Kubernetes提供隔离舱和外部世界。若是你想要与运行在Pod中的服务通讯,你必须打开一个通讯通道。称做入口(ingress)。
有多种方法能够将入口添加到集群中。最多见的方法是添加入口控制器或负载均衡器。这两个选项之间的精确权衡超出了本文的范围,可是你必须知道,在你能够与Kubernetes进行实验以前,你须要处理的是入口。