Kubernetes 内部原理:架构

开发 架构
控制平面是 Kubernetes 集群的“大脑”,它协调和编排各种组件,以确保系统的期望状态得以实现和维护。

在本文中,我们将深入探讨 Kubernetes 架构,并探讨其关键组件。

一个 Kubernetes 集群由两个主要组件组成:

  • 控制平面节点
  • 工作节点

控制平面

控制平面是 Kubernetes 集群的“大脑”,它协调和编排各种组件,以确保系统的期望状态得以实现和维护。控制平面进一步包括以下组件:

1. Kube-API 服务器

API 服务器是控制平面的中央管理点,它暴露 Kubernetes API,客户端可以使用该 API 与集群进行交互。因此,当我们使用 kubectl 管理集群时,实际上是通过 HTTP REST API 与 API 服务器进行通信。kube-api 服务器负责以下任务:

  • API 管理:公开集群 API 端点并处理所有 API 请求。
  • 身份验证(使用客户端证书、令牌和 HTTP 基本身份验证)和授权(ABAC 和 RBAC 评估)。
  • 处理 API 对象(如 pod、service 等)的API 请求和数据验证。
  • 与 etcd 通信以存储状态和配置。
  • API 服务器协调控制平面和工作节点组件之间的所有进程。

2. etcd

etcd 是 Kubernetes 使用的分布式键值存储,用于存储集群的配置数据和资源的期望状态。Kube-API 服务器使用 etcd 的观察功能来跟踪对象状态的更改。它是控制平面中的唯一有状态组件,负责以下任务:

  • 作为集群的唯一真相来源,确保一致性和数据持久性。
  • 充当后端服务发现和数据库。
  • 存储 Kubernetes 对象(如 pod、secret、daemon set、deployment、config map、stateful set 等)的所有配置、状态和元数据。
  • 在键值对格式的 /registry 目录键下存储所有对象。例如,在默认命名空间下名为 Nginx 的 pod 的信息可以在 /registry/pods/default/nginx 下找到。

3. Kube-scheduler

Kube-scheduler 负责在工作节点上调度 pod。当我们创建一个 pod 并将其提交到 API 服务器时,调度程序会自动获取 pod,根据可用资源和调度规则评估节点,并将 pod 分配给适当的节点。

  • 根据约束和可用资源确定每个 pod 在调度队列中的有效放置节点。
  • 然后,调度程序对每个有效节点进行排名,并将 pod 绑定到合适的节点。集群中可以使用多个不同的调度程序;kube-scheduler 是参考实现。
  • 当我们部署一个 pod 时,我们指定了 pod 的要求,如CPU、内存、亲和性、污点或容忍性、优先级、持久卷等。
  • Kubernetes 允许用户使用自定义调度程序配置来开发自己的自定义调度程序。

4. Kube Controller 管理器

kube-controller-manager 是一个关键组件,运行着负责维护集群的期望状态和管理系统不同方面的各种控制器。

每个控制器关注于集群管理的特定领域,自动化任务,确保资源的实际状态与期望状态相匹配。

以下是重要的内置 Kubernetes 控制器列表:

  • Node Controller:负责监控集群中的节点状态。它会检测节点故障并启动操作以替换失败的节点或将 pod 重新调度到健康的节点。
  • Replication Controller:确保 pod 的指定副本数始终运行。根据需要创建或终止 pod 以维护所需的副本计数。
  • Deployment Controller:扩展了 Replication Controller 的功能,允许您以声明性方式定义和管理应用程序部署。它支持滚动更新、回滚和扩展。
  • StatefulSet Controller:通过确保稳定和有序的扩展和升级,管理有状态应用程序。它为每个 pod 分配唯一的网络标识,并在重新调度时保持其标识。
  • **Daemon

Set Controller**:确保在所有或一部分节点上运行特定 pod 的副本。通常用于任务,如节点监视代理或网络组件。

  • Job Controller:管理批处理作业,确保特定任务或作业的完成次数达到了指定的要求。
  • CronJob Controller:允许您使用类似于 cron 的语法在指定间隔内调度任务。它根据定义的计划创建作业。
  • Namespace Controller:确保集群中的每个命名空间都具有一组相应的资源,并强制资源隔离。
  • Service Account 和 Token Controller:自动为命名空间中的 pod 创建默认帐户和访问令牌。
  • Service Controller:监视服务和端点,并根据创建、删除或重新调度 pod 的情况更新它们。
  • Endpoint Controller:维护 endpoint 对象,根据标签选择器将服务与 pod 匹配。

5. 云控制器管理器 (CCM)

当 Kubernetes 部署在云环境中时,云控制器管理器充当 Kubernetes 集群和云平台 API 之间的桥梁。它管理 Kubernetes 使用的云特定资源的生命周期。

(1)它从主 Kubernetes 控制平面中卸载了云特定的控制循环和功能,减少了其复杂性,使其更易于维护和扩展。

(2)它托管各种云特定控制器,负责管理特定于云提供商的资源。这些控制器包括:

  • Node Controller:管理 Kubernetes 节点与云实例之间的交互,处理节点的生命周期操作,如创建、删除和调整大小。
  • Route Controller:处理服务的云特定网络配置,例如创建负载均衡器或管理 IP 地址。
  • Volume Controller:与云存储服务集成,以云特定方式提供和管理持久卷。
  • Service Controller:与云提供商的负载均衡器服务互动,以创建、管理和更新 Kubernetes 服务的负载均衡器。

(3)CCM 管理云资源,确保它们与 Kubernetes 资源定义的期望状态相匹配。例如,它可能根据缩放要求创建或释放云实例。

(4)它与云提供商的 API 进行通信,执行操作,例如创建实例、配置网络、管理存储资源等。

(5)它确保适当管理安全设置和凭据,与云服务交互时进行管理。

工作节点

工作节点负责运行容器化应用程序。它包括以下组件。

  • kubelet
  • kube-proxy
  • 容器运行时

1. Kubelet

Kubelet 是 Kubernetes 控制平面和节点上运行的容器之间的关键桥梁,确保集群的期望状态得以实现和维护。

它在集群中的每个节点上运行一个代理组件,以将节点的状态和资源利用率报告给 Kubernetes 控制平面。它不以容器形式运行,而是由 systemd 管理的守护程序。

以下是 kubelet 的主要功能和职责:

  • 节点代理:kubelet 充当每个节点上的代理,将节点的状态和容器的健康状况报告给 Kubernetes 控制平面。
  • 健康监控:kubelet 连续监控 pod 中的容器的健康状况。如果容器崩溃或变得不健康,kubelet 会采取适当的措施,如重新启动容器或整个 pod。
  • Pod 管理:kubelet 管理节点上 pod 的状态。它确保根据从 Kubernetes API 服务器接收的 pod 定义,指定的 pod 正在运行且健康。
  • Pod 网络:kubelet 与网络插件协作,为节点上的 pod 设置网络。它为 pod 分配 IP 地址,并确保容器可以相互通信以及与外部世界通信。
  • 卷管理:kubelet 管理 pod 定义中指定的卷,根据需要附加和分离卷。它确保数据持久性并允许容器访问共享存储。
  • 资源管理:kubelet 强制执行 pod 定义中指定的资源约束,确保容器不会超出分配的 CPU 和内存限制。它还处理对 CPU 和内存等资源的请求。
  • 驱逐和清理:当节点上的资源变得稀缺时,kubelet 可以根据预定义的策略从 pod 中驱逐 pod,以释放资源。它还在 pod 终止时清理任何剩余的资源。
  • 节点注册:kubelet 向 Kubernetes 控制平面注册节点,使控制平面能够知道可用于调度 pod 的节点。

2. Kube 代理

