本篇文章分享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.requests和resources.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. 抢占的触发
优先级设置:Pod 的优先级由 PriorityClass
控制。PriorityClass 是一个 API 资源,定义了 Pod 的优先级。Pod 的优先级越高,被调度的优先级越高,且越有可能触发抢占。PreemptionPolicy:抢占策略由 Pod 的 preemptionPolicy 字段定义,常见的设置包括:
PreemptLowerPriority
:默认设置,允许高优先级 Pod 抢占低优先级 Pod。DoNotPreempt
:禁止抢占,Pod 只能在资源可用时调度,不会抢占其他 Pod。
2.2.2. 抢占过程
资源紧张:当集群的资源(如 CPU、内存)不足时,调度器会评估哪些 Pod 可能被驱逐。 驱逐低优先级 Pod:调度器会选择优先级低的、符合资源释放条件的 Pod 驱逐。被驱逐的 Pod 状态会变为 Evicted,并重新进入调度队列。 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 | |
2 | |
3 |
4 | |
5 | |
6 |