K8吊舱的最佳调度策略是什么?

时间:2020-04-24 21:54:02

标签: kubernetes scheduling

这就是我正在使用的。 我在GKE上有3个节点池

  1. n1s1(3.75GB)
  2. n1s2(7.5GB)
  3. n1s4(15GB)

我的Pod需要以下任何内存请求。假设限制非常接近请求。

1GB, 2GB, 4GB, 6GB, 8GB, 10GB, 12GB, 14GB

如何最好地将Pod与节点池相关联以实现最大效率?

到目前为止,我有3种策略。

对于每个pod配置,确定 “合法的节点池” 。这是可以在理想环境中容纳Pod配置的最小节点池。 因此,对于2GB的Pod,它是n1s1,但对于4GB的Pod,它将是n1s2。

  1. 仅在其合法节点池上安排广告连播。
  2. 仅在其合法节点池或高于其的一个节点池上安排广告连播。
  3. 仅在当前可以运行的任何节点池上调度Pod。

这些或任何其他策略中的哪一项将最大程度地减少资源浪费?

=======

2 个答案:

答案 0 :(得分:1)

为什么首先要有3个这样的游泳池?通常,您希望使用最大的实例类型,使每个节点的实例数少于110个pod(这是默认的硬上限)。调度程序的工作是为您优化打包,使用默认设置可以很好地解决问题。

答案 1 :(得分:1)

我会同时使用Taints and TolerationsNode affinity

污渍和容忍度共同作用,以确保将豆荚安排在不适当的节点上。一个或多个污点应用于节点;这表明该节点不应接受任何不能容忍污点的吊舱。容差应用于吊舱,并允许(但不要求)吊舱调度到具有匹配污点的节点上。

您可以在节点kubectl taint nodes node1 key=value:NoSchedule上设置污点

异味具有键key,值value和异味效果NoSchedule。这意味着除非具有匹配的容差,否则任何pod都无法将其调度到node1上。

在编写pod yaml时,您可以指定PodSpec并添加容差,该容差将与在node1上创建的污点相匹配,从而允许pod带有任意容差排定到node1

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"

污渍和容忍度是一种灵活的方法,可将pod移出不应运行的节点或逐出pod。一些用例是

  • 专用节点:如果要专用于一组特定用户的专用节点集,则可以在这些节点上添加异味(例如,{{1} }),然后向其吊舱添加相应的公差(通过编写自定义admission controller最容易做到)。然后将允许具有容忍度的Pod使用受污染的(专用)节点以及群集中的任何其他节点。如果您想将节点专用于 并确保它们 仅使用专用节点,则应在同一节点集上另外添加类似于异味的标签(例如kubectl taint nodes nodename dedicated=groupName:NoSchedule),准入控制器应另外添加一个节点亲和力,以要求Pod只能调度到标有dedicated=groupName的节点上。

  • 具有特殊硬件的节点:在一小部分节点具有特殊硬件(例如GPU)的群集中,最好保留不需要特殊硬件的Pod在这些节点之外,因此为以后需要专用硬件的Pod留出了空间。这可以通过对具有专用硬件(例如dedicated=groupNamekubectl taint nodes nodename special=true:NoSchedule)的节点进行污染,并向使用特殊硬件的Pod添加相应的容差来实现。像在专用节点用例中一样,使用自定义admission controller来应用公差可能是最容易的。例如,建议使用Extended Resources代表特殊硬件,使用扩展资源名称污染特殊硬件节点,并运行ExtendedResourceToleration接纳控制器。现在,由于节点已被污染,因此没有容忍度的吊舱将不会在其上进行调度。但是,当您提交请求扩展资源的Pod时,kubectl taint nodes nodename special=true:PreferNoSchedule接纳控制器将自动为Pod添加正确的容差,并且该Pod将在特殊的硬件节点上进行调度。这样可以确保这些特殊的硬件节点专用于请求此类硬件的Pod,而您不必手动向Pod添加公差。

  • 基于污垢的驱逐:存在节点问题时,可以按每个节点配置驱逐行为,这将在下一部分中进行介绍。

关于node affinity

从概念上讲类似于ExtendedResourceToleration –它使您可以根据节点上的标签来限制Pod可以在哪些节点上进行调度。

当前有两种类型的节点关联性,分别称为nodeSelectorrequiredDuringSchedulingIgnoredDuringExecution。您可以将它们分别认为是“硬”和“软”,因为前者指定了必须满足的规则,才能将pod调度到节点上(就像{{1} },但使用更具表现力的语法),而后者指定了 preferences ,调度程序会尝试执行该参数,但不能保证。名称的“ IgnoredDuringExecution”部分意味着,类似于preferredDuringSchedulingIgnoredDuringExecution的工作方式,如果节点上的标签在运行时发生更改,从而不再满足Pod上的相似性规则,则该Pod仍将继续运行节点。将来,我们计划提供nodeSelector,其与nodeSelector相似,只是它将从不再满足节点的节点亲和力要求的节点中逐出节点。

因此,requiredDuringSchedulingRequiredDuringExecution的示例将是“仅在装有Intel CPU的节点上运行Pod”,而requiredDuringSchedulingIgnoredDuringExecution的示例将是“尝试在故障区域XYZ中运行这组Pod,但是如果这是不可能的,那就让它们在其他地方运行。”

节点相似性在PodSpec中的字段requiredDuringSchedulingIgnoredDuringExecution的字段preferredDuringSchedulingIgnoredDuringExecution中指定。

...

新的节点相似性语法支持以下运算符:nodeAffinityaffinityInNotInExistsDoesNotExist。您可以使用GtLt来实现节点的反亲和行为,也可以使用node taints排斥特定节点的吊舱。

如果同时指定NotInDoesNotExist,则必须同时满足两者才能将广告连播安排到候选节点上。

如果您指定与nodeSelector类型关联的多个nodeAffinity,则只有在满足所有 nodeSelectorTerms的情况下,才能将Pod调度到节点上。 / p>

如果您指定与nodeAffinity关联的多个nodeSelectorTerms,则可以将Pod调度到节点上。如果满足matchExpressions之一