kubernetes等待pod优先级

kubernetes等待pod优先级,kubernetes,preemption,Kubernetes,Preemption,我的kubernetes(1.18.3)集群上有以下POD: pod3和pod4无法启动,因为节点只能容纳2个POD。当pod1完成并退出时,调度器选择pod3或pod4并启动它。到目前为止还不错 然而,我也有一个高优先级的pod(hpod),我想在第3或第4个pod之前,当其中一个运行的pod完成并退出时启动它 因此我创建了一个priorityclass,可以在kubernetes文档中找到: kind: PriorityClass metadata: name: high-priorit

我的kubernetes(1.18.3)集群上有以下POD:

pod3和pod4无法启动,因为节点只能容纳2个POD。当pod1完成并退出时,调度器选择pod3或pod4并启动它。到目前为止还不错

然而,我也有一个高优先级的pod(hpod),我想在第3或第4个pod之前,当其中一个运行的pod完成并退出时启动它

因此我创建了一个priorityclass,可以在kubernetes文档中找到:

kind: PriorityClass
metadata:
  name: high-priority-no-preemption
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "This priority class should be used for XYZ service pods only."
我创建了以下pod yaml:

apiVersion: v1
kind: Pod
metadata:
  name: hpod
  labels:
    app: hpod
spec:
  containers:
  - name: hpod
    image: ...
    resources:
      requests:
        cpu: "500m"
        memory: "500Mi"
      limits:
        cpu: "500m"
        memory: "500Mi"
  priorityClassName: high-priority-no-preemption
现在的问题是,当我使用kubectl apply-f hpod.yaml启动高优先级pod时,调度程序终止正在运行的pod,以允许高优先级pod启动,尽管我设置了“抢占策略:从不”

预期的行为是推迟启动hpod,直到当前运行的pod完成。当它发生时,让hpod在pod3或pod4之前开始


我做错了什么?

先决条件:

该解决方案在Kubernetes
v1.18.3
、docker 19.03和Ubuntu18上进行了测试。 还需要文本编辑器(即
sudo apt get install vim

在Kubernetes文档中,您可以找到注释

注意:在Kubernetes
1.15
及更高版本中,如果功能
非优先优先权
已启用,
优先类
可以选择设置
优先策略:从不
。这将防止该
PriorityClass
的吊舱抢占其他吊舱

此外,您还有以下信息:

使用抢占策略字段需要启用
非抢占优先级
功能门

稍后,如果您检查这些信息,您会发现
非优先权
,因此默认为禁用

使用当前配置输出:

$ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          32s
nginx-normal-2   1/1     Running   0          32s
$ kubectl apply -f prio.yaml
pod/nginx-priority created$ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal-2   1/1     Running   0          48s
nginx-priority   1/1     Running   0          8s
要启用抢占策略:从不,您需要对3个文件应用功能门=非抢占优先级=真:

/etc/kubernetes/manifests/kube-apiserver.yaml

/etc/kubernetes/manifests/kube-controller-manager.yaml

/etc/kubernetes/manifests/kube-scheduler.yaml

要检查此功能门是否已启用,可以使用命令进行检查:

ps aux | grep apiserver | grep feature-gates
ps aux | grep scheduler | grep feature-gates
ps aux | grep controller-manager | grep feature-gates
对于相当详细的信息,为什么你必须编辑这些文件请检查

使用文本编辑器将要素门添加到这些文件中

# vi kube-apiserver.yaml
并在
spec.containers.command
下添加
---feature gates=nonpremptingpriority=true
,如下面的示例所示:

spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=NonPreemptingPriority=true
    - --advertise-address=10.154.0.31
并对其他两个文件执行相同的操作。之后,您可以检查是否应用了此标志

$ ps aux | grep apiserver | grep feature-gates
root     26713 10.4  5.2 565416 402252 ?       Ssl  14:50   0:17 kube-apiserver --feature-gates=NonPreemptingPriority=true --advertise-address=10.154.0.31 
现在,您已经重新部署了您的
PriorityClass

$ kubectl get priorityclass
NAME                          VALUE        GLOBAL-DEFAULT   AGE
high-priority-no-preemption   1000000      false            12m
system-cluster-critical       2000000000   false            23m
system-node-critical          2000001000   false            23m
$ kubectl delete priorityclass high-priority-no-preemption
priorityclass.scheduling.k8s.io "high-priority-no-preemption" deleted
$ kubectl apply -f class.yaml 
priorityclass.scheduling.k8s.io/high-priority-no-preemption created
最后一步是使用此
PriorityClass
部署pod

$ kubectl get priorityclass
NAME                          VALUE        GLOBAL-DEFAULT   AGE
high-priority-no-preemption   1000000      false            12m
system-cluster-critical       2000000000   false            23m
system-node-critical          2000001000   false            23m
$ kubectl delete priorityclass high-priority-no-preemption
priorityclass.scheduling.k8s.io "high-priority-no-preemption" deleted
$ kubectl apply -f class.yaml 
priorityclass.scheduling.k8s.io/high-priority-no-preemption created
测试

$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          4m4s
nginx-normal-2   1/1     Running   0          18m
$ kubectl apply -f prio.yaml 
pod/nginx-priority created
$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          5m17s
nginx-normal-2   1/1     Running   0          20m
nginx-priority   0/1     Pending   0          67s
$ kubectl delete po nginx-normal-2
pod "nginx-normal-2" deleted
$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          5m55s
nginx-priority   1/1     Running   0          105s

您是否启用了
nonpremptingpriority
futuregate?你在PriorityClass中使用了什么版本?没有,我忽略了这个条件。谢谢你的回答。在应用您建议的步骤后,它将按预期工作。我唯一担心的是a)文档中说“注意:当集群面临资源压力时,关键POD依赖于调度程序抢占来调度。因此,不建议禁用抢占。”,以及b)此功能门是alpha,并且“漏洞风险增加,缺乏长期支持”。无论如何,再次感谢。不建议这样做,但有些场景需要特定的配置。我很高兴它对你有用
$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          4m4s
nginx-normal-2   1/1     Running   0          18m
$ kubectl apply -f prio.yaml 
pod/nginx-priority created
$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          5m17s
nginx-normal-2   1/1     Running   0          20m
nginx-priority   0/1     Pending   0          67s
$ kubectl delete po nginx-normal-2
pod "nginx-normal-2" deleted
$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
nginx-normal     1/1     Running   0          5m55s
nginx-priority   1/1     Running   0          105s