我有一个 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 那样均匀分布。
答案 0 :(得分:1)
您可以使用 DeamonSet
代替 Deployment
。 DaemonSet
确保所有(或部分)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。