首页 > 解决方案 > Pod 状态如何变成 MatchNodeSelector

问题描述

在我们的暂存环境中,报告了一个缺陷。kubernetes 更新后,一些 Pod 的状态变为“MatchNodeSelector”。

但我不知道为什么以及如何一些 Pod 成为“MatchNodeSelector”。所以我做了一些研究'如果一个 Pod 有一个字段'nodeSelector'并且没有任何节点有这个标签。这些 Pod 将成为“MatchNodeSelector”。

但我无法重现它。Pod 状态始终变为“待处理”,而不是“MatchNodeSelector”。所以我的问题是如何让 Pod 状态变为“MatchNodeSelector”?

标签: kuberneteskubernetes-pod

解决方案


MatchNodeSelector是我在工作节点重新启动后观察到的 pod 的状态。它出现在使用该.spec.nodeSelector节的 pod 上。怎么了:

  1. kubelet 从命令行启动并加载标签,例如/usr/bin/kubelet ... --node-labels=node-kind.foo.io/master=
  2. 在启动期间,kubelet 会要求 etcd:
    • 过去通过 API 创建的附加节点标签列表
    • 要在节点上运行的 pod 列表
  3. 有时它会在节点上应用全套标签之前开始启动 pod
  4. 因此,如果您的 pod 应该在此节点上启动,并且它.spec.NodeSelector使用的是来自 etcd/API 的标签,而不是来自命令行,那么 kubelet 会发现 pod 的期望与应用在此节点上的标签不匹配(因为尚未处理来自 etcd 的完整刷新)
  5. 通常在完整的标签集合并后不久(来自 cmd 行和来自 etcd)并且下一个 pod 正确启动

参考:这里这里


推荐阅读