介绍
Pod 可以有优先级。 优先级表示一个 Pod 相对于其他 Pod 的重要性。 如果一个 Pod 无法被调度,调度程序会尝试抢占(驱逐)较低优先级的 Pod, 使新的 Pod 可以被调度。
在一个并非所有用户都是可信的集群中,恶意用户可能以最高优先级创建 Pod, 导致其他 Pod 被驱逐或者无法被调度。 管理员可以使用 ResourceQuota 来阻止用户创建高优先级的 Pod。
优先级与抢占
优先级是什么?
优先级代表一个Pod相对其他Pod的重要性
优先级有什么用
优先级可以保证重要的Pod被调用运行
如何使用优先级和抢占
- 配置优先级类PriorityClass
- 创建Pod是为其设置对应的优先级
PriorityClass
PriorityClass是一个全局资源对象,它定义了从优先级类名称到优先级整数值的映射。优先级在values字段中指定,可以设置小于10亿的整数值,值越大,优先级越高
PriorityClass还有两个可选字段:
- globaDefault:用于设置默认优先级状态,如果没有任何优先级设置,Pod的优先级为零
- description:用来配置描述性信息,告诉用户优先级的用途
优先级策略
- 非抢占优先:指的是在调度阶段优先进行调度分配,一旦容器调度完成就不可以抢占,资源不足时,只能等待,对应 preemptionPolicy: Never
- 抢占优先:强制调度一个Pod,如果资源不足无法被调度,调度程序会抢占(删除)较低优先级的Pod的资源,来保证高优先级Pod的运行,对应 preemptionPolicy: PreemptLowerPriority
实践
PriorityClass
声明
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never(Never 表示非抢占,PreemptLowerPriority表示抢占)
globalDefault: false
description: "This priority class will not cause other pods to be preempted."
pod 使用
kind: Pod
apiVersion: v1
metadata:
name: php2
spec:
nodeSelector:
kubernetes.io/hostname: node-01
priorityClassName: high-priority-nonpreempting # 指定优先级的名称
containers:
- name: php
image: myos:phpfpm
resources:
requests:
cpu: "1500m"
参考
https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/