You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@yunikorn.apache.org by "Wilfred Spiegelenburg (Jira)" <ji...@apache.org> on 2026/10/15 15:49:00 UTC
[jira] [Resolved] (YUNIKORN-3231) ForeignAllocations ignored / not accounted when pods use nodeSelector (works with nodeAffinity)
[ https://issues.apache.org/jira/browse/YUNIKORN-3231?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Wilfred Spiegelenburg resolved YUNIKORN-3231.
---------------------------------------------
Resolution: Duplicate
as mentioned closing as duplicate of YUNIKORN-3317
> ForeignAllocations ignored / not accounted when pods use nodeSelector (works with nodeAffinity)
> -----------------------------------------------------------------------------------------------
>
> Key: YUNIKORN-3231
> URL: https://issues.apache.org/jira/browse/YUNIKORN-3231
> Project: Apache YuniKorn
> Issue Type: Bug
> Environment: Kubernetes: 1.26
> YuniKorn scheduler: 1.8.0
> Reporter: Alex Ovchenkov
> Priority: Major
>
> h2. Description
> We observed that YuniKorn’s *ForeignAllocations* (pods not managed by YuniKorn / allocations coming from outside) may not be accounted correctly when such pods use {*}nodeSelector{*}. As a result, YuniKorn may overestimate node/queue available resources and make scheduling decisions as if those external pods do not exist (or are not tied to the expected nodes).
> When we replace {{nodeSelector}} with an equivalent {{{}nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution{}}}, the behavior becomes correct and ForeignAllocations are accounted as expected.
> h2. *Steps to reproduce*
> h5. 1) Create a pod that is scheduled by Kubernetes default scheduler (or another scheduler) and uses nodeSelector:
>
> {code:java}
> apiVersion: v1
> kind: Pod
> metadata:
> name: foreign-pod-selector
> namespace: <ns>
> spec:
> schedulerName: default-scheduler
> nodeSelector:
> dedicated: test
> containers:
> - name: c
> image: busybox
> command: ["sh", "-c", "sleep 360000"]
> resources:
> requests:
> cpu: "1"
> memory: "1Gi" {code}
> h5. 2) Observe YuniKorn resource accounting / foreign allocations
> Check YuniKorn UI / REST API / state dump and verify whether this pod appears as a foreign allocation and whether its resources are deducted from the node.
> h5. 3) Replace nodeSelector with equivalent nodeAffinity (requiredDuringScheduling)
> Delete the pod and apply the same pod but with nodeAffinity instead:
> {code:java}
> apiVersion: v1
> kind: Pod
> metadata:
> name: foreign-pod-affinity
> namespace: <ns>
> spec:
> schedulerName: default-scheduler
> affinity:
> nodeAffinity:
> requiredDuringSchedulingIgnoredDuringExecution:
> nodeSelectorTerms:
> - matchExpressions:
> - key: dedicated
> operator: In
> values: ["test"]
> containers:
> - name: c
> image: busybox
> command: ["sh", "-c", "sleep 360000"]
> resources:
> requests:
> cpu: "1"
> memory: "1Gi" {code}
> Re-check YuniKorn accounting / foreign allocations.
> ----
> h2. Actual behavior
> * With {*}nodeSelector{*}, the foreign pod is *not consistently* represented in ForeignAllocations / node accounting (or appears without correct node association / resources not deducted).
> * This can lead to YuniKorn scheduling decisions that assume more resources are available on the affected node(s) than in reality.
> ----
> h2. Expected behavior
> * Foreign pods should be accounted consistently regardless of whether the workload uses:
> ** {{{}spec.nodeSelector{}}}, or
> ** {{spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution}}
> * If the pod is bound to a node (and consuming resources), YuniKorn should reflect it in foreign allocations / node resource usage.
> ----
> h2. Notes / hypothesis
> Based on initial investigation, the issue might be related to how foreign pods are processed in {{{}updateForeignPod{}}}:
> [https://github.com/apache/yunikorn-k8shim/blob/master/pkg/cache/context.go#L412]
> It appears that when a pod uses {{{}nodeSelector{}}}, some of its scheduling-related state (possibly node assignment or allocation state) may already be set earlier in the reconciliation flow, which could cause {{updateForeignPod}} to skip or treat it differently.
> In contrast, when equivalent constraints are expressed using {{{}nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution{}}}, the foreign allocation seems to be tracked and accounted correctly.
> This suggests there may be a difference in how {{nodeSelector}} and {{nodeAffinity}} are interpreted or propagated into the internal foreign allocation tracking logic.
> We may be missing some detail in the lifecycle of foreign pod updates, but the observable behavior indicates inconsistent accounting depending on whether {{nodeSelector}} or {{nodeAffinity}} is used.
> ----
>
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@yunikorn.apache.org
For additional commands, e-mail: dev-help@yunikorn.apache.org