Kubernetes 简介 KUBERNETES 架构

2025-06-08

Kubernetes 简介

Kubernetes 架构

你有没有想过,像 Facebook 这样的公司是如何能够为数十亿用户提供应用程序,并管理各种不同的应用服务器、更新以及众多应用程序组件的?答案在于分布式计算。分布式系统是一个由多个组件组成的系统,这些组件彼此通信并协调操作,最终呈现给最终用户一个单一的应用程序。在本文中,我将讨论一种有助于实现分布式计算的工具——Kubernetes。在我之前的文章中,我解释了 Docker 以及它如何以容器的形式交付软件,从而创建轻量级、易于启动且快速扩展的健壮 Web 应用程序。如果你还没有读过,可以在这里查看,因为它为我将在这里讨论的 Kubernetes 奠定了基础。

为什么选择 Kubernetes

要理解 Kubernetes 的工作原理,最好先了解它要解决的问题。假设您构建了一个很棒的约会网站应用。该应用被打包到多个容器中,每个容器处理应用程序的不同部分。例如,一个容器用于身份验证逻辑。另一个用于用户推荐,等等。想象一下,您有数千个这样的容器,需要将它们部署到多台服务器上。随着约会应用的用户越来越多,您还需要考虑扩展,即添加新服务器来处理额外的负载。现在,当我们开始每秒管理数百万用户时,您会同意我的观点,整个系统变得复杂且难以管理只是暂时的。Kubernetes 正是要解决这个问题。它源于 Google 运行生产工作负载的经验。

Kubernetes 是一个跨多种基础设施管理容器化应用程序的系统。在这篇博文中,我将讨论 Kubernetes 的一些基本组件,并探索构成这个庞然大物的各个部分。

Kubernetes 可以被视为一组系统,每个系统都为前一个系统提供了一个抽象层。
为了更好地理解,我们将 Kubernetes 系统分为两部分:硬件和软件。

硬件

节点

节点是 Kubernetes 的基本构建块。它为 Kubernetes 系统提供计算能力。别被它的名字吓到。节点可以是任何拥有 CPU 和 RAM 的设备,你的手机或笔记本电脑完全可以作为你的 Kubernetes 节点。在生产系统中,节点可以是数据中心的物理机,也可以是托管在云提供商上的虚拟机。

节点

集群是节点的集合。一组彼此共享资源、协同工作的机器池称为集群。集群的优势在于可以更好地管理应用程序的资源、提高容错能力和可扩展性。如果一台机器发生故障,Kubernetes 可以在另一台机器上运行该应用程序;如果单台机器上的负载过大,则可以将负载分散到多台机器上。当您将程序部署到集群中时,Kubernetes 会智能地处理集群中各个节点之间的工作负载分配,以提供最佳性能。当我们在集群上运行应用程序时,我们不必关心在哪个节点上运行,Kubernetes 将自动处理工作分配。集群中的每台机器都使用共享网络相互通信。
集群


照片由 Ivan Fioravanti 在 HackerNoon 上拍摄

持久卷

保存在节点上的数据具有易失性,因为运行应用程序代码和依赖项的程序可能会移动到集群中的其他节点。例如,如果一个节点内存不足或无响应。应用程序可能会移动到其集群中的另一个节点,如果程序尝试将数据保存到文件中以供日后使用,但随后被重定位到新节点,则该文件将不再位于程序预期的位置。因此,关键数据通常不存储在节点上,而是存储在称为持久卷的硬件上。无论节点或 pod 的状态如何,此持久卷都可以长时间存储数据。此持久卷通常连接到集群,可以被认为是将外部硬盘连接到集群以提供可由任何节点使用的存储系统。

软件

容器

容器允许开发人员将应用程序(包括库和其他依赖项等组件)打包到单个进程中。任何程序及其所有依赖项都可以打包成单个文件,然后在互联网上共享。任何人都可以下载容器并将其部署到自己的基础架构上,只需极少的设置即可在其系统上运行该软件的精确版本。

吊舱

Kubernetes 并不直接运行容器,而是将多个容器打包到一个名为 pod 的更高级结构中。同一 pod 中的容器共享网络和资源,并且可以轻松地相互通信。Kubernetes
部署的单位是 pod。假设您刚刚创建的约会网站 Web 应用程序有多个容器。一个容器包含一个包含应用程序逻辑的 Web 应用程序。另一个容器包含您的用户推荐 WebAPI。您可以将这两个容器打包到一个 pod 中。它们将作为单个部署运行。如果您的约会应用程序获得关注,并且您希望将其扩展到更多用户,您可以简单地复制该 pod 并根据需要将其部署到您的集群。Pod 可以容纳多个容器,但请将容器数量限制在合理范围内,因为 pod 中的容器会一起扩展,并且在扩展不需要扩展的容器时可能会导致资源浪费。

替代文本

部署

Pod 通常由称为部署 (Deployment) 的抽象层进行管理。部署 (Deployment) 运行应用程序的多个副本 (Pod),并自动替换任何发生故障或无响应的实例。部署就像 Pod 的管理器,它会自动增加请求的 Pod 数量,监控 Pod,并在发生故障时重新创建 Pod。通过这种方式,部署 (Deployment) 有助于确保应用程序的一个或多个实例可用于处理用户请求。
部署

