IBM Cloud Docs
设置 pod 优先级

设置 pod 优先级

通过 pod 优先级和抢占,您可以配置优先级类以指示构成 Kubernetes 集群工作负载的 pod 的相对优先级。 Kubernetes 调度程序会考虑 pod 的优先级,甚至可以抢占(除去)优先级较低的 pod,以便在工作程序节点上腾出空间以用于更高优先级的 pod。

为什么要设置 pod 优先级?
作为集群管理员,您会希望控制哪些 pod 对集群工作负载更关键。 优先级类可以帮助您控制 Kubernetes 调度程序决策,使优先级较高的 pod 优先于优先级较低的 pod 进行处理。 Kubernetes 调度器甚至可以抢占(移除)正在运行的低优先级 pod,以便调度待处理的高优先级 pod。

通过设置 pod 优先级,可以帮助防止较低优先级的工作负载影响集群中的关键工作负载,尤其是集群即将达到其资源容量的情况下。

确保已为群集 设置了适当的用户访问权限,如果适用,还设置了 pod 安全策略 (PSP)。 访问策略和 PSP 可帮助防止不受信任的用户部署高优先级 pod,从而阻止其他 pod 进行调度。

优先调度和抢占是如何工作的?

通常,优先级较高的暂挂 pod 会安排在较低优先级的 pod 之前执行。 如果工作者节点没有足够的剩余资源,Kubernetes 调度器可以抢占(移除)pod,为优先级较高的 pod 进行调度释放足够的资源。 抢占还会受到正常终止时间段、pod 中断预算和工作程序节点亲缘关系的影响。

如果未指定 pod 部署的优先级,则默认设置为作为 globalDefault 的优先级类别。 如果您没有 globalDefault 优先级类,那么所有 pod 的缺省优先级都为零 (0)。缺省情况下,IBM Cloud Kubernetes Service 未设置 globalDefault,因此 pod 缺省优先级为零。

要了解 pod 优先级和 Kubernetes 调度器如何协同工作,请参考下图中的场景。 您必须将已划分优先级的 pod 置于具有可用资源的工作程序节点上。 否则,在除去现有 pod 的同时,集群中的高优先级 pod 可能保持暂挂状态,例如在场景 3 中那样。

Pod 优先场景。
Pod 优先级方案

  1. 具有高、中和低优先级的三个 pod 正在等待安排。 Kubernetes 调度器会找到一个可容纳所有三个 pod 的工作节点,并按照优先级顺序对它们进行调度,优先级最高的 pod 会优先调度。
  2. 具有高、中和低优先级的三个 pod 正在等待安排。 Kubernetes 调度器会找到一个可用的工作节点,但该工作节点的资源仅够支持高优先级和中等优先级的 pod。 因此并未安排低优先级 pod,该 pod 仍处于暂挂状态。
  3. 具有高优先级和中等优先级的两个 pod 处于等待安排状态。 具有低优先级的第三个 pod 存在于一个可用工作程序节点上。 但是,该工作程序节点没有足够的资源来安排任何暂挂的 pod。 Kubernetes 调度器会抢占或移除低优先级 pod,使 pod 返回待处理状态。 然后,Kubernetes 调度器会尝试调度高优先级 pod。 但是,工作节点没有足够的资源来调度高优先级 pod,因此 Kubernetes 调度器会调度中等优先级 pod。

有关详细信息,请参阅 Kubernetes 有关 pod 优先级和抢占的文档。

能否禁用 pod 优先级接纳控制器?
编号 如果不想使用 pod 优先级,就不要在 pod 部署中设置 globalDefault 或包含优先级类。 每个 pod 的优先级缺省为零,但 IBM 使用缺省优先级类部署的集群关键 pod 除外。 因为 pod 优先级是相对优先级,所以此基本设置可确保对集群关键 pod 划分优先级以使用资源,并通过遵循已落实的现有安排策略来安排其他任何 pod。
资源配额如何影响 pod 优先级?
您可以将 pod 优先级与资源配额 (包括 配额作用域) 结合使用。 借助配额作用域,可以设置资源配额来考虑 pod 优先级。 优先级高的 pod 相比优先级低的 pod,可优先使用受到资源配额限制的系统资源。

了解缺省优先级类

缺省情况下,IBM Cloud® Kubernetes Service 集群会随附一些优先级类。

