Skip to content

Deploy GHCR step refuses node drains when its pull-probe pod runs out of memory #5009

Closed as duplicate

Description

@devantler

🤖 Generated by the Agentic Engineer (interactive Claude Code session)

Evidence

Found by the merge-queue failure count in #4993.

  • 46 failed merge-group runs between 2026-10-08 17:45Z and 2026-10-09 17:24Z, across 13 different pull requests, failed in the deploy job's GHCR credential stage: the runtime pull-probe pod was killed for running out of memory on a nearly full node, so the credential was never exercised and the script refused to drain the node.
  • 🩹 Heal Prod on main failed the same way, so production had no automatic recovery for about 24 hours.
  • 34 of the 46 pull requests' later attempts merged with no new push, so the candidates did not cause the failure.
  • Evidence basis: 4 deploy logs, 1 heal log and 2 check annotations were read; the other 39 runs are grouped by the same deploy-job duration and the failing heal, not by their own logs.
  • Examples: 37833778918, 37916371236, 37966096133.
  • Closed pull request fix(deploy): let the credential probe run on a worker with almost no free memory #4666 tried to fix this. The failure has not recurred since 2026-10-09.

Problem

This is the costliest single cause in the window: 28.8% of all failed runs and about 1,910 run-minutes. Every candidate in the queue failed for a fault none of them caused, and the heal path could not recover either.

Expected behaviour

A full node does not stop the deploy's credential proof. Either the probe can always run, or the deploy names the cause and the heal path still recovers production.

Acceptance criteria

  • Confirm whether the trigger can still happen today: what the probe pod requests and is limited to, and what headroom the node it lands on has. Record the answer here, without node names or addresses.
  • If it can, the probe pod can no longer be killed for memory on a full node, or the step fails with a message naming that cause instead of refusing the drain.
  • The heal path does not fail on the same cause.
  • A self-test covers an out-of-memory probe.

Size: small to medium. Part of #4979.

Activity

  1. added theissue type on Oct 17, 2026
  2. coderabbitai commented on Oct 17, 2026

    @coderabbitai
    Contributor
    ⚠️ Possible Duplicate Issue(s)

    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  3. moved this to 📥 Backlog in 🌊 Project Boardon Oct 17, 2026
  4. devantler commented on Oct 24, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer (interactive Claude Code session)

    Duplicate of #4664, which #4710 fixed. This issue's evidence window (2026-10-08 17:45Z to 2026-10-09 17:24Z) is the same incident #4664 recorded: run 37818995791 on 2026-10-08, a node-pinned probe refused with OutOfmemory on a worker with about 15 Mi left. #4664 was closed as completed on 2026-10-10 when #4710 merged; this issue was filed later from the failure count and names only the earlier, superseded attempt (#4666).

    Checked against this issue's criteria on platform main 1e8dad92 and, read-only, against production today:

    • Can the trigger still happen? The probe now asks for 1 MiB of memory and 1m CPU (limit 64 MiB), down from 16 MiB, with a comment citing fix(deploy): a worker with no free memory makes the credential probe fail and stops every production deploy #4664 (scripts/refresh-flux-ghcr-auth.sh); a fixture test pins those exact requests. Production's tightest node today has about 512 MiB of memory left to request, so the probe fits with a wide margin.
    • If it does happen, the step names the cause: a probe the kubelet refuses now fails at once with "did not run … not credential evidence" and the pod reason, instead of waiting out the budget and blaming the credential.
    • Self-test: TestRuntimeProbeKubeletRejectionFailsFastAndDistinctly drives an OutOfmemory rejection and asserts that message, and that the kubelet's raw message stays out of the log.
    • Heal path: it runs the same script, so it gets the same fix. No refusal of this kind has recurred since 2026-10-09.

    Reopen #4664, as its closing note asks, if a later deploy is refused at the probe on a full worker again.

  5. moved this from 📥 Backlog to ✅ Done in 🌊 Project Boardon Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Fields

    Priority

    None yet

    Effort

    None yet

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions