Kubernetes 在库伯内特斯,首选的豆荚间亲缘关系从未受到尊重

Kubernetes 在库伯内特斯,首选的豆荚间亲缘关系从未受到尊重,kubernetes,Kubernetes,我有一个jenkinspod,标签是app:jenkins master 这驻留在jenkins名称空间中 我希望部署的nginxpod(在另一个命名空间上,default)与上述pod并置 因此,我在其规范中添加了以下内容: spec: affinity: podAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm:

我有一个
jenkins
pod,标签是
app:jenkins master

这驻留在
jenkins
名称空间中

我希望部署的
nginx
pod(在另一个命名空间上,
default
)与上述pod并置

因此,我在其规范中添加了以下内容:

spec:
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          namespaces:
            - all
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - jenkins-master
          topologyKey: "kubernetes.io/os"
我有一个由8个节点组成的GKE集群

在我创建/删除部署的5-6次中,
nginx
pod实际上从未与
jenkins master
降落在同一个节点上

我知道这是
首选的计划,但这种行为正常吗

使用
v1.15.9-GKE.24“

编辑1:我已经更改了
拓扑:“kubernetes.io/hostname”
,正如下面几个答案中所建议的那样,但这也没有多大帮助

编辑2:这些是为计划在其上运行的
jenkins master
pod节点分配的资源

  Resource                   Requests      Limits
  cpu                        1691m (43%)   5013m (127%)
  memory                     4456Mi (33%)  8902Mi (66%)
由于调度是基于请求的,所以我不理解下面的部署如何无法并置,我发出的请求是最小的

resources:
  limits:
    memory: "1Gi"
    cpu: "100m"
   requests:
    memory: "100Mi"
    cpu: "50m"

我认为您使用了
topologyKey:“kubernetes.io/os”
是一个错误,如果您在集群中混合使用操作系统(例如:混合Linux和Windows节点),则会使用该选项


您应该使用:
topologyKey:“kubernetes.io/hostname”
,其中Kubelet用主机名填充此标签。

我认为您在使用
topologyKey:“kubernetes.io/os”
时犯了一个错误,如果您在集群中混合使用操作系统(例如:混合Linux和Windows节点)


您应该使用:
topologyKey:“kubernetes.io/hostname”
,其中Kubelet用主机名填充此标签。

我假设您知道
拓扑
指的是在集群初始化时自动提供给节点的一些标签

因此,
topology
将节点分组为一个节点(通过这些标签),因此当您说
topologyKey:“kubernetes.io/os”
时,您是说选择属于该组的节点,并在其上安排pod。因为您的所有节点可能都有相同的操作系统,所以对于您的调度程序来说,它是一个可以运行的有效节点。所以,是的,这是故意的行为

请注意,这仍然是一个首选项,但如果有足够的资源,它仍将尝试在正确的节点上进行调度


你要做的是什么是建议omricoco<代码>拓扑键:“kubernetes.io/hostname”
。您需要让调度程序按主机名分组,因此每个组只有1个节点,并且要调度的pod将位于同一节点上

我假设您知道,
拓扑
指的是在集群初始化时自动为节点提供的一些标签

因此,
topology
将节点分组为一个节点(通过这些标签),因此当您说
topologyKey:“kubernetes.io/os”
时,您是说选择属于该组的节点,并在其上安排pod。因为您的所有节点可能都有相同的操作系统,所以对于您的调度程序来说,它是一个可以运行的有效节点。所以,是的,这是故意的行为

请注意,这仍然是一个首选项,但如果有足够的资源,它仍将尝试在正确的节点上进行调度


你要做的是什么是建议omricoco<代码>拓扑键:“kubernetes.io/hostname”。您需要让调度程序按主机名分组,因此每个组只有1个节点,并且要调度的pod将位于同一节点上

我的问题是:即使有多个节点匹配
topologyKey:“kubernetes.io/os”
约束,为什么满足标签匹配条件的节点不占上风?顺便说一句,更改为
topologyKey:“kubernetes.io/hostname”
并不能帮助您的节点拥有相同的标签,所以他们都很满意。你说没有帮助是什么意思?有房间,但没有安排在那里?然后设置一个要求。我的问题如下:即使有多个节点匹配
topologyKey:“kubernetes.io/os”
约束,为什么满足标签匹配条件的节点不占上风?顺便说一句,更改为
topologyKey:“kubernetes.io/hostname”
并不能帮助您的节点拥有相同的标签,所以他们都很满意。你说没有帮助是什么意思?有房间,但没有安排在那里?然后设置一个需求。当您从
preferred
更改为
required
时,是否也会发生同样的情况?根据设计,调度器应尽可能在同一节点上部署带有拓扑的POD:“kubernetes.io/hostname”。当您从
prefered
更改为
required
时,是否也会发生同样的情况?根据设计,调度器应尽可能在同一节点上部署带有拓扑的POD:“kubernetes.io/hostname”。