设置 pod 优先级
通过 pod 优先级和抢占,您可以配置优先级类以指示构成 Red Hat OpenShift 集群工作负载的 pod 的相对优先级。 Red Hat OpenShift 控制器会考虑Pod的优先级,甚至可以抢占(删除)优先级较低的Pod,以便在Worker节点上为优先级较高的Pod腾出空间。 有关更多信息,请参阅 Red Hat OpenShift 文档。
- 为什么我要设置优先级?
- 作为集群管理员,您会希望控制哪些 pod 对集群工作负载更关键。 优先级类可以帮助您控制 Red Hat OpenShift 控制器的决策,使其优先考虑优先级较高的吊舱,而非优先级较低的吊舱。 Red Hat OpenShift 控制器甚至可以抢占(移除)正在运行的优先级较低的容器,以便为优先级较高的容器安排调度。
通过设置 pod 优先级,可以帮助防止较低优先级的工作负载影响集群中的关键工作负载,尤其是集群即将达到其资源容量的情况下。
确保您已 设置对集群的正确用户访问权,如果适用,请使用 安全上下文约束(SCC)。 访问策略和SCC有助于防止不受信任的用户部署高优先级Pod,从而阻止其他Pod进行调度。
优先调度和抢占是如何运作的?
通常,优先级较高的暂挂 pod 会安排在较低优先级的 pod 之前执行。 如果您的工作节点剩余资源不足,Red Hat OpenShift 控制器可以抢占(删除)容器,为优先级更高的容器释放足够的资源。 抢占还会受到正常终止时间段、pod 中断预算和工作程序节点亲缘关系的影响。
如果您没有指定部署优先级,则默认设置为 globalDefault
的优先级。 如果您没有 globalDefault
优先级类,那么所有 pod 的缺省优先级都为零 (0
)。缺省情况下,Red Hat OpenShift on IBM Cloud 未设置 globalDefault
,因此 pod 缺省优先级为零。
要了解荚优先级和 Red Hat OpenShift 控制器如何协同工作,请考虑下图中的场景。 您必须将已划分优先级的 pod 置于具有可用资源的工作程序节点上。 否则,在除去现有 pod 的同时,集群中的高优先级 pod 可能保持暂挂状态,例如在场景 3 中那样。
- 具有高、中和低优先级的三个 pod 正在等待安排。 Red Hat OpenShift 控制器找到一个可用的工人节点,该节点有足够的空间容纳三个吊舱,并按照优先级顺序安排吊舱,优先级最高的吊舱排在第一位。
- 具有高、中和低优先级的三个 pod 正在等待安排。 Red Hat OpenShift 控制器找到一个可用的工作节点,但该工作节点只有足够支持高优先级和中优先级Pod的资源。 因此并未安排低优先级 pod,该 pod 仍处于暂挂状态。
- 具有高优先级和中等优先级的两个 pod 处于等待安排状态。 具有低优先级的第三个 pod 存在于一个可用工作程序节点上。 但是,该工作程序节点没有足够的资源来安排任何暂挂的 pod。 Red Hat OpenShift 控制器会优先处理或移除低优先级的任务,使任务返回待处理状态。 然后,Red Hat OpenShift 控制器会尝试安排高优先级任务。 然而,工作节点没有足够的资源来调度高优先级的容器,因此由 Red Hat OpenShift 控制器调度中等优先级的容器。
如需了解更多信息,请参阅 Kubernetes 文档中有关 优先级和抢占的说明。
- 我可以禁用吊舱优先准入控制器吗?
- 编号 如果您不想使用优先级,请不要在部署容器时设置
globalDefault
或优先级。 每个 pod 的优先级缺省为零,但 IBM 使用缺省优先级类部署的集群关键 pod 除外。 因为 pod 优先级是相对优先级,所以此基本设置可确保对集群关键 pod 划分优先级以使用资源,并通过遵循已落实的现有安排策略来安排其他任何 pod。
了解缺省优先级类
缺省情况下,Red Hat® OpenShift® on IBM Cloud® 集群会随附一些优先级类。
请勿修改用于正确管理集群的缺省类。 您可以在应用程序部署中使用这些类,或创建自己的优先级类。
下表描述了缺省情况下集群中的优先级类以及使用这些类的原因。
名称 | 设置方 | 优先级值 | 用途 |
---|---|---|---|
system-node-critical |
Kubernetes | 2000001000 | 在创建集群时 选择部署到特权系统命名空间的 容器,使用此优先级来保护工作节点的关键功能,例如网络、存储、日志、监控和指标容器。 |
system-cluster-critical |
Kubernetes | 2000000000 | 在创建集群时,选择 部署到特权系统命名空间的 容器,使用此优先级来保护集群的关键功能,例如网络、存储、日志、监控和指标容器。 |
ibm-app-cluster-critical |
IBM | 900000000 | 在创建集群时选择 部署到特权系统命名空间的 容器,使用此优先级来保护应用程序的关键功能,例如负载均衡器容器。 |
可以通过运行以下命令来检查哪些 pod 使用了优先级类。
oc get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
创建优先级类
要设置 pod 优先级,需要使用优先级类。
开始之前:
- 访问 Red Hat OpenShift 集群。
- 确保您拥有
default
命名空间 中的Writer 或 Manager IBM Cloud IAM服务访问角色。
-
列出现有优先级类。 您可以将现有的优先级作为新优先级的模板。
oc get priorityclasses
-
选择要复制的优先级类并创建本地 YAML 文件。
oc get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
-
编写自己的优先级类 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) 的整数。 值越高,优先级越高。 值相对于集群中其他优先级类的值。 对于不想被抢先(删除)的系统关键任务,请预留很高的数量。 例如,缺省集群关键优先级类的值范围为 900000000-2000001000,因此对于新的优先级类,请输入小于这些数字的值,避免任何 pod 的优先级高于这些 pod。
globalDefault
可选:将此字段设置为 true
可将此优先级类设置为全局缺省值,此缺省值将应用于安排的未指定priorityClassName
值的每个 pod。 集群中只能有 1 个优先级类可设置为全局缺省值。 如果没有全局缺省值,那么未指定priorityClassName
的 pod 的优先级为零 (0
)。缺省优先级类 不会设置
globalDefault
。 如果您在集群中创建了其他优先级,则可以通过运行oc describe priorityclass <name>
来检查它们是否设置了globalDefault
。description
可选:指示用户使用此优先级类的原因。 将字符串用引号 ( ""
) 括起。 -
在集群中创建优先级类。
oc apply -f filepath/priorityclass.yaml
-
验证优先级类是否已创建。
oc get priorityclasses
太好了! 您已创建优先级类。 请通知您的团队有关该优先级类以及他们必须用于自己 pod 部署的优先级类(如果有)的信息。
为 pod 分配优先级
为 pod spec 分配优先级类,以设置 Red Hat OpenShift on IBM Cloud 集群内 pod 的优先级。
开始之前:
- 访问 Red Hat OpenShift 集群。
- 确保您在要部署 Pod 的命名空间中拥有 Writer 或 Manager IBM Cloud IAM 服务访问角色。
- 了解优先级安排的运作方式,因为优先级可以抢占现有 pod,并影响如何使用集群的资源。
请完成以下步骤,检查其他已部署吊舱的重要性,以便根据已部署的吊舱选择正确的优先级。
-
查看名称空间中其他 pod 使用的优先级类。
oc get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
-
获取优先级类的详细信息,并记下值数字。 划分优先级时,数字较大的 pod 会位于数字较低的 pod 之前。 对于要复查的每个优先级类重复此步骤。
oc describe priorityclass <priorityclass_name>
-
获取要使用的优先级类,或者创建自己的优先级类。
oc get priorityclasses
-
在 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>
-
在要部署划分优先级 pod 的名称空间中创建这些 pod。
oc apply -f filepath/pod-deployment.yaml