请勿修改用于正确管理集群的缺省类。 您可以在应用程序部署中使用这些类,或创建自己的优先级类

下表描述了缺省情况下集群中的优先级类以及使用这些类的原因。

不能修改的缺省优先级类
名称 设置方 优先级值 用途
system-node-critical Kubernetes 2000001000 选择在创建群集时 部署到特权系统命名空间 中的 pod,使用此优先级来保护工作节点的关键功能,如网络、存储、日志、监控和度量 pod。
system-cluster-critical Kubernetes 2000000000 选择在创建群集时 部署到特权系统命名空间 的 pod,使用此优先级来保护群集的关键功能,如网络、存储、日志、监控和度量 pod。
ibm-app-cluster-critical IBM 900000000 选择在创建群集时 部署到特权系统命名空间 的 pod,使用此优先级类别来保护应用程序的关键功能,如负载平衡器 pod。

可以通过运行以下命令来检查哪些 pod 使用了优先级类。

kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName

创建优先级类

要设置 pod 优先级,需要使用优先级类。

开始之前:

  1. 列出现有优先级类。 您可以使用现有的优先级作为新级的模板。

    kubectl get priorityclasses
    
  2. 选择要复制的优先级类并创建本地 YAML 文件。

    kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
    
  3. 编写自己的优先级类 YAML 文件。

    apiVersion: scheduling.k8s.io/v1alpha1
    kind: PriorityClass
    metadata:
      name: <priority_class_name>
    value: <1000000>
    globalDefault: <false>
    description: "Use this class for XYZ service pods only."
    
    了解 YAML 文件的组成部分
    组件 描述
    name 必需:要创建的优先级类的名称。
    value 必需:输入小于或等于 10 亿 (1000000000) 的整数。 值越高,优先级越高。 值相对于集群中其他优先级类的值。 为不想被抢占(移除)的系统关键 pod 保留非常高的数字。

    例如,缺省集群关键优先级类的值范围为 900000000-2000001000,因此对于新的优先级类,请输入小于这些数字的值,避免任何 pod 的优先级高于这些 pod。

    globalDefault 可选:将此字段设置为 true 可将此优先级类设置为全局缺省值,此缺省值将应用于安排的未指定 priorityClassName 值的每个 pod。 集群中只能有 1 个优先级类可设置为全局缺省值。 如果没有全局缺省值,那么未指定 priorityClassName 的 pod 的优先级为零 (0)。

    缺省优先级类 不会设置 globalDefault。 如果您在群集中创建了其他优先级类,可以通过运行 kubectl describe priorityclass <name> 来检查它们是否设置了 globalDefault

    description 可选:指示用户使用此优先级类的原因。 将字符串用引号 ("") 括起。
  4. 在集群中创建优先级类。

    kubectl apply -f filepath/priorityclass.yaml
    
  5. 验证优先级类是否已创建。

    kubectl get priorityclasses
    

太好了! 您已创建优先级类。 请通知您的团队有关该优先级类以及他们必须用于自己 pod 部署的优先级类(如果有)的信息。

为 pod 分配优先级

为 pod spec 分配优先级类,以设置 IBM Cloud Kubernetes Service 集群内 pod 的优先级。

开始之前:

完成以下步骤,检查已部署的其他 pod 的重要性,以便根据已部署的 pod 为您的 pod 选择正确的优先级。

  1. 查看名称空间中其他 pod 使用的优先级类。

    kubectl get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
    
  2. 获取优先级类的详细信息,并记下数字。 划分优先级时,数字较大的 pod 会位于数字较低的 pod 之前。 对于要复查的每个优先级类重复此步骤。

    kubectl describe priorityclass <priorityclass_name>
    
  3. 获取要使用的优先级类,或者创建自己的优先级类

    kubectl get priorityclasses
    
  4. 在 pod spec 中,为 priorityClassName 字段添加在上一步中检索到的优先级类的名称。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ibmliberty
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ibmliberty
      template:
        metadata:
          labels:
            app: ibmliberty
        spec:
          containers:
          - name: ibmliberty
            image: icr.io/ibm/liberty:latest
            ports:
            - containerPort: 9080
          priorityClassName: <priorityclass_name>
    
  5. 在要部署划分优先级 pod 的名称空间中创建这些 pod。

    kubectl apply -f filepath/pod-deployment.yaml