一、优先级与抢占机制
Kube-scheduler 在调度过程中,每次从调度队列(SchedulingQueue)中取出 Pod,进行一轮调度。那么调度队列中的 Pod 是按照什么顺序入队的呢?Pod 资源对象支持设置优先级(Priority)属性,通过优先级的不同,将优先级高的 Pod 放在调度队列的前面,优先进行调度。如果优先级高的 Pod 调度失败,没有找到合适的节点时,会放入无法调度队列(UnschedulableQueue)中,进入抢占阶段,在下次调度时将节点上优先级低的 Pod 驱逐。
如何为 Pod 设置优先级呢?通过创建 PriorityClass 资源对象即可:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: ""
在 pod 中使用 PriorityClass :
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx-a
name: nginx-a
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: nginx-a
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
memory: "64Mi"
cpu: 5
limits:
memory: "128Mi"
cpu: 5
priorityClassName: high-priority
Kubernetes 1.19 中使用了 Scheduling Framework,调度算法采用了插件的形式引入,例如调度开始前在对 Pod 进行优先级排列时,就使用了队列排序插件(QueueSortPlugin)