服务

服务可以定义为一组逻辑上的 pod。由于 pod 是动态的并且经常变化,因此为这些不变的 pod 提供稳定的接口非常重要。其他应用程序在访问 pod 时会看到此接口。服务可以定义为 pod 顶部的抽象,它提供单个 IP 地址和 DNS 名称,通过它可以访问 pod。它可以帮助 pod 轻松扩展,而无需担心每个 pod 的变化 IP 地址;您可以创建一个节点集群,在集群上启动 pod 部署,然后添加服务以提供外部接口,让用户与您的 Kubernetes 集群进行通信。无论服务的路由到的 pod 如何变化,它的 IP 地址都保持稳定。通过部署服务,您可以轻松获得可发现性并简化容器设计。
服务

外部流量

现在,集群中的所有服务都已运行,现在的问题是如何将外部流量引入集群?有几种方法可以做到这一点,但我将重点介绍其中一种:Ingress Controller。

入口控制器

Ingress 并非一项服务,而是一个 API 对象,用于管理集群中服务的外部访问。它充当集群的单一入口点,将请求路由到不同的服务。Ingress 控制器是负责处理这些请求的组件。要公开 Ingress,最佳的生产级解决方案是使用负载均衡器。
入口控制器

现在我们来深入了解一下 Kubernetes 的架构。Kubernetes 是如何智能地自动管理所有节点、集群、服务和 Pod 的呢?

Kubernetes 架构

Kubernetes 架构


摄影:Jef Spaleta Sensu 博客

Kubernetes 控制平面

集群中的一个节点充当主服务器,负责 Kubernetes 提供的大部分集中式逻辑。该服务器充当集群的网关和大脑,向用户和客户端公开 API,检查其他服务器的健康情况,并协调其他组件之间的通信。
它确定将工作负载调度到不同节点的最佳方式。

主服务器的组件

  1. Etcd 存储:它是一个由 CoreOS 团队开发的开源键值数据存储,可供集群中的所有节点访问。Kubernetes 使用“Etcd”来存储集群的配置数据,以便随时掌握集群的整体状态。它存储系统的当前状态和期望状态。如果 Kubernetes 发现 etcd 中的当前状态与期望状态存在差异,则会执行必要的调整。

  2. Kube API 服务器:API 服务器是中央管理实体,接收用于修改服务的 REST 请求,并充当集群控制的前端。该组件通过 API 公开 Kubernetes 控制平面。Kubernetes CLI 或“kubectl”通过此方式与集群交互。集群的所有其他组件都向 API 服务器发出请求,并更新 etcd 上的信息。

  3. 调度程序:调度程序负责将工作负载分配到集群中的特定节点。它负责根据资源利用率将 Pod 调度到各个节点,并决定每个服务的部署位置。调度程序掌握着集群成员可用资源的信息,以及用于配置服务运行的剩余资源信息。

  4. 控制器管理器:这是一个后台进程,它通过 apiserver 监视集群的共享状态,并尝试进行更改,使当前状态向期望状态靠拢。当服务发生任何变化时,控制器会感知到变化,并开始朝着新的期望状态努力。

工作节点组件

  1. KUBELET
    每个节点与集群组的主要联系点是一个名为 kubelet 的小型服务。kubelet 确保所有容器正常运行。该服务负责与控制平面服务之间传递信息,并与 etcd 存储交互以读取配置详细信息或写入新值。工作以清单的形式接收,清单定义了工作负载和操作参数。

  2. 代理
    代理允许集群内部的网络通信,它确保服务可供其他组件使用并可以将请求转发到正确的容器,它还执行原始的负载平衡。

  3. 容器运行时
    容器运行时是负责运行容器的组件,最常见的运行时选择是 Docker。

总结......

开发人员编写应用程序代码,并使用 Docker 等容器化软件将其打包到容器中。该容器被放入一个 Pod 中,并标记为部署。Pod 的多个副本被分配一个称为服务的接口。然后,该服务被部署到一组称为集群的计算机中,并被分配一个应用程序的单一入口点,利用 Ingress Controller 等工具为集群打开通信。

Kubernetes 控制平面管理 Pod,将它们分配到集群内的不同节点,并自动确保部署保持所需的状态。随着应用程序获得更多用户,这些 Pod 部署可以轻松复制,并通过向集群分配更多节点进行相应的扩展。开发人员可以通过使用 Kube API 服务器和 kubectl 命令与控制平面通信来管理所有这些流程。
欢迎来到 Kubernetes 的世界!

Kubernetes 不仅仅是一种新的语法 - 它是一种全新的分布式计算思维方式。

要获取更多类似内容,请务必在 dev 和 Twitter 上关注我(@ElegberunDaniel)。

脚注

  1. Kubernetes 101:Pod、节点、容器和集群
  2. Kubernetes-101
  3. Kubernetes 简介
  4. Kubernetes 的工作原理
  5. 愚蠢的简单 Kubernetes

关注我这里以及我的社交媒体以获取更多内容,例如Twitter Linkedin

鏂囩珷鏉ユ簮锛�https://dev.to/gbengelebs/an-introduction-to-kubernetes-5h05
PREV
Netflix 系统设计——Netflix 如何引入新内容
NEXT
我转向 Linux 的原因。全职!