kubernetes的POD拓扑约束设置

410 阅读2分钟

k8s创建的deployment的副本数比较多,发现POD调度的时候只在个别节点调度,节点调度很不均匀,准备通过POD的拓扑约束来解决这样的情况。

说明: 在 v1.19 之前的 Kubernetes 版本中,如果要使用 Pod 拓扑扩展约束,你必须在 API 服务器 和调度器 中启用 EvenPodsSpread 特性门控

开启方式:

在 /etc/kubernetes/manifests/kube-apiserver.yaml 和 /etc/kubernetes/manifests/kube-scheduler.yaml 文件中添加下面一行

#在⽂件中添加

  • --feature-gates=EvenPodsSpread=true

yaml文件中使用拓扑约束

apiVersion: v1 
 kind: Pod 
 metadata: 
   name: mypod 
 spec: 
   topologySpreadConstraints: 
     - maxSkew: <integer> 
       topologyKey: <string> 
       whenUnsatisfiable: <string> 
       labelSelector: <object>
  • maxSkew 描述 Pod 分布不均的程度。这是给定拓扑类型中任意两个拓扑域中 匹配的 pod 之间的最大允许差值。它必须大于零。取决于 whenUnsatisfiable 的 取值,其语义会有不同。

    • 当 whenUnsatisfiable 等于 "DoNotSchedule" 时,maxSkew 是目标拓扑域 中匹配的 Pod 数与全局最小值之间可存在的差异。
    • 当 whenUnsatisfiable 等于 "ScheduleAnyway" 时,调度器会更为偏向能够降低 偏差值的拓扑域。
  • topologyKey 是节点标签的键。如果两个节点使用此键标记并且具有相同的标签值, 则调度器会将这两个节点视为处于同一拓扑域中。调度器试图在每个拓扑域中放置数量 均衡的 Pod。

  • whenUnsatisfiable 指示如果 Pod 不满足分布约束时如何处理:

    • DoNotSchedule(默认)告诉调度器不要调度。
    • ScheduleAnyway 告诉调度器仍然继续调度,只是根据如何能将偏差最小化来对 节点进行排序。
  • labelSelector 用于查找匹配的 pod。匹配此标签的 Pod 将被统计,以确定相应 拓扑域中 Pod 的数量。 有关详细信息,请参考标签选择算符