liujie
liujie
Published on 2024-05-20 / 6 Visits
0
0

k8s Pod 优先级和抢占

Kubernetes (k8s) 中的 Pod 优先级和抢占机制用于管理集群资源分配,确保关键应用在资源紧张时仍能运行。以下是它们的详细介绍:

Pod 优先级

Pod 优先级用于表示 Pod 的重要性。优先级高的 Pod 在资源竞争时将比优先级低的 Pod 更有可能被调度。

创建优先级类

优先级类(PriorityClass)是定义 Pod 优先级的对象。你可以通过 YAML 文件来创建它们,例如:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000
globalDefault: false
description: "This priority class is for high priority pods."

字段说明:

  • value: 优先级的整数值,值越高,优先级越高。

  • globalDefault: 如果设为 true,则所有没有指定优先级类的 Pod 将使用这个优先级类。

  • description: 对优先级类的描述。

创建优先级类后,可以在 Pod 的 spec 中指定使用哪个优先级类:

apiVersion: v1
kind: Pod
metadata:
  name: high-priority-pod
spec:
  priorityClassName: high-priority
  containers:
  - name: mycontainer
    image: myimage

抢占

抢占是指当资源不足时,Kubernetes 可以终止(驱逐)低优先级的 Pod,以腾出资源给高优先级的 Pod。

抢占流程

  1. 调度失败:当一个高优先级 Pod 无法被调度时,调度器会尝试通过抢占其他 Pod 来腾出资源。

  2. 选择目标:调度器选择一个或多个低优先级的 Pod 作为抢占目标。

  3. 驱逐目标:被选中的低优先级 Pod 会被驱逐,释放它们占用的资源。

  4. 重新调度:高优先级 Pod 被调度到释放出来的资源上。

控制抢占行为

在一些情况下,你可能希望控制或禁用抢占行为。可以通过以下方式实现:

  • PodDisruptionBudget (PDB):PDB 可以限制特定应用在任意时间内最多能有多少个 Pod 被驱逐,从而保护关键应用。

  • 调度器配置:在 Kubernetes 调度器配置文件中可以设置 disablePreemption=true 来禁用抢占。

示例

以下是一个完整示例,包括优先级类创建和使用:

# 定义优先级类
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000
globalDefault: false
description: "This priority class is for high priority pods."

---

# 使用优先级类的 Pod
apiVersion: v1
kind: Pod
metadata:
  name: high-priority-pod
spec:
  priorityClassName: high-priority
  containers:
  - name: mycontainer
    image: myimage

通过这种方式,Kubernetes 可以更智能地管理资源分配,确保关键任务的高优先级 Pod 能在资源紧张时获得所需的资源。


Comment