Kube 代理,即 Kubernetes 代理,是运行在 Kubernetes 集群中每个节点上的网络代理。其主要功能是管理 pod 和服务之间的网络通信,为容器化应用程序提供可靠和一致的网络环境。它负责以下任务:

  • 服务发现:Kube 代理负责在集群内启用服务发现。它根据服务规范中定义的标签和选择器,维护网络规则,将请求从服务转发到适当的 pod。
  • 负载均衡:Kube 代理为具有多个副本或实例的服务实施负载均衡。它将传入请求分发给与服务的选择条件相匹配的可用 pod。
  • 网络地址转换(NAT):Kube 代理对出站流量执行网络地址转换(NAT)。这确保来自 pod 的流量看起来是从主机的 IP 地址发出的,从而允许外部系统正确响应。
  • ClusterIP 服务:对于 ClusterIP 服务(仅在集群内部可访问),Kube 代理设置 IPTables 规则,将流量转发到根据其标签选择器匹配的正确 pod。
  • NodePort 服务:Kube 代理配置主机的防火墙,以将传入流量转发到 NodePort 服务的适当 pod。这允许使用每个节点上的静态端口外部访问服务。
  • 高可用性:Kube 代理致力于确保服务的高可用性。如果 pod 不可用或添加/删除了,Kube 代理会自动更新网络配置以正确路由流量。
  • 健康检查:Kube 代理监视与服务相关的端点和 pod 的健康状况。如果 pod 变得不健康,Kube 代理停止转发流量。

3. 容器运行时

容器运行时环境负责根据 pod 规范创建、启动、停止和管理容器。

一些常用的 Kubernetes 容器运行时包括 Docker、containerd、CRI-O、rkt(发音为 "rocket")等。

  • 容器管理:容器运行时环境负责根据 pod 定义创建、启动、停止和管理容器。
  • 镜像管理:它根据 pod 定义中指定的镜像引用从容器仓库(如 Docker Hub、Google Container Registry 等)拉取容器镜像。
  • 资源隔离和管理:运行时环境确保容器根据其 pod 配置中指定的 CPU、内存和其他资源拥有适当的资源级别。
  • 网络和通信:它设置容器的网络,确保它们可以相互通信以及与集群内外的服务通信。这可能涉及配置网络命名空间、IP 地址和端口映射。
  • 容器安全性:运行时环境通过强制容器之间的隔离,防止它们访问彼此的文件系统或资源。它还可能实施其他安全措施,如 AppArmor 或 SELinux。
  • 卷和存储管理:运行时环境管理附加到容器的卷,确保数据持久性并允许容器访问共享存储。
  • 生命周期管理:它处理容器的完整生命周期,包括启动、停止、重启和清理容器。
  • 健康监控和重启:运行时环境监视容器的健康状况,并可以自动重启崩溃或变得不健康的容器。
  • 与硬件和内核的交互:运行时环境与主机操作系统的内核进行交互,管理容器资源使用、网络命名空间、进程隔离和其他低级操作。

Kubernetes 的架构促进了分布式微服务导向的方法,使开发人员可以专注于应用程序逻辑,而平台负责部署、扩展和负载均衡。

无论是在本地、云中还是混合环境中,Kubernetes 的架构使组织能够高效地管理复杂的容器化工作负载,同时秉承模块化、抽象和自动化的原则。

责任编辑:赵宁宁 来源: 小技术君
相关推荐

2019-12-06 11:18:07

LinuxCPU架构

2009-09-14 10:35:15

Linq内部执行原理

2022-07-03 13:58:53

YAMLKubernetes容器

2017-02-27 09:21:23

Kubernetes架构service

2021-01-12 14:46:34

Kubernetes开发存储

2023-04-17 08:13:13

KubernetesPod

2023-09-27 12:22:50

Kafka架构

2023-06-07 15:25:19

Kafka版本日志

2011-10-08 14:09:27

JavaScript

2022-09-05 08:39:04

kubernetesk8s

2018-07-27 10:39:13

对象存储Git

2022-07-14 08:02:57

Netty网络模块

2022-07-14 14:18:59

Kubernetes架构

2023-11-01 14:49:07

2010-02-04 11:06:14

2020-05-19 21:40:35

Tomcat架构Connector

2023-09-07 23:59:44

网络Kubernetes局域网

2020-03-12 11:29:51

JavaScript浏览器语言

2016-09-02 12:34:52

2020-03-05 16:47:51

Git内部储存
点赞
收藏

51CTO技术栈公众号