假设我有一个标有标签的节点myKey1: 2
,myKey2: 5
,myKey3: 3
,myKey4: 6
.我现在想检查其中一个标签的值是否大于 4,如果是,则在此节点上安排我的工作负载。为此,我使用以下nodeAffinity
规则:
spec:
containers:
- name: wl1
image: myImage:latest
imagePullPolicy: IfNotPresent
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: myKey1
operator: Gt
values:
- 4
nodeSelectorTerms:
- matchExpressions:
- key: myKey2
operator: Gt
values:
- 4
nodeSelectorTerms:
- matchExpressions:
- key: myKey3
operator: Gt
values:
- 4
nodeSelectorTerms:
- matchExpressions:
- key: myKey4
operator: Gt
values:
- 4
相反,我喜欢使用更短的东西来处理一堆类似的标签,例如
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: myKey*
operator: Gt
values:
- 4
所以基本上使用key
通配符和通过逻辑OR
连接的不同检查。这是否可能,或者是否有其他解决方案来检查多个相似标签的值?
正如Matthias M在评论中写道:
我会为所有节点添加一个额外的标签,它应该匹配。我认为这是最简单的解决方案。这对你来说也是一个解决方案吗?kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node
在您的情况下,实际上只需添加另一个键并仅检查一个条件会更容易。或者,您可以尝试使用基于集的值:
较新的资源,如
Job
、Deployment
、ReplicaSet
和DaemonSet
,也支持基于集的需求。
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
matchLabels
是{key,value}
对的地图。matchLabels
映射中的单个{key,value}
相当于matchExpressions
的一个元素,其key
字段为"key",operator
为"In",values
数组仅包含"值"。matchExpressions
是容器选择器要求的列表。有效运算符包括 In、NotIn、Exists 和 DoesNotExist。在 In 和 NotIn 的情况下,设置的值必须为非空。来自matchLabels
和matchExpressions
的所有要求都一起进行了AND--它们都必须得到满足才能匹配。
有关它的更多信息,请阅读此问题。