1. Node维度
-
nodeSelector
-
nodeAffinity
(1)requiredDuringSchedulingIgnoredDuringExecution,和nodeSelector类似,强制(硬)亲和,但功能会比之更加丰富;注意:-nodeSelectorTerms-matchExpressions;
示例如下:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
containers:
- name: with-node-affinity
image: registry.k8s.io/pause:2.0
(2)preferredDuringSchedulingIgnoredDuringExecution,尽力调度到符合的,但不是强制(软)亲和;注意:-weight-preference-matchExpression;
示例如下:
apiVersion: v1
kind: Pod
metadata:
name: with-affinity-anti-affinity
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: label-1
operator: In
values:
- key-1
- weight: 50
preference:
matchExpressions:
- key: label-2
operator: In
values:
- key-2
containers:
- name: with-node-affinity
image: registry.k8s.io/pause:2.0
2. Pod维度
区分说明:Pod亲和性和反亲和性,是基于已经在某节点上运行的Pod的标签来约束Pod可以调度到哪些节点上,而不是节点的标签;
- Pod Affinity
一般是为了高速通信的需求,让Pod最好位于同一个节点、同一个机架、同一个区域; - Pod Anti-affinity
注意:Pod 亲和性和反亲和性需要相当的计算量,因此在大规模集群中会显著降低调度速度。 我们不建议在包含超过100个节点的集群中使用这类设置。
规则说明:如果拓扑键T(topologyKey)上已经运行了一个或者多个符合满足规则R的Pod,那么这个Pod应该亲和性运行在拓扑键T上,或者反亲和性不应该运行在拓扑键T上;这里的T可以看是节点(Node)、机架(Rack)、区域(Zone)等;
示例如下:
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: registry.k8s.io/pause:2.0
3. 综合维度(Node+Pod)
键值属性数据:
- Label
- Annotation
- Taints(Node)或Toleration(Pod)
(1) Taints-Effect
- NoSchedule,仅影响调度过程,对于已有Pod无影响;(如节点新增Pod无法容忍的污点,不会发生驱逐)
- NoExecute,既影响调度过程,也影响已有Pod;(如节点新增Pod无法容忍的污点,必定发生驱逐)
- PreferNoSchedule,即使Pod上没有节点的容忍,也可以调度到该节点上;
给节点添加污点的命令示例:
kubectl taint nodes node1 key1=value1:NoSchedule
给节点移除污点的命令示例:
kubectl taint nodes node1 key1=value1:NoSchedule-
(2) Tolerations-Operator
- Exists,需要Pod的Tolerations的key和effect和Node的Taints的完全匹配;(存在性判断)
示例如下:
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
- Equal,需要Pod的Tolerations的key、value和effect和Node的Taints的完全匹配;(等值比较)
示例如下:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
注意:如果key或者effect为空,则意味着任意皆可匹配;