我在GKE上有一个由Helm管理的Kubernetes集群,最近部署开始失败,因为Pod不会离开Pending
状态。检查正在看到的未完成的Pod:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 50m default-scheduler Successfully assigned default/my-pod-6cbfb94cb-4pzl9 to gke-staging-pool-43f2e11c-nzjz
Warning FailedValidation 50m (x6 over 50m) kubelet, gke-staging-pool-43f2e11c-nzjz Error validating pod my-pod-6cbfb94cb-4pzl9_default(8e4dab93-75a7-11e9-80e1-42010a960181) from api, ignoring: spec.priority: Forbidden: Pod priority is disabled by feature-gate
特别是,此警告似乎与之相关:Error validating pod my-pod-6cbfb94cb-4pzl9_default(8e4dab93-75a7-11e9-80e1-42010a960181) from api, ignoring: spec.priority: Forbidden: Pod priority is disabled by feature-gate
将新的Pending
吊舱与当前运行的吊舱进行比较,我看到的唯一区别(除了时间戳等)是:
$ kubectl get pod my-pod-6cbfb94cb-4pzl9 -o yaml > /tmp/pending-pod.yaml
$ kubectl get pod my-pod-7958cc964-64wsd -o yaml > /tmp/running-pod.yaml
$ diff /tmp/running-pod.yaml /tmp/pending-pod.yaml
…
@@ -58,7 +58,8 @@
name: default-token-wnhwl
readOnly: true
dnsPolicy: ClusterFirst
- nodeName: gke-staging-pool-43f2e11c-r4f9
+ nodeName: gke-staging-pool-43f2e11c-nzjz
+ priority: 0 // <-- notice that the `priority: 0` field is added
restartPolicy: Always
schedulerName: default-scheduler
…
这似乎是在2019年5月1日至2019年5月6日之间的某个时间开始发生的。
我在这里作为示例使用的群集是一个临时群集,但是我注意到两个配置相似的生产群集上的行为相同,这使我相信Google Kube方面已经发生了变化。
Helm通过cloudbuild.yaml
部署了Pod,在5月1日至5月6日似乎引入了回归的情况下,该设置(Helm的版本或cloudbuild文件)没有任何改变。
头盔版本:
Client: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}
答案 0 :(得分:2)
如果您看到Pod priority and Preemption的文档,则该功能在alpha
中为<= 1.10
(默认情况下已禁用,由功能门启用,GKE在控制平面上不执行此功能,afaik ),则它变成了beta
中的>= 1.11
(默认启用)。
可以是或组合:
您有一个GKE控制平面>= 1.11
,并且您的Pod尝试启动的节点(由kube-scheduler调度)正在运行kubelet <= 1.10
。有人可以升级控制平面而无需升级节点(或实例组)
有人将控制平面升级到1.11或更高版本,并且默认情况下启用了优先级允许控制器,这阻止了设置了spec.priority
字段的Pod的启动(或重新启动)。如果您看到API docs(优先级字段),则表示启用优先级允许控制器后,您将无法设置该字段,而该字段只能由PriorityClass/PriorityClassName设置。