在我们的暂存环境中,报告了一个缺陷。 kubernetes更新后,某些Pods状态变为'MatchNodeSelector'。
但是我不知道为什么某些Pod为何以及如何变成'MatchNodeSelector'。因此,我进行了一些研究(如果Pod的字段为“ nodeSelector”,并且没有任何节点具有此标签)。这些Pod将成为“ MatchNodeSelector”。
但是我无法复制它。 Pods状态始终变为“待处理”,而不是“ MatchNodeSelector”。 所以我的问题是,如何使Pod状态变为“ MatchNodeSelector”?
答案 0 :(得分:0)
我能够通过以下方式重现此内容:
对于没有提供节点亲缘关系的任何运行的pod,请使用kubectl get po -o json --export
导出其yaml或json。请注意运行它的节点
删除窗格。
向与运行该节点的先前节点不同的节点明确提供节点亲和力。将其添加到规范中,如下所示:
"spec": { "affinity": { "nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { "nodeSelectorTerms": [ { "matchExpressions": [ { "key": "kubernetes.io/hostname", "operator": "In", "values": [ "new node name" ] } ] } ] } } } }
kubectl create -f pod.json
这是因为同一规范中也有一个node
选项,也需要更改。它不会被--export选项删除,并且在该字段中仍具有较旧的节点名称。
我想如果它与您在亲和力中指定的任何节点名称相冲突,它将导致此状态。
这些是版本: `客户端版本:version.Info {主要:“ 1”,次要:“ 10”,GitVersion:“ v1.10.3”,GitCommit:“ 2bba0127d85d5a46ab4b778548be28623b32d0b0”,GitTreeState:“ clean”,BuildDate:“ 2018-05-21T09:17 :39Z“,GoVersion:” go1.9.3“,编译器:” gc“,平台:” darwin / amd64“}
服务器版本:version.Info {主要:“ 1”,次要:“ 13”,GitVersion:“ v1.13.1”,GitCommit:“ eec55b9ba98609a46fee712359c7b5b365bdd920”,GitTreeState:“ clean”,BuildDate:“ 2018-12-13T10 :31:33Z“,GoVersion:” go1.11.2“,编译器:” gc“,平台:” linux / amd64“}`
答案 1 :(得分:0)
MatchNodeSelector
是工作节点重新启动后观察到的Pod状态。它出现在使用.spec.nodeSelector
节的pod上。会发生什么:
/usr/bin/kubelet ... --node-labels=node-kind.foo.io/master=
.spec.NodeSelector
使用的是etcd / API中的标签,而不是命令行中的标签,则kubelet会看到Pod的期望值不匹配以及应用于此节点的标签(因为尚未处理来自etcd的完全刷新)