发布网友 发布时间:2024-09-26 19:09
共1个回答
热心网友 时间:2024-10-06 16:39
优先级调度是Kubernetes中的一种策略,旨在解决集群资源不足时,高优先级Pod无法调度的问题。在Kubernetes 1.8版本之前,新创建的Pod在资源紧张时会一直保持Pending状态,无法调度。为解决此问题,引入了优先级抢占调度策略。该策略允许在资源不足时尝试释放优先级较低的Pod以满足更高优先级Pod的调度需求。此功能自1.11版本作为Beta版本引入,1.14版本后成为正式版本。
调度策略分为两种:驱逐(Eviction)和抢占(Preemption)。驱逐行为由kubelet执行,当节点资源不足时,kubelet会根据优先级驱逐Pod。如果优先级相同,则会驱逐实际使用的资源量超过申请量最大倍数的高耗能Pod。Preemption则是Scheler的行为,当有新Pod创建但无法调度时,调度器会驱逐部分优先级较低的Pod以满足新Pod的需求。
权重是区分Pod优先级的关键因素。通过yaml方式定义PriorityClass,权重越大表示优先级越高。PriorityClass不受命名空间约束,其值不应超过10亿。系统自带的优先级中,没有设置优先级的Pod默认优先级为0,globalDefault属性用于指定给没有设置优先级的Pod使用,系统中只能设置一个globalDefault=true的PriorityClass。description属性用于描述在何时应使用该优先级。
创建PriorityClass时,通过yaml定义。例如,app-priority.yaml文件可能包含特定的权重值、描述等信息。查看系统自带的优先级,例如查看kube-apiserver-master使用的优先级。若未设置优先级,Pod将默认使用优先级0。globalDefault属性确保没有设置优先级的Pod使用统一的优先级。
使用优先级时,可以结合亲和性调度与污点来模拟场景。例如,给node02设置污点,使得Pod无法调度到该节点;在node01上运行带有标签env=pro的Pod,然后创建一个带有优先级app-priority的新Pod,并通过反亲和性设置确保该新Pod不会调度到标签env=pro的Pod所在节点。在这种情况下,由于新Pod的高优先级,系统会尝试驱逐node01上的Pod以满足新Pod的需求。
在实际操作中,创建带有标签env=pro的Pod和带有优先级的Pod,使用yaml文件进行配置。给node02添加污点,模拟不可用节点。创建带有env=pro标签的target-pod,并观察其运行状态。启动priority-pod,同时查看Pod详情,以确认是否正在进行Pod驱逐操作。需要注意的是,新Pod不会立即被调度到节点,调度器只会将抢占者的spec.nominatedNodeName字段设置为被抢占的节点名称。此操作是为了等待下一轮周期决定是否调度到抢占的节点。如果Pod被驱逐,系统将通过DELETE API删除被抢占的Pod,并在优雅停机时长内监控Pod的可调度性。
优先级调度在Kubernetes中虽然不常用,但在资源管理方面提供了一种灵活的机制。了解优先级调度有助于更好地管理和优化集群资源使用,确保关键任务的Pod能够得到优先调度。同时,关注Pod控制器的介绍,将有助于更全面地理解Kubernetes的资源调度机制。