kubernetes - Pod 状态如何变成 MatchNodeSelector
问题描述
在我们的暂存环境中,报告了一个缺陷。kubernetes 更新后,一些 Pod 的状态变为“MatchNodeSelector”。
但我不知道为什么以及如何一些 Pod 成为“MatchNodeSelector”。所以我做了一些研究'如果一个 Pod 有一个字段'nodeSelector'并且没有任何节点有这个标签。这些 Pod 将成为“MatchNodeSelector”。
但我无法重现它。Pod 状态始终变为“待处理”,而不是“MatchNodeSelector”。所以我的问题是如何让 Pod 状态变为“MatchNodeSelector”?
解决方案
MatchNodeSelector
是我在工作节点重新启动后观察到的 pod 的状态。它出现在使用该.spec.nodeSelector
节的 pod 上。怎么了:
- kubelet 从命令行启动并加载标签,例如
/usr/bin/kubelet ... --node-labels=node-kind.foo.io/master=
- 在启动期间,kubelet 会要求 etcd:
- 过去通过 API 创建的附加节点标签列表
- 要在节点上运行的 pod 列表
- 有时它会在节点上应用全套标签之前开始启动 pod
- 因此,如果您的 pod 应该在此节点上启动,并且它
.spec.NodeSelector
使用的是来自 etcd/API 的标签,而不是来自命令行,那么 kubelet 会发现 pod 的期望与应用在此节点上的标签不匹配(因为尚未处理来自 etcd 的完整刷新) - 通常在完整的标签集合并后不久(来自 cmd 行和来自 etcd)并且下一个 pod 正确启动
推荐阅读
- selenium-webdriver - 如何将 TestNG 套件导出到 jar 文件
- javascript - 回调函数无法正常点击
- javascript - 取大数字(例如1900234)并在每三位数字后加逗号的最快方法是什么?
- android - Android如何显示前置摄像头(仅适用于镜子)
- ruby-on-rails - Rails:Heroku 在推送到生产时不加载资产
- haskell - 为绑定编写文档的正确方法是什么?
- android - Sugar Orm 只是在新添加的列中保存新数据后返回默认值(升级 Sugar Orm)
- r - 我有两个数据框,说明了两个对象的不同特征,我想将它们组合起来,使一个数据框对两者进行比较
- python - python pandas中的迭代和条件
- php - CI Sessions 是否受网络影响?