实现方案
使用PriorityClass实现。Pod 优先级和抢占
准备工作
需要准备至少两个PriorityClass。
- high-priority: 作为默认的PriorityClass(需设置globalDefault=true)
- low-priority: 低优的Pod指定改优先级
将以下yaml文件apply到集群中即可:
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: true
description: "default priority for pod"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority
value: 10
globalDefault: false
description: "priority for best effort pod"
operator实现
判断集群是否支持低优Pod
可以通过集群内是否存在low-priority这个PriorityClass来判断集群是否支持低优Pod。
operator需要保证有PriorityClass的get权限,可以在Reconcile函数上增加kubebuilder注释,执行make manifests后,就会自动将权限更新到role.yaml中,再apply到集群中即可。
// +kubebuilder:rbac:groups=scheduling.k8s.io,resources=priorityclasses,verbs=get
func (r *XXXReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, err error) {
...
}
权限添加好后,可以通过如下代码判断集群中是否存在low-priority这个PriorityClass
func isSupportPriorityClass(ctx context.Context, mgr manager.Manager, priorityClassName string) bool {
err := mgr.GetAPIReader().Get(ctx, types.NamespacedName{Name: priorityClassName}, &schedulingv1.PriorityClass{})
if err != nil {
log.FromContext(ctx).Error(err, "Failed to get priority class.", "name", priorityClassName)
return false
}
log.FromContext(ctx).Info("Priority class is supported.", "name", priorityClassName)
return true
}
给Pod设置优先级
func setPriorityClass(pod *corev1.Pod, priorityClass string) {
pod.Spec.PriorityClassName = priorityClass
}
如果没有显示设置PriorityClassName,pod将使用globalDefault=true的PriorityClass。