深入理解Kubernetes的Pod调度、抢占和驱逐

科技   2024-11-27 07:30   广东  


本篇文章分享Pod的调度、抢占和驱逐的相关概念,基本都是理论,但非常重要,经常在面试中被问到。希望能耐心看完!

Kubernetes(K8s)作为一个容器编排平台,其调度(Scheduling)、抢占(Preemption)和驱逐(Eviction)机制是确保集群资源合理分配、高效使用并保证应用健康运行的关键部分。

调度(scheduling)指的是确保 Pod 匹配到合适的节点, 以便 kubelet 能够运行它们。

抢占(Preemption)指的是终止低优先级的 Pod 以便高优先级的 Pod 可以调度到 Node 上的过程。

驱逐(Eviction)是在资源匮乏的节点上,主动让一个或多个 Pod 失效的过程。

接下来将详细介绍这三个概念:

1. 调度(Scheduling)

1.1. 调度概述

调度器通过 Kubernetes 的监测(Watch)机制来发现集群中新创建且尚未被调度到节点上的 Pod。调度的主要任务是将Pod分配到集群中的合适的节点上。调度器根据Pod的需求(如CPU、内存、存储等)和节点的资源状况(如可用CPU、内存、节点标签等)来决定Pod部署在哪个节点上。

1.2 调度过程

Kubernetes调度过程主要包括以下步骤:

1、资源需求每个Pod可以声明它对资源的需求,如CPU、内存等。这些信息由resources.requestsresources.limits字段描述。

2、节点筛选调度器会根据Pod的资源需求以及节点的资源状况来筛选合适的节点。筛选是通过一系列的调度策略(如节点的可用资源、Pod的亲和性和反亲和性等)来进行的。

3、节点优选一旦节点被筛选出来,调度器将评估每个节点的优劣。优选是基于一组优先级策略(例如,Pod亲和性、负载均衡、Pod优先级等)。

4、Pod调度调度器最终会选择一个最佳节点,并将Pod调度到该节点上。Pod在被调度之前,状态是Pending,调度后它的状态变为Running。

1.3. 调度策略

Kubernetes调度器默认采用的是kube-scheduler, 以下是最常用的调度策略

  • Pod亲和性和反亲和性定义Pod是否应该与特定的Pod运行在同一节点上。
  • 优先级和抢占Pod可以设置优先级,较高优先级的Pod可以抢占低优先级Pod的资源。
  • Taints和Tolerations:节点可以有Taints,Pod可以设置Tolerations,如果Pod不容忍节点的Taint,它就不能被调度到该节点上。
  • Resource Limits控制Pod在节点上分配的资源,避免资源超载。

2. 抢占(Preemption)

2.1. 抢占概述

抢占机制是Kubernetes中用于保证高优先级Pod能够在资源不足时“抢占”低优先级Pod的资源,从而确保关键任务的运行。抢占的目标是保证高优先级的Pod能够优先调度到集群中的节点。

2.2. 抢占机制工作原理

抢占机制发生的条件是:

  • 高优先级 Pod 请求调度时,当前没有足够的资源

  • 集群资源不足时,调度器会查找那些资源消耗较大的、优先级较低的 Pod,并尝试将其驱逐,以便为高优先级 Pod 腾出空间。

2.2.1. 抢占的触发

  1. 优先级设置:Pod 的优先级由 PriorityClass 控制。PriorityClass 是一个 API 资源,定义了 Pod 的优先级。Pod 的优先级越高,被调度的优先级越高,且越有可能触发抢占。
  2. PreemptionPolicy:抢占策略由 Pod 的 preemptionPolicy 字段定义,常见的设置包括:
  • PreemptLowerPriority:默认设置,允许高优先级 Pod 抢占低优先级 Pod。
  • DoNotPreempt:禁止抢占,Pod 只能在资源可用时调度,不会抢占其他 Pod。

2.2.2. 抢占过程

  1. 资源紧张:当集群的资源(如 CPU、内存)不足时,调度器会评估哪些 Pod 可能被驱逐。
  2. 驱逐低优先级 Pod:调度器会选择优先级低的、符合资源释放条件的 Pod 驱逐。被驱逐的 Pod 状态会变为 Evicted,并重新进入调度队列。
  3. Pod 重新调度:驱逐后的低优先级 Pod 会被调度器重新调度到其他节点上,前提是有足够资源。

