Kubernetes 正迅速成为在云中部署和管理软件的新标准。然而,Kubernetes 提供的所有功能都伴随着陡峭的学习曲线。作为新手,尝试解析官方文档可能会让人不知所措。系统由许多不同的部分组成,很难分辨哪些部分与您的用例相关。这篇博文将提供 Kubernetes 的简化视图,但它将尝试对最重要的组件及其如何组合在一起进行高级概述。
首先,让我们看看硬件是如何表示的
Hardware
Nodes
节点是 Kubernetes 中计算硬件的最小单位。它代表集群中的一台机器。在大多数生产系统中,节点可能是数据中心中的物理机器,也可能是托管在 Google Cloud Platform 等云提供商上的虚拟机。但是,不要让惯例限制您;理论上,几乎任何东西都可以成为节点。
将机器视为“节点”使我们能够插入一个抽象层。现在,我们不必担心任何单个机器的独特特性,而是可以简单地将每台机器视为一组可以利用的 CPU 和 RAM 资源。这样,任何机器都可以替代 Kubernetes 集群中的任何其他机器。
The Cluster
尽管使用单个节点很有用,但这不是 Kubernetes 的方式。通常,您应该将集群视为一个整体,而不必担心单个节点的状态。
在 Kubernetes 中,节点将资源汇集在一起以形成更强大的机器。当您将程序部署到集群上时,它会智能地为您处理将工作分配给单个节点。如果添加或删除任何节点,集群将根据需要转移工作。对于程序或程序员来说,哪些单个机器实际上在运行代码并不重要。
如果这种类似蜂巢思维的系统让您想起了《星际迷航》中的博格人,那么您并不孤单;“博格”是 Kubernetes 所基于的内部 Google 项目的名称。
Persistent Volumes
由于集群上运行的程序不能保证在特定节点上运行,因此数据无法保存到文件系统中的任意位置。如果程序尝试将数据保存到文件中以供日后使用,但随后被重新定位到新节点,则该文件将不再位于程序预期的位置。因此,与每个节点关联的传统本地存储被视为临时缓存以保存程序,但本地保存的任何数据都无法持久保存。
为了永久存储数据,Kubernetes 使用持久卷。虽然所有节点的 CPU 和 RAM 资源都由集群有效地汇集和管理,但持久文件存储却不是。相反,本地或云驱动器可以作为持久卷连接到集群。这可以被认为是将外部硬盘插入集群。持久卷提供了一个可以挂载到集群的文件系统,而无需与任何特定节点关联。
Software
Containers
在 Kubernetes 上运行的程序被打包为 Linux 容器。容器是一种被广泛接受的标准,因此已经有许多预构建的映像可以部署在 Kubernetes 上。
容器化允许您创建独立的 Linux 执行环境。任何程序及其所有依赖项都可以捆绑到一个文件中,然后在互联网上共享。任何人都可以下载容器并将其部署在他们的基础设施上,只需很少的设置即可。创建容器可以通过编程方式完成,从而形成强大的 CI 和 CD 管道。
可以将多个程序添加到单个容器中,但如果可能的话,您应该将每个容器限制为一个进程。拥有多个小容器比拥有一个大容器更好。如果每个容器都有一个紧密的焦点,则更新更容易部署,问题也更容易诊断。
Pods
与您过去可能使用过的其他系统不同,Kubernetes 并不直接运行容器;而是将一个或多个容器包装到称为 pod 的更高级结构中。同一 pod 中的任何容器都将共享相同的资源和本地网络。容器可以轻松地与同一 pod 中的其他容器进行通信,就像它们在同一台机器上一样,同时保持与其他容器的一定程度的隔离。
Pod 用作 Kubernetes 中的复制单元。如果您的应用程序变得过于流行,并且单个 pod 实例无法承载负载,则可以配置 Kubernetes 以根据需要将 pod 的新副本部署到集群。即使负载不重,在生产系统中随时运行多个 pod 副本也是标准做法,以实现负载平衡和故障抵抗。
Pod 可以容纳多个容器,但您应该尽可能限制自己。由于 pod 作为一个单元进行扩展和缩小,因此 pod 中的所有容器都必须一起扩展,而不管它们各自的需求如何。这会导致资源浪费和昂贵的费用。为了解决这个问题,pod 应该尽可能保持小,通常只包含一个主进程及其紧密耦合的辅助容器(这些辅助容器通常称为“side-car”)。
Deployments
尽管 Pod 是 Kubernetes 中计算的基本单位,但它们通常不会直接在集群上启动。相反,Pod 通常由另一个抽象层进行管理:部署。
部署的主要目的是声明一次应运行多少个 Pod 副本。将部署添加到集群后,它将自动启动请求的 Pod 数量,然后监视它们。如果 Pod 死亡,部署将自动重新创建它。
使用部署,您无需手动处理 Pod。您只需声明系统的所需状态,它就会自动为您管理。
Ingress
使用上面描述的概念,您可以创建一个节点集群,并在集群上启动 Pod 部署。但是,还有最后一个问题需要解决:允许外部流量进入您的应用程序。
默认情况下,Kubernetes 提供 Pod 与外界之间的隔离。如果您想与 Pod 中运行的服务进行通信,则必须打开一个通信通道。这称为入口。
有多种方法可以将入口添加到集群。最常见的方法是添加入口控制器或负载均衡器。这两个选项之间的确切权衡超出了本文的范围,但您必须意识到,在尝试使用 Kubernetes 之前,您需要处理入口。
下一步
上面描述的是 Kubernetes 的一个过于简化的版本,但它应该为您提供了开始实验所需的基础知识。现在您已经了解了组成系统的各个部分,是时候使用它们来部署真正的应用程序了。查看 Kubernetes 110:您的首次部署以开始使用。
要在本地试验 Kubernetes,Minikube 将在您的个人硬件上创建一个虚拟集群。如果您已准备好尝试云服务,Google Kubernetes Engine 提供了一系列教程来帮助您入门。
如果您是容器和 Web 基础设施领域的新手,我建议您阅读 12 要素应用方法。这描述了在设计在 Kubernetes 等环境中运行的软件时要牢记的一些最佳实践。
最后,要获得更多此类内容,请务必在 Medium 和 Twitter 上关注我(@DanSanche21)。