NodeAffinity意为Node 亲和性的调度策略,是用于替换NodeSelector 的全新调度策略。目前有两种节点亲和性表达。
(1)RequiredDuringSchedulingIgnoredDuringExecution: 必须满足指定的规则才可以调度Pod 到Node 上(功能与nodeSelector很像,但是使用的是不同的语法),相当于硬限制。
(2)PreferredDuringSchedulingIgnoredDuringExecution: 强调优先满足指定规则,调度器会尝试调度Pod 到 Node 上,但是并不强求,相当于软限制。多个优先级规则还可以设置权重(weight)值,以定义执行的先后顺序。
IgnoredDuringExecution的意思是:如果一个Pod 所在的节点在Pod 运行期间标签发生变更,不再符合该Pod 的节点亲和性需求,则系统将忽略Node 上Label 的变化,该Pod 能继续在该节点上运行。
下面的例子设置了NodeAffinity 调度的如下规则。
(1)requiredDuringSchedulingIgnoredDuringExecution:要求只运行在amd64的节点上(beta.kubernetes.io/arch In amd64)。
(2)preferredDuringSchedulingIgnoredDuringExecution:要求尽量运行在磁盘类型为ssd(disk-type In ssd)的节点上。
代码如下:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoreDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disk-type
operator: In
values:
- ssd
containers:
- name: with-node-affinity
image: gcr.io/gooler_containers/pause:2.0
从上面的配置中可以看到In 操作符,NodeAffinity 语法支持的操作符包括In,NotIn,Exists,DoesNotExists,Gt,Lt 。虽然没有节点排斥功能,但是用NotIn 和 DoesNotExist就可以实现排斥的功能了。
NodeAffinity 规则设置的注意事项如下:
(1)如果同时定义了NodeSelector 和 nodeAffinity ,那么必须两个条件都得到满足,Pod才能最终运行在指定的Node 上。
(2)如果nodeAffinity 指定了多个NodeSelectorTerms,那么其中一个能匹配成功即可。
(3)如果在nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有matchExpressions 才能运行该Pod。