Skip to content

Local e2e can't verify fleet scheduler placement (single workload node) #367

Description

@ytsarev

What problem are you facing?

The local end-to-end test added in #365 brings the full path up on two kind clusters with no cloud and no GPU, and it proves an engine's ResourceClaim binds and its pod schedules onto a workload node. But that workload cluster has a single node, so the test can't exercise the fleet scheduler's placement decisions — with one candidate node there is nothing to choose between.

Placement is what decides where a replica lands on a real fleet: CEL capacity matching against a node's declared device capacity, modelplane.ai/pool selection, and nodeSelector handling. Today that logic is unverified end to end, and the multi-node, multi-GPU fleets that would exercise it are exactly what the local test is designed to avoid needing.

How could Modelplane help solve your problem?

Suggested by @haarchri in the #365 review (#365 (comment)): add KWOK (Kubernetes WithOut Kubelet) nodes to the workload cluster. KWOK marks pods scheduled onto its fake nodes as Ready without a real kubelet, so we can cheaply stand up several nodes with different pool labels and declared capacities, force the scheduler to choose among them, and assert a replica lands on the intended node — still cloud- and GPU-free.

Open questions / trade-offs for the follow-up:

  • KWOK pods reach Ready without running anything, so this covers placement, not serving. The real workload node (with the mock engine) would keep carrying the served replica; the KWOK nodes would be additional placement candidates.
  • DRA interaction: the dra-example-driver publishes ResourceSlices per node via its kubelet plugin, which KWOK nodes won't run. We'd need to confirm whether a claim: DRA engine can bind on a KWOK node (publish ResourceSlices for the fake nodes, or assert placement via pool/nodeSelector without DRA on those nodes).

Follow-up to the local e2e test added in #365.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions