我有一个反亲和性规则,要求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的同级兄弟,其中包含topologyKeylabelSelector

关于kubernetes - 具有拓扑键的反亲和性规则部署失败:kubernetes.io/hostname-必需值:不能为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56224595/

10-16 09:16