pod可以优先处理。优先级指示Pod相对于其他Pod的重要性。如果无法调度Pod,则调度程序将尝试抢占(逐出)较低优先级的Pod,以便对未决Pod进行调度。

警告:
在并非所有用户都受信任的群集中,恶意用户可能会以最高优先级创建Pod,从而导致其他Pod被驱逐/无法调度。管理员可以使用ResourceQuota阻止用户创建高优先级的Pod。

如何使用优先级和抢占

要使用优先级和优先级:

  • 添加一个或多个PriorityClasses。
  • 创建priorityClassName设置为添加的PriorityClass之一的Pod。当然,您不需要直接创建Pod;通常,您将添加priorityClassName到诸如Deployment之类的集合对象的Pod模板中。

注意: Kubernetes已经附带了两个PriorityClasses: system-cluster-critical和system-node-critical。这些是通用类,用于确保始终优先安排关键组件。

如何禁用抢占

  • 注意:当群集承受资源压力时,关键Pod依赖调度程序抢占进行调度。因此,不建议禁用抢占。
  • 注意:在Kubernetes 1.15和更高版本中,如果NonPreemptingPriority启用了功能,PriorityClasses可以选择set preemptionPolicy: Never。这将防止PriorityClass的Pod抢占其他Pod。
    抢占由kube-scheduler标志控制disablePreemption,该标志false默认设置为。尽管有上述注意事项,但仍要禁用抢占,则可以设置 disablePreemption为true。

此选项仅在组件配置中可用,而在旧式命令行选项中不可用。以下是禁用抢占的示例组件配置:

apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
  provider: DefaultProvider

...

disablePreemption: true

优先等级

PriorityClass是一个非命名对象,它定义了从优先级类名称到优先级的整数值的映射。名称name在PriorityClass对象的元数据的字段中指定。该值在必填value字段中指定。值越高,优先级越高。PriorityClass对象的名称必须是有效的 DNS子域名,并且不能使用前缀system-。

PriorityClass对象可以具有小于或等于10亿的任何32位整数值。较大的数量保留给通常不应该抢占或驱逐的关键系统Pod。集群管理员应为他们想要的每个此类映射创建一个PriorityClass对象。

PriorityClass还具有两个可选字段:globalDefault和description。该globalDefault字段指示此PriorityClass的值应用于不带的Pod priorityClassName。系统中只能存在一个globalDefault设置为true的PriorityClass 。如果没有globalDefault设置PriorityClass ,则Pod的优先级 priorityClassName为零。

该description字段是一个任意字符串。它旨在告诉群集用户何时应使用此PriorityClass。

关于PodPriority和现有集群的说明

如果升级不具有此功能的现有群集,则现有Pod的优先级实际上为零。

globalDefault设置为的PriorityClass的添加true不会更改现有Pod的优先级。此类PriorityClass的值仅用于添加PriorityClass之后创建的Pod。

如果删除PriorityClass,则使用已删除PriorityClass的名称的现有Pod保持不变,但是您无法创建更多使用已删除PriorityClass的名称的Pod。

示例PriorityClass

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only."