# Pod 优先权
FEATURE STATE: Kubernetes v1.14
stable
Pod 中可以定义 优先级 priority
,用于标识该 Pod 相对于其他 Pod 的重要程度。当存在 Pod 等待调度时(处于 Pending 状态),调度器将尝试抢占(preempt 或 驱逐 evict)低优先级(priority)的 Pod,以便调度 Pending 中的 Pod。
自 Kubernetes 1.9 开始,Priority 也会对如下两个场景产生影响:
- Pod 的调度顺序
- 资源耗尽时,从节点上驱逐 Pod 的顺序
Pod 优先权(priority and preemption)的特性在 Kubernetes 1.11 中是 beta状态,并默认激活,在1.14 中是 GA(Generally Available 正式发布)状态。如下表所示:
Kubernetes Version | Priority and Preemption State | Enabled by default |
---|---|---|
1.8 | alpha | no |
1.9 | alpha | no |
1.10 | alpha | no |
1.11 | beta | yes |
1.14 | stable | yes |
警告
如果集群中的用户并不是全部可信,可能会出现一些恶意的用户,创建最高优先级的 Pod,使得其他的 Pod 被驱逐或者不能正常调度。可以通过在 ResourceQuota 中指定 priority 来解决此问题。
# 使用Pod优先权
在 Kubernetes v1.11 及以后的版本中,参考下面的步骤启用Pod优先权(Pod priority and preemption):
- 添加一个或多个 PriorityClass
- 创建Pod时指定 priorityClassName 为其中一个 PriorityClass。(通常在 Deployment/StatefulSet等 的
spec.template.spec.priorityClassName
中指定,而不是直接创建 Pod)
如果你尝试过该特性之后,想要将其禁用,你必须在 API Server 和 Scheduler 的命令行启动参数中移除 PodPriority
参数,或者将其设置为 false
。禁用该特性之后:
- 已经创建的 Pod 将保留 priority 字段,但是抢占行为(preemption)被禁用了,且 priority 字段也将被忽略
- 新创建的 Pod 将不能在设置
priorityClassName
字段
# 如何禁用 preemtion
preemption,英文愿意为先买权,此处可以理解为抢占行为
TIP
在 Kubernetes 1.12+,当前集群资源不足时,关键的 Pod 将依赖于抢占权才能被调度。因此,并不建议禁用 preemption
TIP
在 Kubernetes 1.15+,如果 NonPreemptingPriority
被启用了,PriorityClass 可以设置为 preemptionPolicy: Never
,此时,该 PriorityClass 的所有 Pod 将不会抢占(preempty)其他 Pod 的资源
在 Kubernetes 1.11+,preemption 由 kube-scheduler 的参数 disablePreemption
设置,默认为 false
。如果在您已经知晓上面的提示的情况下,仍然要禁用 preemption,可以将 disablePreemption
参数设置为 true
。
该参数需要通过 YAML 文件配置,而不能通过命令行参数设定。示例配置如下所示:
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
provider: DefaultProvider
...
disablePreemption: true
2
3
4
5
6
7
8
# PriorityClass
待续 ...