22、架构-资源与调度

发布于:2024-06-21 ⋅ 阅读:(25) ⋅ 点赞:(0)

1、资源与调度

调度是容器编排系统最核心的功能之一,“编排”一词本身便包 含“调度”的含义。调度是指为新创建的Pod找到一个最恰当的宿主机 节点来运行它,这个过程成功与否、结果恰当与否,关键取决于容器 编排系统是如何管理与分配集群节点的资源的。可以认为调度是必须 以容器编排系统的资源管控为前提,那我们就先从Kubernetes的资源 模型谈起。

2、资源

在Kubernetes中,资源是一个广义的概念,涵盖了系统中所有能够接触到的方方面面。广义上,Kubernetes系统中的资源包括工作负荷(如Pod、ReplicaSet、Service等)、存储(如Volume、PersistentVolume、Secret等)、策略(如SecurityContext、ResourceQuota、LimitRange等)、身份(如ServiceAccount、Role、ClusterRole等)。这种“一切皆为资源”的设计使得Kubernetes能够顺利实施声明式API,为系统建立了一套囊括抽象元素和物理元素的领域特定语言。通过不同层级间资源的使用

资源模型

资源模型是Kubernetes设计的核心之一。在Kubernetes中,资源被广泛抽象化,涵盖了系统中的所有组件。这些资源不仅包括物理资源(如处理器、内存、存储等),还包括逻辑资源(如工作负载、策略、身份等)。这种设计使得Kubernetes能够通过声明式API进行管理,实现了灵活的资源调度和管理。

物理资源

物理资源包括处理器、内存、磁盘存储等,这些资源直接与底层硬件相对应。

  • 计算资源:包括处理器(CPU)和内存。处理器资源被称为可压缩资源(Compressible Resource),当处理器资源不足时,Pod的运行速度会变慢,但不会被系统直接终止。内存资源则被称为不可压缩资源(Incompressible Resource),当内存资源不足时,Pod会因为内存溢出(Out-Of-Memory, OOM)而被系统直接终止。

  • 存储资源:包括各种类型的磁盘存储,如本地磁盘、NFS、云存储等。这些资源在Kubernetes中通过Volume进行管理和使用。

  • 网络资源:包括网络带宽和网络地址。这些资源通常用于确保Pod之间以及Pod与外部系统之间的网络通信。

资源供需关系

在Kubernetes的资源模型中,Node是资源的提供者,而Pod是资源的使用者。调度的核心任务就是将Pod与合适的Node进行匹配。

  • Node:每个Node提供一定数量的计算资源、存储资源和网络资源。这些资源通过Node对象进行描述和管理。

  • Pod:Pod是Kubernetes中最小的调度单元,一个Pod可以包含一个或多个容器。Pod通过声明其所需的资源(如CPU、内存)与Node的资源进行匹配。调度器根据Pod的资源需求和Node的资源状况,选择最合适的Node来运行Pod。

3、服务质量与优先级

Kubernetes中的服务质量(Quality of Service, QoS)和优先级机制,用于管理资源分配和使用,确保关键任务能够获得足够的资源。

服务质量分类

Kubernetes将Pod的服务质量分为三类:Guaranteed、Burstable和BestEffort。这三类服务质量对应不同的资源分配策略。

  • Guaranteed:当Pod的所有容器都指定了相同的CPU和内存请求值和限制值时,该Pod被分类为Guaranteed。这类Pod具有最高的优先级,能够确保获得其请求的所有资源。

  • Burstable:当Pod的容器指定了请求值,但没有指定限制值时,该Pod被分类为Burstable。这类Pod在资源充足时能够获得更多资源,但在资源紧张时,可能会被系统限制其资源使用。

  • BestEffort:当Pod的所有容器都没有指定CPU和内存请求值时,该Pod被分类为BestEffort。这类Pod具有最低的优先级,只能在资源充足时获得资源。

优先级与抢占

优先级和抢占机制用于确保高优先级的Pod能够获得必要的资源。

  • Pod优先级:每个Pod可以设置一个优先级,表示其相对重要性。调度器在选择节点时,会优先考虑高优先级的Pod。

  • 抢占机制:当高优先级Pod无法找到合适的节点时,调度器会尝试通过抢占低优先级Pod的资源来满足高优先级Pod的需求。被抢占的Pod会被终止,释放其占用的资源。

驱逐机制

驱逐机制是Kubernetes确保系统稳定性和性能的重要手段。当节点资源紧张或Pod运行状态异常时,系统会驱逐一些Pod,以释放资源和恢复正常运行。

4、 节点压力驱逐

当节点的资源(如CPU、内存)使用达到阈值时,Kubernetes会驱逐部分Pod,以缓解节点压力。

  • 内存压力驱逐:当节点内存不足时,系统会优先驱逐BestEffort和Burstable Pod,以释放内存资源。Guaranteed Pod通常不会被驱逐,除非所有其他Pod都被驱逐后,仍无法缓解内存压力。

  • 磁盘压力驱逐:当节点的磁盘使用达到阈值时,系统会驱逐Pod,以释放磁盘空间。被驱逐的Pod通常是那些使用大量临时存储的Pod。

Pod状态驱逐

当Pod运行状态异常时,Kubernetes也会驱逐这些Pod,以确保系统的整体健康。

  • 健康检查:Kubernetes通过liveness probe和readiness probe对Pod进行健康检查。当Pod的健康检查失败时,系统会将其标记为不健康,并可能将其驱逐。

 默认调度器

Kubernetes的默认调度器是Pod调度的核心组件,负责将新创建的Pod分配到合适的节点上运行。

调度算法

默认调度器使用一组算法来确定Pod的最佳运行节点。这些算法分为两类:Predicate算法和Priority算法。

  • Predicate算法:用于筛选符合Pod资源需求的节点。常见的Predicate算法包括检查节点的可用资源、节点端口冲突、节点亲和性等。

  • Priority算法:用于在符合条件的节点中选择最佳节点。常见的Priority算法包括LeastRequestedPriority(选择资源使用最少的节点)、BalancedResourceAllocation(选择资源分配最均衡的节点)等。

 调度流程

默认调度器的调度流程包括以下步骤:

  1. 接收调度请求:当新Pod创建时,调度器接收调度请求,并将Pod加入调度队列。
  2. 节点筛选:使用Predicate算法筛选出符合Pod资源需求的节点。
  3. 节点打分:使用Priority算法对筛选出的节点进行打分,并选择得分最高的节点。
  4. 绑定节点:将Pod绑定到选定的节点上,通知kubelet在该节点上创建Pod。

调度性能优化

在大规模集群中,调度性能是一个关键问题。Kubernetes通过以下机制来优化调度性能:

  • 调度缓存:调度器维护一个调度缓存,记录所有节点的资源使用情况,避免频繁的远程调用,提高调度效率。

  • 状态共享的双循环调度机制:Kubernetes采用Informer Loop和Scheduler Loop两个控制循环,分别负责监控资源变化和执行调度任务,确保调度器能够实时响应集群状态的变化。

总结

第十四章详细介绍了Kubernetes的资源模型、服务质量与优先级、驱逐机制和默认调度器。这些机制共同构成了Kubernetes高效、灵活的资源调度体系,确保了集群的稳定性和性能。通过对物理资源的精细管理和调度算法的优化,Kubernetes能够在大规模集群中高效运行,满足各种复杂应用的需求。