k8s集群支持低优Pod抢占

实现方案

使用PriorityClass实现。Pod 优先级和抢占

准备工作

需要准备至少两个PriorityClass。

  1. high-priority: 作为默认的PriorityClass(需设置globalDefault=true)
  2. 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值