Kubernetes 采用了客户端-服务器的架构模式。它由主节点和工作节点组成,其中主节点通常安装在单个 Linux 系统上,而工作节点则分布在众多的 Linux 工作站上。主节点包含了诸如 API 服务器、控制器管理器、调度器以及用于状态存储的 etcd 数据库 等组件。而在节点侧,则包含用于与主节点通信的 kubelet、负责网络管理的 kube-proxy,以及像 Docker 这样用于管理容器的容器运行时。
Kubernetes 组件
Kubernetes 由许多组件构成,每个组件都在整体系统中扮演着特定的角色。我们可以将这些组件分为两类:
- 节点: 每个 Kubernetes 集群 至少需要一个工作节点,这些节点是由一组工作机器组成的,我们的容器将最终部署在这些节点上。
- 控制平面: 所有的工作节点以及运行在它们内部的 Pod 都将处于控制平面的管理之下。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20260116152515676513/frame3114.webp">frame3114Kubernetes 架构图
控制平面组件
控制平面本质上是多种组件的集合,帮助我们管理集群的整体健康状况。例如,当我们想要建立新的 Pod、销毁 Pod 或扩容 Pod 时,都需要依赖它。基本上,控制平面上运行着 4 个核心服务:
1. Kube-API 服务器
API 服务器是 Kubernetes 控制平面的一个组件,主要负责暴露 Kubernetes API。它就像是集群的初始网关,监听通过 CLI(如 Kubectl)发出的更新或查询指令。Kubectl 与 API 服务器通信,告知它需要执行的操作,例如创建或删除 Pod。它也充当着“守门员”的角色。它通常会验证接收到的请求,然后将其转发给其他进程。没有任何请求可以直接传递给集群,所有请求都必须经过 API 服务器。
2. Kube-Scheduler(调度器)
当 API 服务器收到关于调度 Pod 的请求时,会将该请求传递给调度器。它会通过智能决策来决定将 Pod 调度到哪个节点上,以实现集群效率的最优化。
3. Kube-Controller-Manager(控制器管理器)
kube-controller-manager 负责运行处理集群控制循环各个方面的控制器。这些控制器包括:
- 副本控制器:确保特定应用正在运行所需数量的副本。
- 节点控制器:根据节点的当前状态,确保节点被正确标记为“就绪”或“未就绪”。
4. etcd
它是集群的键值存储数据库。集群的状态变更都会存储在 etcd 中。它被视为集群的“大脑”,因为它向调度器和其他进程通报哪些资源是可用的,以及集群状态发生了什么变化。
工作节点组件
这些节点是实际工作发生的地方。每个节点可以承载多个 Pod,而 Pod 内部运行着容器。每个节点中有 3 个进程,用于调度和管理这些 Pod。
以下是节点相关的一些组件:
1. Container Runtime(容器运行时)
容器运行时 是负责在节点上运行容器的软件。它执行属于 Pod 的应用程序容器,并管理它们的生命周期。流行的容器运行时包括 Docker、containerd 和 CRI-O。
2. kubelet
kubelet 是运行在每个 Kubernetes 节点上的代理。它与 容器运行时 和 Kubernetes 控制平面 进行通信,以确保 Pod 中的容器按规范运行。kubelet 监控 Pod 的状态,向 API 服务器报告节点和 Pod 的状态,并确保维护所需的容器配置。
3. kube-proxy
kube-proxy 运行在每个节点上,负责管理 Pod 的网络通信。它通过维护网络规则来实现 Kubernetes 的 服务,允许 Pod 之间以及与外部客户端之间进行通信。Kube-proxy 可以通过 iptables 或 IPVS 处理流量,从而实现跨 Pod 的服务发现和负载均衡。
插件
Kubernetes 插件是用来增强集群功能的组件,它们通常作为 Kubernetes 资源(如 DaemonSets、Deployments 等)进行安装。这些插件通常部署在 kube-system 命名空间内,提供集群级别的功能并扩展 Kubernetes 的原生特性。