这就是我正在使用的。 我在GKE上有3个节点池
我的Pod需要以下任何内存请求。假设限制非常接近请求。
1GB, 2GB, 4GB, 6GB, 8GB, 10GB, 12GB, 14GB
如何最好地将Pod与节点池相关联以实现最大效率?
到目前为止,我有3种策略。
对于每个pod配置,确定 “合法的节点池” 。这是可以在理想环境中容纳Pod配置的最小节点池。 因此,对于2GB的Pod,它是n1s1,但对于4GB的Pod,它将是n1s2。
这些或任何其他策略中的哪一项将最大程度地减少资源浪费?
=======
答案 0 :(得分:1)
为什么首先要有3个这样的游泳池?通常,您希望使用最大的实例类型,使每个节点的实例数少于110个pod(这是默认的硬上限)。调度程序的工作是为您优化打包,使用默认设置可以很好地解决问题。
答案 1 :(得分:1)
我会同时使用Taints and Tolerations和Node 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=groupName
或kubectl taint nodes nodename special=true:NoSchedule
)的节点进行污染,并向使用特殊硬件的Pod添加相应的容差来实现。像在专用节点用例中一样,使用自定义admission controller来应用公差可能是最容易的。例如,建议使用Extended Resources代表特殊硬件,使用扩展资源名称污染特殊硬件节点,并运行ExtendedResourceToleration接纳控制器。现在,由于节点已被污染,因此没有容忍度的吊舱将不会在其上进行调度。但是,当您提交请求扩展资源的Pod时,kubectl taint nodes nodename special=true:PreferNoSchedule
接纳控制器将自动为Pod添加正确的容差,并且该Pod将在特殊的硬件节点上进行调度。这样可以确保这些特殊的硬件节点专用于请求此类硬件的Pod,而您不必手动向Pod添加公差。基于污垢的驱逐:存在节点问题时,可以按每个节点配置驱逐行为,这将在下一部分中进行介绍。
从概念上讲类似于
ExtendedResourceToleration
–它使您可以根据节点上的标签来限制Pod可以在哪些节点上进行调度。当前有两种类型的节点关联性,分别称为
nodeSelector
和requiredDuringSchedulingIgnoredDuringExecution
。您可以将它们分别认为是“硬”和“软”,因为前者指定了必须满足的规则,才能将pod调度到节点上(就像{{1} },但使用更具表现力的语法),而后者指定了 preferences ,调度程序会尝试执行该参数,但不能保证。名称的“ IgnoredDuringExecution”部分意味着,类似于preferredDuringSchedulingIgnoredDuringExecution
的工作方式,如果节点上的标签在运行时发生更改,从而不再满足Pod上的相似性规则,则该Pod仍将继续运行节点。将来,我们计划提供nodeSelector
,其与nodeSelector
相似,只是它将从不再满足节点的节点亲和力要求的节点中逐出节点。因此,
requiredDuringSchedulingRequiredDuringExecution
的示例将是“仅在装有Intel CPU的节点上运行Pod”,而requiredDuringSchedulingIgnoredDuringExecution
的示例将是“尝试在故障区域XYZ中运行这组Pod,但是如果这是不可能的,那就让它们在其他地方运行。”节点相似性在PodSpec中的字段
requiredDuringSchedulingIgnoredDuringExecution
的字段preferredDuringSchedulingIgnoredDuringExecution
中指定。...
新的节点相似性语法支持以下运算符:
nodeAffinity
,affinity
,In
,NotIn
,Exists
,DoesNotExist
。您可以使用Gt
和Lt
来实现节点的反亲和行为,也可以使用node taints排斥特定节点的吊舱。如果同时指定
NotIn
和DoesNotExist
,则必须同时满足两者才能将广告连播安排到候选节点上。如果您指定与
nodeSelector
类型关联的多个nodeAffinity
,则只有在满足所有nodeSelectorTerms
的情况下,才能将Pod调度到节点上。 / p>如果您指定与
nodeAffinity
关联的多个nodeSelectorTerms
,则可以将Pod调度到节点上。如果满足matchExpressions
之一。