微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kubernetes 反关联规则将部署 Pod 传播到至少 2 个节点

如何解决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

replica_1安排在node_areplica_2安排在node_breplica_3安排在 node_c

因此,我将每个 Pod 安排在不同的节点上。

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

nodes(a,3) = 3

replica_1安排在node_areplica_2安排在node_breplica_3安排(再次)在node_a

所以,总而言之,我想要一个更软的约束,它允许我保证将 Deployment 的副本分布在至少 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

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

- key: kubernetes.io/hostname

values:
- worker-1
- worker-2

设置以下行很重要:

- maxSkew: 1

根据documentation

ma​​xSkew 描述了 Pod 可能分布不均的程度。它必须大于零。

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

本节:

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

是可选的,但是它可以让您更好地调整免费节点上的提要分布。 Here 您可以找到以下差异的说明:requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution

因此,requiredDuringSchedulingIgnoredDuringExecution 的示例将是“仅在具有 Intel CPU 的节点上运行 pod”,示例 preferredDuringSchedulingIgnoredDuringExecution 将是“尝试在故障区域 XYZ 中运行这组 pod,但如果这是不可能的,然后允许一些在别处运行”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。