Kubernetes反亲和性规则,将部署Pod扩展到至少2个节点 [英] Kubernetes anti-affinity rule to spread Deployment Pods to at least 2 nodes

查看:13
本文介绍了Kubernetes反亲和性规则,将部署Pod扩展到至少2个节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在K8S部署中配置了以下反关联规则:

spec:
  ...
  selector:
    matchLabels:
      app: my-app
      environment: qa
  ...
  template:
    metadata:
      labels:
        app: my-app
        environment: qa
        version: v0
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - my-app
            topologyKey: kubernetes.io/hostname

在其中我说我不希望在我的K8S集群的节点上调度任何Pod副本,在该节点中已经存在相同应用程序的Pod。因此,例如,拥有:

nodes(a,b,c) = 3
replicas(1,2,3) = 3

副本_1计划于node_a副本_2计划于node_b副本_3计划于node_c

因此,我将每个Pod计划在不同的节点中。

但是,我想知道是否有办法指定:我希望将我的Pod分布在至少2个节点中,以保证高可用性而不将所有Pod分布到其他节点,例如:

nodes(a,b,c) = 3
replicas(1,2,3) = 3

副本_1计划于node_a副本_2计划于node_b副本_3计划于node_a

因此,总而言之,我希望有一个更软的约束,它允许我保证高可用性将部署的副本分布在至少2个节点上,而不必为特定应用程序的每个Pod启动一个节点。

谢谢!

推荐答案

我想我找到了您问题的解决方案。请看以下示例YAML文件:

spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
    matchLabels:
      example: app
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - worker-1
            - worker-2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 50
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - worker-1

此配置的想法: 我在这里使用nodeAffacy来指示哪些节点pod可以放置:

- key: kubernetes.io/hostname

values:
- worker-1
- worker-2

请务必设置以下行:

- maxSkew: 1

根据documentation

max Skew描述实例可能分布不均匀的程度。它必须大于零。

正因为如此,节点之间分配的提要数量的差异将始终最大等于1。

此部分:

      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 50
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - worker-1

是可选的,但是它将允许您更好地调整空闲节点上的提要分布。Here您可以找到具有以下差异的说明:requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution

因此,requiredDuringSchedulingIgnoredDuringExecution的示例是仅在具有英特尔CPU的节点上运行Pod;而preferredDuringSchedulingIgnoredDuringExecution的示例是尝试在故障区XYZ中运行这组Pod,但如果不可能,则允许某些Pod在其他位置运行。

这篇关于Kubernetes反亲和性规则,将部署Pod扩展到至少2个节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