Pod节点亲和性 ¶
pod自身的亲和性调度有两种表示形式
- podAffinity:
- pod和pod 更倾向腻在一起,把相近的pod结合到相近的的位置,如同一区域,同一机架,这样的话pod和pod之间更好通信,比方说有两个机房,这两个机房部署的集群有1000台主机,那么我们希望把nginx和tomcat都部署同一个地方的nodde节点上,可以提高通信效率;
- podAntiAffinity:
- pod和pod更倾向不腻在一起,如果部署两套程序,那么这两套程序更倾向于反亲和性,这样相互之间不会有影响。第一个pod随机选则一个节点,做为评判后续的pod能否到达这个pod所在的节点上的运行方式,这就称为pod亲和性;我们怎么判定哪些节点是相同位置的,哪些节点是不同位置的;我们在定义pod亲和性时需要有一个前提,哪些pod在同一个位置,哪些pod不在同一个位置,这个位置是怎么定义的,标准是什么?以节点名称为标准,这个节点名称相同的表示是同一个位置,节点名称不相同的表示不是一个位置。
Pod 亲和性调度: podAffinity 和 podAntiAffinity 调度的两种类型
-
requiredDuringSchedulingIgnoredDuringExecution:
- 这是一个必需的规则,它要求Pod在调度时满足亲和性或反亲和性规则。如果无法满足规则,Pod将不会被调度。在运行时,这个规则将被忽略,即使在后续的调度过程中,不满足规则的条件也会被忽略。
-
preferredDuringSchedulingIgnoredDuringExecution:
- 这是一个首选的规则,它希望Pod满足亲和性或反亲和性规则,但如果无法满足,Pod仍然可以被调度。调度器会尽量遵循这个规则,但在某些情况下,可能会违反它。
Pod 亲和性与反亲和性 ¶
Pod 亲和性
亲和性规则规定,只有节点属于特定的 区域 且该区域中的其他 Pod 已打上 security=S1 标签时,调度器才可以将示例 Pod 调度到此节点上。 例如,如果我们有一个具有指定区域(称之为 "Zone V")的集群,此区域由带有 topology.kubernetes.io/zone=V 标签的节点组成,那么只要 Zone V 内已经至少有一个 Pod 打了 security=S1 标签, 调度器就可以将此 Pod 调度到 Zone V 内的任何节点。相反,如果 Zone V 中没有带有 security=S1 标签的 Pod, 则调度器不会将示例 Pod 调度给该区域中的任何节点。
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 它要求Pod在调度时满足亲和性或反亲和性规则。如果无法满足规则,Pod将不会被调度。
- labelSelector:
matchExpressions:
- key: security
operator: In # 你可以针对 Pod 间亲和性与反亲和性为其 operator 字段使用 In、NotIn、Exists、 DoesNotExist 等值。
values:
- S1
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: registry.k8s.io/pause:2.0
-
执行(Apply)此清单来创建一个调度到所选节点上的 Pod:
kubectl apply -f with-pod-affinity.yaml
Pod 反亲和性
反亲和性规则规定,如果节点属于特定的 区域 且该区域中的其他 Pod 已打上 security=S2 标签,则调度器应尝试避免将 Pod 调度到此节点上。 例如,如果我们有一个具有指定区域(我们称之为 "Zone R")的集群,此区域由带有 topology.kubernetes.io/zone=R 标签的节点组成,只要 Zone R 内已经至少有一个 Pod 打了 security=S2 标签, 调度器应避免将 Pod 分配给 Zone R 内的任何节点。相反,如果 Zone R 中没有带有 security=S2 标签的 Pod, 则反亲和性规则不会影响将 Pod 调度到 Zone R。
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 这是一个首选的规则,它希望Pod满足亲和性或反亲和性规则,但如果无法满足,Pod仍然可以被调度。
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In # 你可以针对 Pod 间亲和性与反亲和性为其 operator 字段使用 In、NotIn、Exists、 DoesNotExist 等值。
values:
- S2
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: registry.k8s.io/pause:2.0
-
执行(Apply)此清单来创建一个调度到所选节点上的 Pod:
kubectl apply -f with-pod-affinity.yaml