首页 > 解决方案 > 不允许同一应用程序的两个 Pod 在 Kubernetes 中的同一节点上

问题描述

我们现在的情况是 2 个相同类型的 Pod 可以在同一个节点上运行。有时在重启和重新调度期间,2 个 Pod 恰好在同一个节点上,而当重新调度这个节点本身时,我们所有的 Pod 都消失了一段时间,导致连接出现问题(我们只有 2 个负载均衡的 Pod)。

我认为修复它的最佳方法是不允许 2 个 pod 在同一个节点上运行,并为此使用跨 pod 反亲和性。

这是解决问题的正确方法吗?topologyKey我试图理解它,但对它的语法有点困惑。有人可以解释/举例说明如何实现这一目标吗?

标签: kubernetes

解决方案


是的,你是对的 Affinity 是你的朋友,是正确的解决方案。

Node Affinity :将帮助您的应用程序或微服务坚持特定类型的节点(在多节点架构中),如下所示我的应用程序ngnix-ms始终坚持具有标签的节点role=admin

pod antiAffinity 规则:坚持节点标签(topologyKey)并确保节点组(用 topologyKey 标记)。

如果有一个节点已经有一个带有标签的 pod component=nginx,K8s 将不允许启动一个 pod。

这是解释:

affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
            - key: role
              operator: In
              values:
              - app-1
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: component
                operator: In
                values:
                - nginx-ms
          topologyKey: "kubernetes.io/1-hostname"

kubectl get node --show-labels
    
NAME                  STATUS   ROLES    AGE   VERSION   LABELS
xx-admin-1      Ready    master   19d   v1.13.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/1-hostname=xx-admin-1,node-role.kubernetes.io/master=,role=admin
xx-admin-2      Ready    master   19d   v1.13.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/1-hostname=xx-admin-2,node-role.kubernetes.io/master=,role=admin
xx-plat-1-1     Ready    <none>   19d   v1.13.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/2-hostname=xx-plat-1-1,role=admin
xx-plat-2-1     Ready    <none>   19d   v1.13.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/2-hostname=xx-plat-2-1,role=admin

topologyKey 的解释:把它想象成一个标签,现在你可以在同一个集群中有两个不同的拓扑。

示例:kubernetes.io/1-hostnamekubernetes.io/2-hostname

现在,当你在做 podAntiAffinity 时,你设置了 `topologyKey:

kubernetes.io/1-hostname

topologyKey: kubernetes.io/2-hostname那么您的规则在具有该 topologyKey 的所有节点中都有效,但您的规则在标记节点中无效。

因此,在我的示例中,pod 被安排在带有标签的节点内,kubernetes.io/1-hostname并且隐含了 podAntiAffinity,但带有标签kubernetes.io/2-hostname的节点没有 podAntiAffinity 规则!


推荐阅读