kubernetes等待pod优先级
我的kubernetes(1.18.3)集群上有以下POD: pod3和pod4无法启动,因为节点只能容纳2个POD。当pod1完成并退出时,调度器选择pod3或pod4并启动它。到目前为止还不错 然而,我也有一个高优先级的pod(hpod),我想在第3或第4个pod之前,当其中一个运行的pod完成并退出时启动它 因此我创建了一个priorityclass,可以在kubernetes文档中找到: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
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文档中,您可以找到注释:
注意:在Kubernetes1.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