2.3. 抢占对调度的影响

  • 高优先级任务的保障:通过抢占机制,Kubernetes 能够确保关键任务(如高优先级应用)能够及时获得资源。
  • 抢占和驱逐的区别:抢占通常指的是调度器主动将低优先级的 Pod 从节点上移除,而驱逐是在节点资源压力过大或 Pod 不健康时,由 Kubernetes 自动触发的操作。

3. 驱逐(Eviction)

3.1. 驱逐概述

驱逐是指Kubernetes将运行中的Pod从节点上强制移除,通常是因为节点资源不足(如CPU、内存不足)或者Pod违反了某些限制(如超出资源配额)。

3.2. 驱逐的触发条件

  • 资源压力:当节点的资源(如内存、CPU)达到某个阈值时,Kubernetes会尝试通过驱逐Pod来释放资源。特别是在节点内存压力较大时,Kubernetes会优先驱逐使用大量内存的Pod。
  • 节点资源的超限:节点上的资源消耗达到配置的阈值时,Kubernetes会进行Pod驱逐以恢复节点的资源平衡。驱逐会遵循一定的优先级策略,通常低优先级、非持久化Pod(如ephemeral类型)会被优先驱逐。
  • Pod的liveness或readiness探针失败:如果Pod的健康检查失败,Kubernetes会将其驱逐,并且尝试重新调度到其他节点。
  • OOM(Out of Memory)杀死Pod:当节点上的内存不足时,操作系统可能会触发OOM Killer(操作系统的内存回收机制)杀死部分进程,Kubernetes则会根据OOM事件驱逐相关的Pod。

3.3. 驱逐策略

Kubernetes中的驱逐策略有两种类型:

  • 优先驱逐策略:优先驱逐高资源消耗的Pod(如内存占用高的Pod),并且通常会优先驱逐低优先级的Pod。
  • 优先级驱逐:如果Pod的优先级较低,Kubernetes会优先考虑驱逐这些Pod,从而确保高优先级Pod能够获得资源。

3.4. 驱逐过程

1、驱逐请求:当节点的资源压力增大时,Kubernetes会评估当前节点上所有Pod的资源使用情况。

2、Pod选择:Kubernetes会根据Pod的优先级、资源使用量、Pod的类型(如持久性或临时性)来选择哪些Pod需要被驱逐。

3、驱逐Pod:一旦Pod被选择驱逐,Kubernetes会通过API向该Pod发出驱逐命令,通知调度器将其从节点上移除。

3.5. 驱逐的影响

  • Pod重新调度:被驱逐的Pod会被重新调度到其他节点上,前提是集群中有足够的资源。
  • Pod的生命周期:Pod被驱逐后,会进入Pending状态,然后调度器会尝试根据集群的资源状况将其调度到其他节点。

4. 调度、抢占和驱逐的交互

调度、抢占和驱逐之间存在紧密的联系,它们共同决定了Pod在集群中的运行和资源分配。调度器不仅负责Pod的初始调度,还会根据Pod的优先级、资源需求以及集群的负载情况,在运行过程中做出合理的资源分配决策。

4.1 调度与抢占

调度器在初次调度时可能会考虑抢占机制(特别是当资源紧张时)。如果集群资源不足,优先级较高的Pod会抢占低优先级Pod的资源。

4.2 驱逐与抢占

抢占机制和驱逐机制有些相似。驱逐是节点资源压力下自动发生的,而抢占是通过调度器主动发起的。

在资源紧张时,抢占和驱逐可以结合使用,通过优先级调整、驱逐低优先级Pod来保证高优先级Pod的运行。

4.3 调度和驱逐

调度器也需要在节点资源变动时(如节点资源不足或发生故障时)做出决策。如果Pod运行在一个资源即将耗尽的节点上,调度器可能会选择将Pod重新调度到一个资源充足的节点。


理解这三个机制如何协同工作,有助于更好地管理Kubernetes集群,优化资源分配,并确保高优先级应用能够在集群中正常运行。



欢迎转发点亮下方“在看”图标让更多的人看到

END


往期推荐


1

万字长文:K8S命令详解汇总【自用珍藏版】

2

安装部署K8S集群环境(实测有效版本)

3

K8S重要概念区分:Ingress 和 Service 的异同点

4

Linux的150个常用命令汇总,运维大神不一定全部掌握!

5

【Docker系列知识】常用命令大全汇总

6


运维李哥不背锅
专注于各种运维技术、,分享Linux基础知识,服务器,数据库,云原生和网络安全等相关技术,各种进阶知识等着你,助你成为技术达人!
 最新文章