深入研究 Kubernetes 核心概念

2024-04-16 渥太华微生活

1.gif


什么是 Kubernetes?

Kubernetes是一个工业级的容器编排平台。Kubernetes 这个名字来源于希腊语,意思是舵手或飞行员。“K8s(或一些文章中的“ks”)是将八个字母“ubernete”替换为“8”的缩写。在下图中。

138668186-58571656-5c94-43e9-b9bf-0f9bce8859bc.png

这是一艘载着一堆集装箱的船。这艘船正驶向大海,将集装箱运送到目的地。在英语中,这个词也意味着包装要运输的货物的“容器”。因此,从字面意思来看,Kubernetes 希望成为一艘运输集装箱的船。换句话说,它旨在帮助管理这些容器。所以用“Kubernetes”这个词来代表这个项目。更具体地说,Kubernetes 是一个自动化的容器编排平台,负责基于容器的应用程序的部署、弹性伸缩和管理。


Kubernetes 的核心特性

服务发现和负载平衡

  • 自动容器包装:此功能也称为“调度”。通过将容器放置在集群中的节点上,Kubernetes 有助于编排存储系统,以便将存储的声明期与容器的生命周期联系起来。

  • 自愈: Kubernetes 有助于自动恢复失败的容器。在集群中,主机或操作系统问题可能会导致容器停止服务。如果是这种情况,Kubernetes 会自动恢复这些容器。

  • 自动推出和回滚: Kubernetes 有助于自动推出和回滚应用程序并管理与应用程序相关的配置密文。

  • 批量执行: Kubernetes 允许批量运行作业。

  • 水平扩展:为了使集群和应用程序更具弹性,Kubernetes 还支持水平扩展。

以下部分通过三个示例详细描述了 Kubernetes 的关键功能。

1) 调度

在Kubernetes中,用户提交的容器被部署到Kubernetes管理的集群中的一个节点上。Kubernetes 中的调度器是实现此功能的组件。它监视正在调度的容器的大小和规格。例如,调度器估计所需的 CPU 和内存容量,然后将容器放置在集群中相对空闲的节点上。在本例中,调度器可以将红色容器放置到第二个空闲节点上来完成调度任务。

138668423-a0c669e2-5066-45d7-937c-723aff782b6b.png

2) 自动恢复

Kubernetes 提供节点健康检查。此功能允许系统监控集群中的所有主机。当主机或软件出现问题时,Kubernetes 会自动检测故障,并自动将运行在故障节点上的容器迁移到健康的主机上,以自动恢复集群中的容器。

138668467-8159c5bb-fab1-4240-8e3d-09bd73e588f2.png

3) 水平缩放

Kubernetes 能够通过监控来检查服务负载。如果服务的 CPU 使用率过高或对服务的响应过慢,Kubernetes 会相应地横向扩展该特定服务。在下面的例子中,第一个黄色节点过于繁忙,因此 Kubernetes 将黄色节点的负载分为三个部分。然后通过负载均衡,Kubernetes 将第一个黄色节点上的原始负载平均分配给三个黄色节点,包括第一个黄色节点本身,以提高响应速度。

138668507-9735d722-2526-45b0-8fcd-f0abf3c49d84.png


Kubernetes 架构

Kubernetes 架构是典型的两层服务器-客户端架构。Master作为中控节点,连接多个节点。所有 UI 客户端和用户端组件都连接到 Master,以向 Master 发送所需的状态或要执行的命令。然后,master 将这些命令或状态发送到相应的节点以供最终执行。

138668518-1a691c34-9f87-4840-97fb-a9b4dc81e20a.png

在 Kubernetes 中,master 运行四个关键组件,包括 API 服务器、控制器、调度程序和 etcd。下图展示了详细的Kubernetes架构。

138668532-6ce06050-cff4-49f0-bcdb-ece07bec6f28.png

  • API Server:顾名思义,API Server 处理 API 操作。Kubernetes 中的所有其他组件都连接到 API 服务器。通常,这些组件不会单独相互连接。但是,它们依赖 API 服务器来相互传输消息。

  • 控制器: Kubernetes 附带的控制器监视和管理集群状态。例如,在前面的例子中,容器的自动恢复和自动水平扩展都是由 Kubernetes 中的控制器完成的。

  • 调度器:顾名思义,调度器执行调度。如第一个示例中所述,调度程序根据请求的 CPU 和内存容量将用户提交的容器放置到适当的节点上。

  • etcd:它是一个分布式存储系统,API服务器所需的所有原始信息都存储在etcd中。作为一个高可用系统,etcd 负责保证 Kubernetes 中 master 的所有组件都是高可用的。

API 服务器是一个部署组件,允许在部署结构方面进行横向扩展。此外,控制器代表实现热备份的部署组件。只有一个控制器处于活动状态并具有其相应的调度程序。尽管如此,仍然可以实现热备份。

