相比传统的单机部署,容器化部署在集群的方式大大提高了资源利用率,但业务上也会担心一些很key的应用无法获得资源保障。这时候就需要PriorityClass。高优先级的负载会优先调度,抢占低优先级负载的资源。
(DCE下个版本会支持界面化配置PriorityClass,当前可以通过yaml文件进行配置)

step 1: 定义PriorityClass

根据业务需要定义不同梯度的PriorityClass资源,将yaml配置导入集群(平台内任意一个导入yaml的入口),其中优先级的范围1~1000000000(数值越大优先级越高)。系统组件的数值为2000000000,而普通pod在无配置时默认的数值为0。比如创建一个10000数值和100数值的优先级资源:
image.png
step2:为业务容器设置第一步中设定好的PriorityClassName
在workload的yaml配置里配置

spec: PriorityClassName: high/low

更多原理介绍,见K8S官网链接

Pods 可以有优先级(Priority)。 优先级体现的是当前 Pod 与其他 Pod 相比的重要程度。如果 Pod 无法被调度,则 调度器会尝试抢占(逐出)低优先级的 Pod,从而使得悬决的 Pod 可被调度。

如何使用优先级和抢占

要使用优先级和抢占特性:

  1. 添加一个或多个 PriorityClasses 对象
  2. 创建 Pod 时设置其 [priorityClassName](https://kubernetes.io/zh/docs/concepts/configuration/pod-priority-preemption/#pod-priority) 为所添加的 PriorityClass 之一。 当然你也不必一定要直接创建 Pod;通常你会在一个集合对象(如 Deployment)的 Pod 模板中添加 priorityClassName

PriorityClass 对象可以设置数值小于等于 10 亿的 32 位整数。 更大的数值保留给那些通常不可被抢占或逐出的系统 Pod。 集群管理员应该为每个优先级值映射创建一个 PriorityClass 对象。

PriorityClass

  1. apiVersion: scheduling.k8s.io/v1
  2. kind: PriorityClass
  3. metadata:
  4. name: high-priority-nonpreempting
  5. value: 1000000
  6. preemptionPolicy: Never
  7. globalDefault: false
  8. description: "This priority class will not cause other pods to be preempted."

Pod

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. labels:
  6. env: test
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: nginx
  11. imagePullPolicy: IfNotPresent
  12. priorityClassName: high-priority