namespaces - Kubernetes - pod FailedScheduling 由于“没有与所有谓词匹配的可用节点:MatchInterPodAffinity (1)”。
问题描述
我正在尝试创建一个部署,该部署创建两个 Pod,其节点 IP 与两个现有 Pod 匹配。为此,我将 PodAffinity 定义如下
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- {{ .Values.albId }}
topologyKey: "{{ .Values.topologyKey }}"
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- {{ .Values.name }}
topologyKey: "{{ .Values.topologyKey }}"
由于我要在其中创建新 pod 的命名空间与我引用现有 pod 的命名空间不同,因此 PodAffinity 失败。Pod 仍处于待处理状态,当我确实描述 pod 时出现以下错误
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
28s 13s 6 default-scheduler Warning FailedScheduling No nodes are available that match all of the predicates: MatchInterPodAffinity (1).
从 k8s docs- https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity-alpha-feature发现,我应该在 PodAffinity 和将其初始化为空列表以允许跨命名空间 PodAffinity。
但是我没有从网上得到任何关于如何将命名空间初始化为空列表的例子。
请在这方面需要帮助。
解决方案
从您链接的文档中:
除了 labelSelector 和 topologyKey 之外,您还可以选择指定 labelSelector 应该匹配的命名空间列表(这与 labelSelector 和 topologyKey 的定义级别相同)。如果省略,则默认为出现亲和/反亲和定义的 pod 的命名空间。如果已定义但为空,则表示“所有命名空间”</p>
这是基于您的 yaml 的示例:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- {{ .Values.albId }}
topologyKey: "{{ .Values.topologyKey }}"
namespaces: [] # empty array
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- {{ .Values.name }}
topologyKey: "{{ .Values.topologyKey }}"
namespaces: []