设置 pod 优先级

通过 pod 优先级和抢占,您可以配置优先级类别,以显示构成 Red Hat OpenShift 集群工作负载的 pod 的相对优先级。 Red Hat OpenShift 控制器会考虑 Pod 的优先级,甚至可以抢占(移除)优先级较低的 Pod,以便在工作节点上为优先级较高的 Pod 腾出空间。 更多信息,请参阅 Red Hat OpenShift 文档

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

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

确保您已 设置对集群的正确用户访问权,如果适用,请使用 安全上下文约束(SCC)。 访问策略和SCC可帮助防止不受信任的用户部署高优先级的Pod,从而避免这些Pod阻碍其他Pod的调度。

优先级调度与抢占机制是如何工作的?

通常,优先级较高的暂挂 pod 会安排在较低优先级的 pod 之前执行。 如果工作节点上剩余的资源不足,Red Hat OpenShift 控制器可能会抢占(移除)Pod,以便为优先级更高的Pod释放足够的资源,使其能够被调度。 抢占还会受到正常终止时间段、pod 中断预算和工作程序节点亲缘关系的影响。

如果您未为 Pod 部署指定优先级,则默认优先级将设置为作为“globalDefault”设定的优先级类。 如果您没有 globalDefault 优先级类,那么所有 pod 的缺省优先级都为零 (0)。缺省情况下,Red Hat OpenShift on IBM Cloud 未设置 globalDefault,因此 pod 缺省优先级为零。

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

Pod 优先级场景。
Pod 优先级场景

  1. 具有高、中和低优先级的三个 pod 正在等待安排。 Red Hat OpenShift 控制器会找到一个可用的工作节点,该节点有足够空间容纳这三个 Pod,并按优先级顺序对它们进行调度,优先级最高的 Pod 优先被调度。
  2. 具有高、中和低优先级的三个 pod 正在等待安排。 Red Hat OpenShift 控制器找到了一个可用的工作节点,但该工作节点的资源仅够支持高优先级和中等优先级的 Pod。 因此并未安排低优先级 pod,该 pod 仍处于暂挂状态。
  3. 具有高优先级和中等优先级的两个 pod 处于等待安排状态。 具有低优先级的第三个 pod 存在于一个可用工作程序节点上。 但是,该工作程序节点没有足够的资源来安排任何暂挂的 pod。 Red Hat OpenShift 控制器会抢占(或移除)该低优先级Pod,从而将该Pod恢复为待处理状态。 随后,Red Hat OpenShift 控制器会尝试调度该高优先级Pod。 然而,工作节点没有足够的资源来调度该高优先级 Pod,因此,Red Hat OpenShift 控制器转而调度了该中等优先级 Pod。

如需了解更多信息,请参阅 Kubernetes 中关于 Pod 优先级和抢占机制的文档。

我可以禁用 Pod 优先级准入控制器吗?
编号 如果您不想使用 Pod 优先级,请不要在 Pod 部署中设置 globalDefault 或包含优先级类。 每个 pod 的优先级缺省为零,但 IBM 使用缺省优先级类部署的集群关键 pod 除外。 因为 pod 优先级是相对优先级,所以此基本设置可确保对集群关键 pod 划分优先级以使用资源,并通过遵循已落实的现有安排策略来安排其他任何 pod。

了解缺省优先级类

缺省情况下,Red Hat® OpenShift® on IBM Cloud® 集群会随附一些优先级类。

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

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

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

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

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

创建优先级类

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

开始之前:

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

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

    oc 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。 如果您在集群中创建了其他优先级类,可以通过运行 oc describe priorityclass <name> 来检查并确保它们未设置 globalDefault

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

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

    oc get priorityclasses
    

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

为 pod 分配优先级

为 pod spec 分配优先级类,以设置 Red Hat OpenShift on IBM Cloud 集群内 pod 的优先级。

开始之前:

请按照以下步骤检查其他已部署 Pod 的重要性,以便根据已部署的情况为您的 Pod 选择正确的优先级类。

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

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

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

    oc 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。

    oc apply -f filepath/pod-deployment.yaml