这是关于 Kubernetes 设计的一个问题,我没有具体的技术问题需要解决,但我试图理解其一些架构背后的想法。
我所见过的有关 Kubernetes 控制平面的所有解释都提到它由以下内容组成:
- 控制器管理器
- 调度程序
(还有其他成分,但对于这个问题来说并不重要)
据我所知,控制器管理器是一个辅助进程,出于性能原因将多个控制器组合在一起。它监视 API 服务器,并具有一些状态机,即共享通知器,这实际上允许许多控制器共享相对昂贵的 API 服务器监视,并保证某种形式的一致性,因为它们都在同一个操作系统进程中运行。
如果我理解正确的话,调度程序本身也是一个控制器,其目标是将一个分配nodeName
给 pod,以便 kubelet 拾取并运行它们。
现在,我还没能找到的是为什么调度程序作为单独的进程运行。是否可以制作一个作为控制器管理器的一部分运行的调度程序?如果可以,为什么不默认将其作为后者的一部分?
答案1
根据这位官员的说法文档,Kubernetes 集群由 Kubernetes Master 管理,它还运行 API Server、Controller Manager、Scheduler 和 etcd 组件。
集群中的任何机器都可以运行控制平面组件。另一方面,安装脚本通常运行用户容器,但为了简单起见,不会在同一台机器上启动所有控制平面组件。有关在多台机器上运行的控制平面设置的示例,请参阅 Kubernetes 组件使用 kubeadm 创建高可用性集群。
控制平面组件,用于监视未分配节点的新创建的 Pod,并选择一个节点供它们运行。调度决策考虑的因素包括:个人和集体资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间干扰和截止期限。
运行控制器进程的控制平面组件。
从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件并在单个进程中运行。
这些控制器的一些类型是:
节点控制器:负责通知节点发生故障并做出响应。
作业控制器:监视代表一次性任务的作业对象,然后创建 Pod 来运行这些任务直至完成。
EndpointSlice 控制器:填充 EndpointSlice 对象(以提供服务和 Pod 之间的链接)。
ServiceAccount 控制器:为新的命名空间创建默认的 ServiceAccount。
控制管理器负责在节点发生故障时通知并做出响应,而调度程序则负责监视未分配节点的新创建的 Pod。对于调度程序发现的每个 Pod,调度程序负责为该 Pod 找到最佳运行节点。
因此,Kubernetes 调度程序与控制器管理器是分开的,请参阅此文档更多信息由 Jorge Acetozi 撰写
答案2
调度程序和控制管理器是独立的组件,它们具有不同的职责和要求。
由于某些原因,它们被分开:
1- 职责分离:职责不同使得它们不应该紧密耦合。调度器负责调度工作负载,而控制器管理器负责管理各种控制器,以确保集群保持所需的状态。通过将这些职责分开,可以更轻松地独立维护和升级每个组件。
可扩展性:调度器需要能够高效、快速地调度工作负载,而控制器管理器需要能够管理大量的控制器
灵活性:将调度程序和控制器管理器分开可以为设计和实现新功能提供更大的灵活性。