K8S亲和反亲和介绍[1]nodeSelector提供了一种非常简单的方法来将pod约束到具有特定标签的节点。亲和/反亲和功能极大地扩展了您可以表达的约束类型。关键增强点是(1)语言更具表现力(不仅仅是“精确匹配AND”)和(2)你可以发现规则是“软”/“偏好”而不是硬要求,所以如果调度程序不能满足这个要求,仍然调度pod(3)可以使用pod在节点(或其他拓扑域)上的标签来约束,而不是使用节点本身的标签,允许哪些pod可以放置,哪些不可以放置onTogetheraffinityfeature包含两种类型的affinity,nodeaffinityinter-podaffinity/anti-affinitynodeaffinity就像现有的nodeSelector(但有上面列出的前两个好处),但是inter-podaffinity和/anti-affinityconstraintspod标签而不是节点标签(在上面列出的第三项中描述,除了上面列出的第一和第二个属性)。Nodeaffinity[1]Nodeaffinity在概念上类似于nodeSelector,它允许您根据节点上的标签来约束pod可以调度到哪些节点。nodeaffinity目前有两种:requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution第一种可以把他们当成hardaffinity,第二种可以把他们当成softaffinity,也就是说第一种指定pod到一个node的调度必须满足(比如nodeSelector但具有更具表现力的语法),第二个指定调度程序将尝试执行但不能保证节点将被调度。名称的IgnoredDuringExecution部分意味着,与nodeSelector的工作方式类似,如果节点的标签在运行时发生更改,从而不再满足pod上的关联规则,则pod仍将继续在该节点上运行。Inter-podaffinityandanti-affinity[1]Inter-podaffinity和anti-affinity允许你根据已经在节点上运行的pod的标签来约束pod可以调度到的节点,而不是基于标签在节点上。规则的格式是,如果一个或多个满足规则Y的pod已经在节点X上运行,那么这个pod应该(或不应该,在非亲和性的情况下)在节点X上运行。Y表示带有可选的关联名称空间列表的LabelSelector;与节点不同,由于Pod是命名空间限定的(因此Pod上的标签也是命名空间限定的),作用于Pod标签的标签选择器必须指定一个选择,在哪个命名空间中应用服务器。从概念上讲,X是一个拓扑域,例如节点、机架、云提供商区域、云提供商区域等。您可以使用topologyKey来表示它,它是系统用来表示此类拓扑域的节点标签的键。注意:Inter-Podaffinity和anti-affinity需要大量处理,这会显着减慢大规模集群中的调度。我们不建议在超过几百个节点的集群中使用它们。注意:Pod反亲和性要求节点的标签一致,即集群中的每个节点都必须有一个合适的标签来匹配topologyKey。如果某些或所有节点缺少指定的topologyKey标签,则可能会导致意外行为。和nodeaffinity一样,目前pod亲和和反亲和两种,分别是requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution,分表分别代表“硬”和“软”需求。请参阅前面的节点亲和性部分中的描述。requiredDuringSchedulingIgnoredDuringExecution亲和性的示例是“将服务A和服务B的pod放在同一区域,因为它们之间进行了大量通信”,而preferredDuringSchedulingIgnoredDuringExecution反亲和性的示例是“跨区域分布此服务的pod”(A硬性要求没有意义,因为您可能拥有比区域更多的豆荚)。Pod之间的亲缘关系由PodSpec中affinity字段下的podAffinity字段指定。Pod之间的反亲和性是通过PodSpec中affinity字段下的podAntiAffinity字段指定的。实例1apiVersion:apps/v1kind:Deploymentmetadata:name:nginxnamespace:defaultspec:replicas:2selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-image:nginxname:nginxports:-containerPort:80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:zoneoperator:Invalues:-bj示例1表示使用节点亲和性规则,nginxpod只能放置标签键为区域和标签值在bj的节点上。运算符运算符支持In、NotIn、Exists、DoesNotExist、Gt、Lt。示例2apiVersion:apps/v1kind:Deploymentmetadata:name:nginxnamespace:defaultspec:replicas:2selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-image:nginxname:nginxports:-containerPort:80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:zoneoperator:Invalues:-bjpreferredDuringSchedulingIgnoredDuringDuringExecution:-weight:1preference:matchExpressions:-key:envi节点亲和规则,nginxpod只能放在标签键为zone且标签值为bj的节点。此外,在满足这些条件的节点中,应优先选择标签键为environment且标签值为dev的节点。preferredDuringSchedulingIgnoredDuringExecution中的weight字段取值范围为1-100。对于每一个匹配到所有调度需求(资源请求、RequiredDuringScheduling亲和表达式等)的节点,调度器会迭代这个字段的元素计算求和,如果节点匹配到对应的MatchExpressions,则对求和加一个权重.然后将该分数与该节点的其他优先级函数的分数相结合。总分最高的节点是最优选的。示例3apiVersion:apps/v1kind:Deploymentmetadata:name:nginxnamespace:defaultspec:replicas:2selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-image:nginxname:nginxports:-containerPort:80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:zoneoperator:Invalues:-bjpodAntiAffinity:preferredDuringSchedulingIgnoredDuringDuringExecution:-weight:100podAffinityTerm:labelSelector:matchExpressions:-key:appoperator:在值中:-nginxtopologyKey:"kubernetes.io/hostname"例3表示nginxpod只能放置在标签为keyzone,标签值为bj的节点上。另外,如果节点上已经存在labelSelectorapp:nginx,则无法再调度该节点。(说白了就是每个节点上只能放一个nginxpod)例子4apiVersion:apps/v1kind:Deploymentmetadata:name:nginxnamespace:defaultspec:replicas:2selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginx规范:容器:-图像:nginx名称:nginx端口:-containerPort:80亲和力:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:区域运算符:在值中:-bjpodAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:10podAffinityTerm:labelSelector:matchExpressions:-key:appoperator:Invalues:-nginxtopologyKey:"kubernetes.io/hostname"例4表示nginxpod只能放置标签key为zone和在label值为bj的节点上,尝试把没有labelSelector的app:nginx节点放在最前面。(通俗地说,尽量不要在一个节点上放两个nginxpod)参考链接[1]https://kubernetes.io/zh/docs...本文由YP小站发表!
