# Pod 优先权

参考文档:Pod Priority and Preemption

FEATURE STATEKubernetes 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):

  1. 添加一个或多个 PriorityClass
  2. 创建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
1
2
3
4
5
6
7
8

# PriorityClass

待续 ...

# Pod priority