Kubernetes 架构 - 节点

在 Kubernetes 中,服务负载实际上是由节点承载的,每个服务负载都作为一个 Pod 运行。Pod 的概念将在后面介绍。此外,一个或多个容器正在一个 Pod 中运行。实际运行这些 Pod 的组件称为kubelet,它也是节点上最关键的组件。它从 API 服务器接收所需 Pod 的运行状态,并将运行状态提交给如下图所示的容器运行时组件。

138668550-d28d5580-5b2f-4a56-a4ec-63889294d8ee.png

管理存储和网络对于在操作系统上为容器创建运行环境并最终运行容器或 Pod 至关重要。Kubernetes 不直接执行任何存储或网络操作,而是依赖存储插件或网络插件来完成这些操作。通常,用户或云厂商开发相应的存储插件或网络插件来执行实际的存储或网络操作。

Kubernetes 还包括一个 Kubernetes 网络,它为联网提供服务网络。服务的概念将在后面介绍。真正完成服务联网的组件是**kube-proxy。**它利用 iptables 在 Kubernetes 中建立集群网络。到目前为止,您已经了解了节点上的所有四个组件。在 Kubernetes 中,节点不直接与用户交互,而是依赖于主节点。用户通过主节点将消息传递到节点。在 Kubernetes 中,每个节点都运行上述四个组件。

以下示例演示了这些组件如何在 Kubernetes 架构中相互交互。

138668571-11e49cc1-0b5e-407e-bd58-2653238d42bc.png

用户可以通过 UI 或 CLI 向 Kubernetes 提交 pod 部署请求。此请求首先通过 CLI 或 UI 提交到 Kubernetes 中的 API 服务器。然后,API 服务器将请求信息写入 etcd 存储。最后,调度器通过 API 服务器的监视或通知机制获取这些信息。该信息表明需要调度 pod。

这时候调度器会根据自己的内存状态做出调度决策。完成调度后,向API服务器报告“OK!这个pod需要调度到某个节点”。

API server 收到此报告后,将调度结果写入 etcd。然后,API server 通知对应节点启动 pod。接收到这个通知后,对应节点上的 kubelet 会与容器运行时进行通信,真正开始配置容器和容器的运行环境。此外,kubelet 分别调度存储插件来配置存储和网络插件来配置网络。这个例子展示了这些组件如何相互通信并协同工作以完成 Pod 的调度。


Kubernetes 的核心概念和 API

核心概念

概念 1) Pod

Pod 是 Kubernetes 中最小的调度和资源单元。用户通过Kubernetes的Pod API创建一个Pod,由Kubernetes调度Pod。具体来说,pod 被放置并运行在由 Kubernetes 管理的节点上。简而言之,Pod 是一组容器的抽象,包含一个或多个容器。

如下图所示,pod包含两个容器,每个容器指定其所需的资源大小,比如1GB内存和1个CPU核心,或者0.5GB内存和0.5个CPU核心。

此 Pod 还包含其他所需资源,例如称为卷的存储资源,或 100 GB 或 20 GB 内存。

138668593-5799c1a0-f2a7-4dcd-b8bf-a3529412028d.png

在 pod 中,定义运行容器的方式,例如运行容器的命令或环境变量。Pod 还为其中的容器提供了一个共享的运行环境。在这种情况下,这些容器共享一个网络环境,直接通过localhost相互查找。此外,Pod 之间是相互隔离的。

概念 2)

在 Kubernetes 中,卷用于管理存储并声明 Pod 中容器访问的文件目录。一个卷可以挂载到一个 Pod 中一个或多个容器的指定路径。

卷本身是一个抽象。一个卷支持多种类型的后端存储。比如Kubernetes中的volume就支持很多存储插件。支持本地存储,Ceph、GlusterFS等分布式存储,以及阿里云、AWS、谷歌磁盘等云存储。

138668614-af1c73c2-ec8e-4189-8d82-71b208e74142.png

概念 3) 部署

部署是 Pod 之上的抽象,它定义了一组 Pod 和 Pod 版本的副本数量。通常,这种抽象用于实际管理应用程序,而 Pod 是构成部署的最小单元。在 Kubernetes 中,控制器维护部署中的 Pod 数量,并帮助部署自动恢复失败的 Pod。例如,定义一个包含两个 Pod 的部署。如果一个 Pod 发生故障,相应的控制器会检测到故障并通过创建 Pod 将部署中的 Pod 数量从 1 恢复到 2。Kubernetes 中的控制器还允许我们实施已发布的策略,例如滚动升级、再生升级或版本回滚。

138668631-b95eb485-8eb4-4c4a-9c72-66668b15aa27.png

理念 4) 服务

