为每个节点传播特定数量的部署 Pod

时间:2021-06-13 12:43:43

标签: kubernetes amazon-eks

我有一个 EKS 节点组,其中包含 2 个用于计算工作负载的节点。我在部署中对这些节点和容忍度使用了污点。我有一个包含 2 个副本的部署,我希望这两个 Pod 分布在这两个节点上,就像每个节点上一个 Pod 一样。

我尝试使用:

affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - appname

每个 pod 都放在每个节点上,但是如果我更新部署文件(例如更改其映像名称),它就无法安排新的 pod。

我也试过:

      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: type
          whenUnsatisfiable: DoNotSchedule
          labelSelector:
            matchLabels:
              type: compute

但它们不像一个节点上的 2 个 Pod 那样均匀分布。

2 个答案:

答案 0 :(得分:1)

您可以使用 DeamonSet 代替 DeploymentDaemonSet 确保所有(或部分)Nodes 运行 Pod 的副本。随着节点被添加到集群中,Pod 也会被添加到它们中。随着节点从集群中移除,这些 Pod 将被垃圾收集。删除 DaemonSet 将清理它创建的 Pod。

查看 Deamonset 的文档

答案 1 :(得分:1)

尝试添加:

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1

默认情况下,K8s 会在开始缩减旧副本之前先尝试扩展新副本集。由于它无法调度新的副本(因为反关联性),它们会停留在待处理状态。

一旦您设置了部署的 maxSurge=0,您就告诉 k8s,您不希望部署在更新期间首先扩展,因此它只能缩小规模,为要安排的新副本腾出空间。

>

设置 maxUnavailable=1 告诉 k8s 一次只替换一个 pod。