我有一个反亲和性规则,要求kubernetes将来自同一部署的Pod调度到different nodes上,我们已经使用了很长时间了。
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: application
operator: In
values:
- {{ $appName }}
- key: proc
operator: In
values:
- {{ $procName }}
我正在尝试将Pod关联性规则更新为强烈的偏好设置,而不是硬性要求,因此,如果部署中需要的副本数超过可用节点数,则无需扩展集群。
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
weight: 100
labelSelector:
matchExpressions:
- key: application
operator: In
values:
- {{ $appName }}
- key: proc
operator: In
values:
- {{ $procName }}
但是,当我尝试应用新规则时,topologyKey出现意外错误:
Error: Deployment.apps "core--web" is invalid:
[spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey: Required value: can not be empty,
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey: Invalid value: "": name part must be non-empty,
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey: Invalid value: "": name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')]
即使我的所有节点都有与正则表达式匹配的指定键的标签,调度程序似乎也为拓扑键获取了空字符串值:
$ kubectl describe nodes | grep kubernetes.io/hostname
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
我不希望通过从必需到首选的简单更改就看到这样的问题。我搞砸了什么导致topologyKey错误?
最佳答案
必需和首选语法之间有细微差别,请注意错误消息路径中对podAffinityTerm
的引用:
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey
首选计划的正确语法为:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: application
operator: In
values:
- {{ $appName }}
- key: proc
operator: In
values:
- {{ $procName }}
请注意,
weight
是顶级密钥,带有podAffinityTerm
的同级兄弟,其中包含topologyKey
和labelSelector
。关于kubernetes - 具有拓扑键的反亲和性规则部署失败:kubernetes.io/hostname-必需值:不能为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56224595/