一项服务为一个或多个 pod 实例提供静态 IP 地址。在前面的示例中,一个部署可能包括两个或多个相同的 Pod。对于外部用户,访问任何 Pod 都是一样的,因此首选负载均衡。为了实现负载均衡,用户希望访问一个静态虚拟 IP(VIP)地址,而不是知道所有 Pod 的具体 IP 地址。如前所述,一个 pod 可能处于终端 go(终止)状态。如果是这种情况,它可能会被一个新的 pod 替换。

对于外部用户,如果提供了多个 Pod 的特定 IP 地址,则该用户需要不断更新 Pod 的 IP 地址。如果 Pod 发生故障然后重新启动,则抽象可能会将对所有 Pod 的访问抽象为第三方 IP 地址。在 Kubernetes 中实现此功能的抽象称为服务。Kubernetes 支持多种服务入口模式,包括 ClusterIP、NodePort 和 LoadBalancer 模式。它还支持使用 kube-proxy 通过网络访问。

138668642-e54fd2b9-e094-4276-a6f9-656350d95d51.png

概念 5) 命名空间

命名空间用于在集群内实现逻辑隔离,涉及到身份验证和资源管理。Kubernetes 中的每个资源,例如 pod、部署和服务,都属于一个命名空间。资源名称在一个命名空间内必须是唯一的,但在不同的命名空间中可以相同。下面描述了命名空间的一个用例。在阿里巴巴,有很多业务部门(BU)。为了在视图级别隔离每个BU,使它们在认证和计算统一设备架构(CUDA)上有所不同,我们将使用命名空间为每个BU提供这样一种视觉隔离机制。

138668658-bfe73dd1-5b39-46fe-b594-3fa485164b5a.png

Kubernetes API

下图描述了 Kubernetes API 的基础知识。从高层的角度来看,Kubernetes API 是基于 HTTP 和 JSON 的。具体来说,用户通过HTTP访问API,访问的API内容为JSON格式。在 Kubernetes 中,kubectl 命令行工具、Kubernetes UI,有时甚至是 curl 用于基于 HTTP 和 JSON 直接与 Kubernetes 通信。在以下示例中,Pod 的 HTTP 访问路径由以下部分组成:API、apiVesion:V1、命名空间、Pod 和 Pod 名称。

138668678-fdd18de5-eacc-47fd-ac97-c4600b6795df.png

相比之下,如果我们提交一个 pod 或者获取一个 pod,那么 pod 的内容是用 JSON 或 YAML 格式表示的。上图显示了一个 YAML 文件示例。在这个 YAML 文件中,pod 的描述由几个部分组成。

一般来说,第一部分是API版本。在本示例中,API 版本为 V1。第二部分是正在处理的资源类型。例如,如果资源的种类是一个 Pod,这个 Pod 的名称就写在元数据中。如果资源类型是Nginx,我们会为其添加一些标签。稍后将描述标签的概念。在元数据中,有时我们也会写注解,从用户的角度额外描述资源。

另一个重要部分是**规范,**它指示 pod 的所需状态。例如,规范显示了需要在 pod 中运行的容器、包含在 pod 中的 Nginx 容器的映像以及暴露端口的 ID。

当我们通过 Kubernetes API 获取该资源时,spec 通常会附带一个名为 status 的项,它表示该资源的当前状态。例如,一个 Pod 可能处于调度、运行或终止状态。终止状态意味着 pod 已经执行。

在描述 API 时,我们提到了一个有趣的元数据元素,称为**“标签”。**标签可以是一组键值对。例如,对于下图中的第一个 Pod,标签可能是红色,表示该 Pod 是红色的。也可以添加其他标签,例如size big,表示size定义为big。此外,还可以添加一组标签。这些标签由选择器查询。事实上,此功能与 SQL 选择语句的功能非常相似。例如,您可以从下图所示的三个 Pod 中进行选择。当颜色被命名为红色时,意味着一个 pod 的颜色是红色,注意只有两个 pod 被选中,因为只有它们的标签表示红色。另一个 pod 的标签说颜色是黄色,说明这个 pod 是黄色的,因此没有被选中。

138668700-5490b350-bee8-44d8-9d67-d4c116e9238b.png

标签允许 Kubernetes API 过滤这些资源。过滤也是在 Kubernetes 中指示资源集合的默认方式。

例如,一个部署可能代表一组 pod,或者是一组 pod 的抽象。这组 pod 是通过使用标签选择器来指示的。如前所述,一项服务对应一个或多个 Pod,以集中方式访问它们。在这个描述中,pods 集也是由标签选择器选择的。

因此,标签是 Kubernetes API 的核心概念。


结论

本文重点介绍Kubernetes的核心概念和架构设计,主要包括以下几点:

  • Kubernetes 是一个自动化的容器编排平台。它负责部署、弹性伸缩和管理基于容器的应用程序。

  • Kubernetes 架构是典型的两层服务器-客户端架构。

二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

90
全部评论 (0)
展开快速发表评论

科技专栏