Kubernetes 架构概述
我们首先对 Kubernetes 集群架构进行基本概述。我们先从高层视角审视整个架构,然后深入探讨每个组件。我们会了解它们的角色、职责以及配置方式。最后,您将完成一个练习测试,测试中您需要查看一个现有的集群,并识别集群中各个组件的相关细节。
我们将用船舶来类比,以理解 Kubernetes 的架构。
Kubernetes 的目的是以自动化的方式将应用程序以容器的形式托管,以便您可以根据需要轻松部署任意数量的应用程序实例,并轻松实现应用程序内不同服务之间的通信。
因此,有很多因素共同作用才使这一切成为可能。
那么,让我们从宏观角度来审视一下Kubernetes架构。在这个例子中,我们有两种类型的船舶:货船,它们负责实际运输集装箱跨越海洋;以及控制船,它们负责监控和管理货船。
Kubernetes 集群由一组节点组成,这些节点可以是物理节点或虚拟节点,可以是本地节点或云端节点,它们以容器的形式托管应用程序。
在这个比喻中,这些都与货船相关。集群中的工作节点就像可以装载集装箱的货船。但不仅需要有人装载集装箱,还需要有人规划装载方式、识别合适的货船、存储货船信息、监控和追踪集装箱在船上的位置、管理整个装载过程等等。这些工作由控制船完成,这些控制船配备了不同的办公室和部门、监控设备、通信设备、用于在货船之间搬运集装箱的起重机等等。
控制平面组件指的是 Kubernetes 集群中的主节点。主节点负责管理 Kubernetes 集群,存储有关不同节点的信息,规划容器的运行位置,监控节点及其上的容器等等。主节点使用一组称为控制平面组件的组件来完成所有这些操作。
现在我们将逐一了解这些组件。每天都有大量的集装箱从船上装卸。因此,您需要维护有关不同船舶的信息,例如哪个集装箱在哪艘船上,以及装载时间等等。所有这些信息都存储在一个名为 Etcd 的高可用键值存储系统中。Etcd 是一个以键值格式存储信息的数据库。我们将在接下来的课程中更详细地探讨集群的具体含义、其中存储的数据以及数据存储方式。当船舶到达时,您需要使用起重机将集装箱装载到船上。
起重机负责识别需要装船的集装箱。它会根据船舶的尺寸、容量、船上已有的集装箱数量以及其他条件(例如船舶的目的地、允许运输的集装箱类型等)来确定合适的船舶。这与 Kubernetes 集群中的调度器类似,调度器会根据容器的资源需求、工作节点的容量以及任何其他策略或约束(例如污点和容忍度规则或节点亲和性规则)来确定将容器放置在哪个节点上。我们将在本课程的后续部分通过示例和练习测试更详细地探讨这些内容。我们专门用一个章节来讲解调度。
黑暗中设有不同的办公室,分别负责特殊任务或部门。
例如,运营团队负责船舶操作、交通管制等。他们处理与船舶损坏、航线、不同船舶的日期等相关的问题。货运团队负责处理集装箱,当集装箱出现故障、损坏或损毁时,他们会确保及时提供新的集装箱。服务办公室负责IT和不同船舶之间的通信。类似地,在Kubernetes中,我们也有控制器负责不同的领域。节点控制器负责管理节点。它们负责将新节点加入集群,并处理节点不可用或损毁的情况。而复制控制器则确保复制组中始终运行着所需数量的容器。
我们已经了解了各种组件,例如不同的办公室、不同的船舶、数据存储、起重机等等。但是它们之间是如何通信的呢?一个办公室如何联系到另一个办公室?谁负责统筹管理所有这些组件?Kube API 服务器是 Kubernetes 的主要管理组件。
Kubernetes API 服务器负责协调集群内的所有操作。它公开 Kubernetes API,供外部用户对集群执行管理操作,以及各种控制器,用于监控集群状态并根据需要进行必要的更改。此外,它还供工作节点与服务器通信。
现在,我们正在使用容器,容器无处不在。因此,我们需要所有东西都与容器兼容。我们的应用程序以容器的形式存在。构成主节点上整个管理系统的各个组件都可以以容器的形式托管。DNS 服务网络解决方案也可以全部以容器的形式部署。所以我们需要能够运行容器的软件。这就是容器运行时引擎,Docker 就是一个常用的。如果您希望将控制平面组件托管为容器,则需要在集群中的所有节点(包括主节点)上安装 Docker 或其支持的等效版本。当然,并非一定要使用 Docker。Kubernetes 也支持其他运行时引擎,例如 containerd 或 Rocket。
现在让我们把注意力转向货船。每艘船都有一位船长,负责管理船上的所有活动。船长负责与上级船东联络,首先告知上级船东他们有意加入接收待装集装箱信息的群组,然后根据需要装载相应的集装箱。船长还会向上级船东发送关于船舶状态和船上集装箱状态的报告等等。在 Kubernetes 中,Kubelet 就相当于这艘船的船长。Kubelet 是一个运行在集群中每个节点上的代理。它监听来自 Kubernetes API 服务器的指令,并根据需要部署或销毁节点上的容器。Kubernetes API 服务器会定期从 Kubelet 获取状态报告,以监控节点及其上容器的状态。
Kubelet 更像是船上的船长,负责管理船上的容器。但是,运行在工作节点上的应用程序需要彼此通信。例如,一个节点上的容器中可能运行着一个 Web 服务器,而另一个节点上的容器中可能运行着一个数据库服务器。那么,Web 服务器如何读取另一个节点上的数据库服务器呢?工作节点之间的通信由运行在工作节点上的另一个组件——Kube 代理服务——来实现。Kube 代理服务确保工作节点上配置了必要的规则,以允许运行在其上的容器相互访问。
综上所述,我们有主节点和工作节点。主节点上有 ETCD 集群,它存储着集群的相关信息。Kube 调度器负责调度应用程序、容器或节点。我们还有不同的控制器,分别负责不同的功能,例如节点控制器、复制控制器等等。Kube API 服务器负责协调集群内的所有操作。
在工作节点上,我们有 Kubelet,它监听来自 Kube API 服务器的指令并管理容器;还有 Kube 代理,它帮助实现集群内服务之间的通信。以上是对各个组件的概览。
今天就到这里,我们将在后续文章中更深入地讲解 Kubernetes 和其他相关的 DevOps 工具。









