Kubernetes Pod状态如何变为匹配节点选择器

Kubernetes Pod状态如何变为匹配节点选择器,kubernetes,kubernetes-pod,Kubernetes,Kubernetes Pod,在我们的暂存环境中,报告了一个缺陷。kubernetes更新后,一些POD状态变为“MatchNodeSelector” 但我不知道为什么和如何一些豆荚成为“匹配节点选择器”。所以我做了一些研究,如果一个Pod有一个字段nodeSelector,而没有任何节点有这个标签。这些豆荚将成为“MatchNodeSelector” 但我无法复制它。Pods状态始终变为“挂起”,而不是“匹配节点选择器”。 因此,我的问题是,如何使Pod状态变为“MatchNodeSelector”?我已经能够通过以下方式

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

但我不知道为什么和如何一些豆荚成为“匹配节点选择器”。所以我做了一些研究,如果一个Pod有一个字段nodeSelector,而没有任何节点有这个标签。这些豆荚将成为“MatchNodeSelector”

但我无法复制它。Pods状态始终变为“挂起”,而不是“匹配节点选择器”。
因此,我的问题是,如何使Pod状态变为“MatchNodeSelector”?

我已经能够通过以下方式重现这一点:

  • 对于没有提供节点关联的任何正在运行的pod,使用
    kubectl get po-o json--export
    导出其yaml或json。请注意运行它的节点

  • 删除pod

  • 显式提供与运行节点的前一个节点不同的节点关联。将其添加到规范中,如下所示:

  • 使用
    kubectl Create-f pod.json创建pod
  • Pod状态现在为MatchNodeSelector

  • 这是因为在同一规范中也有一个
    节点
    选项,该选项也需要更改。它没有被--export选项删除,并且在该字段中仍然具有旧的节点名称

    我猜如果它与您在affinity中提供的任何节点名称冲突,它将导致此状态

    这些版本如下: `客户端版本:Version.Info{Major:“1”,Minor:“10”,GitVersion:“v1.10.3”,GitCommit:“2BBA017D85D5A46AB4B778548BE28623B32D0B0”,GitRestate:“clean”,BuildDate:“2018-05-21T09:17:39Z”,政府版本:“go1.9.3”,编译器:“gc”,平台:“darwin/amd64”}


    服务器版本:Version.Info{Major:“1”,Minor:“13”,GitVersion:“v1.13.1”,GitCommit:“eec55b9ba98609a46fee712359c7b5b365bdd920”,GitRestate:“clean”,BuildDate:“2018-12-13T10:31:33Z”,GoVersion:“go1.11.2”,编译器:“gc”,平台:“linux/amd64”}

    我已经能够通过以下方式复制此信息:

  • 对于没有提供节点关联的任何正在运行的pod,使用
    kubectl get po-o json--export
    导出其yaml或json。请注意运行它的节点

  • 删除pod

  • 显式提供与运行节点的前一个节点不同的节点关联。将其添加到规范中,如下所示:

  • 使用
    kubectl Create-f pod.json创建pod
  • Pod状态现在为MatchNodeSelector

  • 这是因为在同一规范中也有一个
    节点
    选项,该选项也需要更改。它没有被--export选项删除,并且在该字段中仍然具有旧的节点名称

    我猜如果它与您在affinity中提供的任何节点名称冲突,它将导致此状态

    这些版本如下: `客户端版本:Version.Info{Major:“1”,Minor:“10”,GitVersion:“v1.10.3”,GitCommit:“2BBA017D85D5A46AB4B778548BE28623B32D0B0”,GitRestate:“clean”,BuildDate:“2018-05-21T09:17:39Z”,政府版本:“go1.9.3”,编译器:“gc”,平台:“darwin/amd64”}


    服务器版本:Version.Info{Major:“1”,Minor:“13”,GitVersion:“v1.13.1”,GitCommit:“eec55b9ba98609a46fee712359c7b5b365bdd920”,GitRestate:“clean”,BuildDate:“2018-12-13T10:31:33Z”,政府版本:“go1.11.2”,编译器:“gc”,平台:“linux/amd64”}`

    匹配节点选择器是我在工作节点重新启动后观察到的pod状态。它出现在使用
    .spec.nodeSelector
    节的POD上。发生了什么:

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

  • 参考:和

    匹配节点选择器
    是我在工作节点重新启动后观察到的pod状态。它出现在使用
    .spec.nodeSelector
    节的POD上。发生了什么:

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

  • 参考:和

    可能将节点选择器设置为现有节点名,然后停止节点。我尝试过这种方法。Pod状态未变为MatchNodeSelector。您正在使用哪个版本的k8s,并且已将其更新到哪个版本。还有你是如何更新它的。也许将节点选择器设置为一个现有的节点名,然后停止节点。我尝试过这种方法。Po
     "spec": {
         "affinity": {
            "nodeAffinity": {
              "requiredDuringSchedulingIgnoredDuringExecution": {
                "nodeSelectorTerms": [
                  {
                    "matchExpressions": [
                      {
                        "key": "kubernetes.io/hostname",
                        "operator": "In",
                        "values": [
                          "new node name"
                        ]
                      }
                    ]
                  }
                ]
              }
            }
          }
        }