Skip to content

CNTRLPLANE-3329: Enable fuse-overlayfs in ARC runner pods via user namespaces - #8571

Closed
celebdor wants to merge 1 commit into
openshift:mainfrom
celebdor:CNTRLPLANE-3329/enable-fuse-overlayfs
Closed

CNTRLPLANE-3329: Enable fuse-overlayfs in ARC runner pods via user namespaces#8571
celebdor wants to merge 1 commit into
openshift:mainfrom
celebdor:CNTRLPLANE-3329/enable-fuse-overlayfs

Conversation

@celebdor

@celebdor celebdor commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

Enables the fuse-overlayfs mount in ARC runner pods so the EFS-backed Go build cache can be used as a zero-copy overlay instead of a full cp -a at each job start. PR #8568 added fuse-overlayfs to the runner image and the warm-go-cache action, but the mount was failing because /dev/fuse was not exposed and the SCC blocked the mount(2) syscall.

Changes:

  • values.yaml: Adds the CRI-O annotation to expose /dev/fuse, enables pod-level user namespaces (hostUsers: false), runs as uid 0 inside the user namespace (maps to unprivileged host uid), and explicitly requests CAP_SYS_ADMIN on the container for the mount syscall
  • restricted-v3-fuse-scc.yaml: Custom SCC based on restricted-v3 with minimal changes — allows SYS_ADMIN in allowedCapabilities, drops only MKNOD/NET_RAW instead of ALL, permits uid 0, and requires userNamespaceLevel: RequirePodLevel so these privileges only exist inside the user namespace

Why user namespaces?

fuse-overlayfs needs either fusermount3 (setuid, blocked by allowPrivilegeEscalation: false) or CAP_SYS_ADMIN for mount(2). Running in a user namespace (hostUsers: false) means uid 0 and CAP_SYS_ADMIN inside the pod map to an unprivileged host identity — no actual privilege escalation on the host.

Pre-deploy step

The runner service account must be granted the SCC before helm upgrade:

oc adm policy add-scc-to-user restricted-v3-fuse \
  -z arc-runner-set-gha-rs-no-permission -n arc-runners

Test plan

  • Verified fuse-overlayfs mount works with this SCC + user namespace config on the cluster
  • Deploy via helm upgrade and confirm runner pods start with the new SCC
  • Confirm fuse-overlayfs mount succeeds in CI job logs (no "falling back to copy" warning)
  • Compare job durations before/after using contrib/ci/gha-cache-timing.sh

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Enhanced security configuration for GitHub Actions runners to enable unprivileged FUSE mounts in user namespaces: added SYS_ADMIN capability for the runner container, broadened UID/GID ranges for pod-level user mapping, and configured device access for /dev/fuse.
    • Added pod-level securityContext (runAsUser) and tightened capability drops to maintain controlled escalation while preserving required functionality.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: LGTM mode

@openshift-ci

openshift-ci Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label May 21, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 21, 2026
@openshift-ci-robot

openshift-ci-robot commented May 21, 2026

Copy link
Copy Markdown

@celebdor: This pull request references CNTRLPLANE-3329 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Enables the fuse-overlayfs mount in ARC runner pods so the EFS-backed Go build cache can be used as a zero-copy overlay instead of a full cp -a at each job start. PR #8568 added fuse-overlayfs to the runner image and the warm-go-cache action, but the mount was failing because /dev/fuse was not exposed and the SCC blocked the mount(2) syscall.

Changes:

  • values.yaml: Adds the CRI-O annotation to expose /dev/fuse, enables pod-level user namespaces (hostUsers: false), runs as uid 0 inside the user namespace (maps to unprivileged host uid), and explicitly requests CAP_SYS_ADMIN on the container for the mount syscall
  • restricted-v3-fuse-scc.yaml: Custom SCC based on restricted-v3 with minimal changes — allows SYS_ADMIN in allowedCapabilities, drops only MKNOD/NET_RAW instead of ALL, permits uid 0, and requires userNamespaceLevel: RequirePodLevel so these privileges only exist inside the user namespace

Why user namespaces?

fuse-overlayfs needs either fusermount3 (setuid, blocked by allowPrivilegeEscalation: false) or CAP_SYS_ADMIN for mount(2). Running in a user namespace (hostUsers: false) means uid 0 and CAP_SYS_ADMIN inside the pod map to an unprivileged host identity — no actual privilege escalation on the host.

Pre-deploy step

The runner service account must be granted the SCC before helm upgrade:

oc adm policy add-scc-to-user restricted-v3-fuse \
 -z arc-runner-set-gha-rs-no-permission -n arc-runners

Test plan

  • Verified fuse-overlayfs mount works with this SCC + user namespace config on the cluster
  • Deploy via helm upgrade and confirm runner pods start with the new SCC
  • Confirm fuse-overlayfs mount succeeds in CI job logs (no "falling back to copy" warning)
  • Compare job durations before/after using contrib/ci/gha-cache-timing.sh

🤖 Generated with Claude Code

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@coderabbitai

coderabbitai Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 2d016589-4dfa-4d48-bc90-2fd57915a740

📥 Commits

Reviewing files that changed from the base of the PR and between 3bebac7 and 7f51242.

📒 Files selected for processing (2)
  • hack/github-actions-runner/restricted-v3-fuse-scc.yaml
  • hack/github-actions-runner/values.yaml

📝 Walkthrough

Walkthrough

This PR enables unprivileged FUSE for the GitHub Actions runner by adding an OpenShift SecurityContextConstraints resource (restricted-v3-fuse) that permits CAP_SYS_ADMIN and UID/GID ranges 0–65534 under pod-scoped user namespaces, and by updating the runner Helm values to annotate the pod for CRI‑O device access (/dev/fuse), set spec.hostUsers:false, and configure pod/container securityContexts (runAsUser: 0; container drops all capabilities and adds SYS_ADMIN).

Possibly related PRs

  • openshift/hypershift#8568: Adds SCC/pod security settings to permit /dev/fuse and unprivileged FUSE mounts used by fuse-overlayfs and the Go build cache.

Suggested reviewers

  • clebs
  • muraee
  • bryan-cox
🚥 Pre-merge checks | ✅ 12
✅ Passed checks (12 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: enabling fuse-overlayfs in ARC runner pods via user namespaces. It is directly aligned with the changeset's primary objective of adding FUSE support through security context constraints and pod configuration.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed PR contains only YAML configuration files (SecurityContextConstraints and Helm values); no Ginkgo tests are present, so the stable test names check does not apply.
Test Structure And Quality ✅ Passed This PR contains only YAML configuration files (restricted-v3-fuse-scc.yaml and values.yaml), not Ginkgo test code. The custom check for test structure and quality is not applicable to this PR.
Microshift Test Compatibility ✅ Passed No Ginkgo e2e tests are added in this PR. Only YAML configuration files (SecurityContextConstraints and Helm values) are modified. The check is not applicable.
Single Node Openshift (Sno) Test Compatibility ✅ Passed No Ginkgo e2e tests were added. The PR only includes YAML configuration files for GitHub Actions runner setup, not e2e test code.
Topology-Aware Scheduling Compatibility ✅ Passed Topology spread constraints use whenUnsatisfiable: ScheduleAnyway (soft preference), not hard requirements, so pods can schedule on SNO, TNF, TNA, and HyperShift topologies.
Ote Binary Stdout Contract ✅ Passed PR only modifies YAML configuration files (restricted-v3-fuse-scc.yaml, values.yaml) with no Go code changes. OTE Binary Stdout Contract check is not applicable to static configuration files.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No Ginkgo e2e tests are present in this PR. Modified files are YAML configuration files (SCC and Helm values) without any test definitions, IPv4 assumptions, or external connectivity requirements.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@openshift-ci openshift-ci Bot added area/ci-tooling Indicates the PR includes changes for CI or tooling and removed do-not-merge/needs-area labels May 21, 2026

@bryan-cox bryan-cox left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 21, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling tests matching the pipeline_run_if_changed or not excluded by pipeline_skip_if_only_changed parameters:
/test e2e-aks
/test e2e-aws
/test e2e-aws-upgrade-hypershift-operator
/test e2e-azure-self-managed
/test e2e-kubevirt-aws-ovn-reduced
/test e2e-v2-aws
/test e2e-v2-gke

@openshift-ci

openshift-ci Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: bryan-cox, celebdor

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label May 21, 2026
@celebdor
celebdor marked this pull request as ready for review May 21, 2026 18:27
@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label May 21, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@hack/github-actions-runner/values.yaml`:
- Around line 19-21: The securityContext currently only adds SYS_ADMIN which
widens capability surface; update the capabilities block in the relevant
resource (securityContext) to explicitly drop all capabilities and then re-add
only SYS_ADMIN (i.e., add a capabilities.drop: ["ALL"] alongside
capabilities.add: ["SYS_ADMIN"]) so only that single capability is granted.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 77e6e385-4146-4d6a-a460-57c1b131090e

📥 Commits

Reviewing files that changed from the base of the PR and between b39a15b and 3bebac7.

📒 Files selected for processing (2)
  • hack/github-actions-runner/restricted-v3-fuse-scc.yaml
  • hack/github-actions-runner/values.yaml

Comment thread hack/github-actions-runner/values.yaml
@bryan-cox

Copy link
Copy Markdown
Member

/verified by @celebdor

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label May 21, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@bryan-cox: This PR has been marked as verified by @celebdor.

Details

In response to this:

/verified by @celebdor

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci
openshift-ci Bot requested review from clebs and muraee May 21, 2026 18:28
@celebdor

Copy link
Copy Markdown
Collaborator Author

/override ci/prow/e2e-aws
/override ci/prow/e2e-v2-aws
/override ci/prow/e2e-v2-gke
/override ci/prow/e2e-aks
/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced
/override ci/prow/e2e-aws-upgrade-hypershift-operator
/override ci/prow/images
/override ci/prow/okd-scos-images
/override ci/prow/verify-deps
/override ci/prow/security

@openshift-ci

openshift-ci Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

@celebdor: Overrode contexts on behalf of celebdor: ci/prow/e2e-aks, ci/prow/e2e-aws, ci/prow/e2e-aws-upgrade-hypershift-operator, ci/prow/e2e-azure-self-managed, ci/prow/e2e-kubevirt-aws-ovn-reduced, ci/prow/e2e-v2-aws, ci/prow/e2e-v2-gke, ci/prow/images, ci/prow/okd-scos-images, ci/prow/security, ci/prow/verify-deps

Details

In response to this:

/override ci/prow/e2e-aws
/override ci/prow/e2e-v2-aws
/override ci/prow/e2e-v2-gke
/override ci/prow/e2e-aks
/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced
/override ci/prow/e2e-aws-upgrade-hypershift-operator
/override ci/prow/images
/override ci/prow/okd-scos-images
/override ci/prow/verify-deps
/override ci/prow/security

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

The fuse-overlayfs binary was added to the runner image in the previous
PR but /dev/fuse was not exposed and the SCC blocked the mount syscall.

Enable unprivileged FUSE mounts in ARC runner pods by:
- Adding the CRI-O annotation to expose /dev/fuse
- Running pods in user namespaces (hostUsers: false) so uid 0 maps
  to an unprivileged host identity
- Requesting CAP_SYS_ADMIN explicitly on the container (needed for
  mount(2) inside the user namespace)
- Introducing restricted-v3-fuse SCC: identical to restricted-v3
  except it allows SYS_ADMIN in allowedCapabilities, drops only
  MKNOD and NET_RAW (instead of ALL), and permits uid 0 inside the
  user namespace via userNamespaceLevel: RequirePodLevel

The runner SA must be granted the SCC before deploying:
  oc adm policy add-scc-to-user restricted-v3-fuse \
    -z arc-runner-set-gha-rs-no-permission -n arc-runners

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@celebdor
celebdor force-pushed the CNTRLPLANE-3329/enable-fuse-overlayfs branch from 3bebac7 to 7f51242 Compare May 21, 2026 18:31
@openshift-ci-robot openshift-ci-robot removed the verified Signifies that the PR passed pre-merge verification criteria label May 21, 2026
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label May 21, 2026
@bryan-cox

Copy link
Copy Markdown
Member

/lgtm

@openshift-ci-robot

openshift-ci-robot commented May 21, 2026

Copy link
Copy Markdown

@celebdor: This pull request references CNTRLPLANE-3329 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Enables the fuse-overlayfs mount in ARC runner pods so the EFS-backed Go build cache can be used as a zero-copy overlay instead of a full cp -a at each job start. PR #8568 added fuse-overlayfs to the runner image and the warm-go-cache action, but the mount was failing because /dev/fuse was not exposed and the SCC blocked the mount(2) syscall.

Changes:

  • values.yaml: Adds the CRI-O annotation to expose /dev/fuse, enables pod-level user namespaces (hostUsers: false), runs as uid 0 inside the user namespace (maps to unprivileged host uid), and explicitly requests CAP_SYS_ADMIN on the container for the mount syscall
  • restricted-v3-fuse-scc.yaml: Custom SCC based on restricted-v3 with minimal changes — allows SYS_ADMIN in allowedCapabilities, drops only MKNOD/NET_RAW instead of ALL, permits uid 0, and requires userNamespaceLevel: RequirePodLevel so these privileges only exist inside the user namespace

Why user namespaces?

fuse-overlayfs needs either fusermount3 (setuid, blocked by allowPrivilegeEscalation: false) or CAP_SYS_ADMIN for mount(2). Running in a user namespace (hostUsers: false) means uid 0 and CAP_SYS_ADMIN inside the pod map to an unprivileged host identity — no actual privilege escalation on the host.

Pre-deploy step

The runner service account must be granted the SCC before helm upgrade:

oc adm policy add-scc-to-user restricted-v3-fuse \
 -z arc-runner-set-gha-rs-no-permission -n arc-runners

Test plan

  • Verified fuse-overlayfs mount works with this SCC + user namespace config on the cluster
  • Deploy via helm upgrade and confirm runner pods start with the new SCC
  • Confirm fuse-overlayfs mount succeeds in CI job logs (no "falling back to copy" warning)
  • Compare job durations before/after using contrib/ci/gha-cache-timing.sh

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
  • Enhanced security configuration for GitHub Actions runners to enable unprivileged FUSE mounts in user namespaces: added SYS_ADMIN capability for the runner container, broadened UID/GID ranges for pod-level user mapping, and configured device access for /dev/fuse.
  • Added pod-level securityContext (runAsUser) and tightened capability drops to maintain controlled escalation while preserving required functionality.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@celebdor

Copy link
Copy Markdown
Collaborator Author

/override ci/prow/e2e-aws
/override ci/prow/e2e-v2-aws
/override ci/prow/e2e-v2-gke
/override ci/prow/e2e-aks
/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced
/override ci/prow/e2e-aws-upgrade-hypershift-operator
/override ci/prow/images
/override ci/prow/okd-scos-images
/override ci/prow/verify-deps
/override ci/prow/security

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 21, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling tests matching the pipeline_run_if_changed or not excluded by pipeline_skip_if_only_changed parameters:
/test e2e-aks
/test e2e-aws
/test e2e-aws-upgrade-hypershift-operator
/test e2e-azure-self-managed
/test e2e-kubevirt-aws-ovn-reduced
/test e2e-v2-aws
/test e2e-v2-gke

@openshift-ci

openshift-ci Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

@celebdor: Overrode contexts on behalf of celebdor: ci/prow/e2e-aks, ci/prow/e2e-aws, ci/prow/e2e-aws-upgrade-hypershift-operator, ci/prow/e2e-azure-self-managed, ci/prow/e2e-kubevirt-aws-ovn-reduced, ci/prow/e2e-v2-aws, ci/prow/e2e-v2-gke, ci/prow/images, ci/prow/okd-scos-images, ci/prow/security, ci/prow/verify-deps

Details

In response to this:

/override ci/prow/e2e-aws
/override ci/prow/e2e-v2-aws
/override ci/prow/e2e-v2-gke
/override ci/prow/e2e-aks
/override ci/prow/e2e-azure-self-managed
/override ci/prow/e2e-kubevirt-aws-ovn-reduced
/override ci/prow/e2e-aws-upgrade-hypershift-operator
/override ci/prow/images
/override ci/prow/okd-scos-images
/override ci/prow/verify-deps
/override ci/prow/security

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@cwbotbot

cwbotbot commented May 21, 2026

Copy link
Copy Markdown

Test Results

e2e-aws

e2e-aks

Failed Tests

Total failed tests: 4

  • TestCreateCluster
  • TestCreateCluster/ValidateHostedCluster
  • TestCreateClusterHABreakGlassCredentials
  • TestCreateClusterHABreakGlassCredentials/ValidateHostedCluster

@hypershift-jira-solve-ci

Copy link
Copy Markdown
Contributor

AI Test Failure Analysis

Job: pull-ci-openshift-hypershift-main-e2e-aks | Build: 2057530530982793216 | Cost: $2.600656250000001 | Failed step: hypershift-azure-run-e2e

View full analysis report


Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6

@hypershift-jira-solve-ci

hypershift-jira-solve-ci Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

Test Failure Analysis Complete

Job Information

Test Failure Analysis

Error

TestCreateClusterHABreakGlassCredentials/ValidateHostedCluster:
  Failed to wait for HostedCluster e2e-clusters-c6ph8/ha-break-glass-creds-tqtzw to have valid conditions in 20m0s: context deadline exceeded
  - incorrect condition: wanted Degraded=False, got Degraded=True: UnavailableReplicas(kube-controller-manager deployment has 1 unavailable replicas)
  - controlPlaneVersion state is Partial, expected Completed

TestCreateCluster/ValidateHostedCluster:
  Failed to wait for HostedCluster e2e-clusters-vn6w7/create-cluster-6kgvn to have valid conditions in 10m0s: context deadline exceeded
  - controlPlaneVersion state is Partial, expected Completed

Summary

This is a pre-existing infrastructure flake unrelated to PR #8571. The PR only modifies GitHub Actions runner configuration files (hack/github-actions-runner/), which are completely separate from the HyperShift operator, control plane reconciliation, and e2e test code. The failures were caused by AKS management cluster resource exhaustion — 9 concurrent hosted clusters overwhelmed the management cluster's pod and memory capacity, preventing control plane pods from scheduling and delaying version rollouts past test timeouts. 7 out of 9 test suites passed; only 2 clusters (both late in the scheduling queue) were affected.

Root Cause

The AKS management cluster was under severe resource pressure while running 9 concurrent hosted clusters, leading to two distinct but related failures:

TestCreateClusterHABreakGlassCredentials — The HA kube-controller-manager deployment requires 2 replicas. Pod kube-controller-manager-66d8ff85c9-h8tc6 was stuck in Pending phase with condition PodScheduled: False (Unschedulable) — it was never assigned to a node. With only 1 of 2 KCM replicas running, the deployment reported 1 unavailable replica, which set Degraded=True on the HostedCluster. The control plane version rollout could not complete (Partial) because multiple cluster operators (console, dns, image-registry, ingress, insights, kube-storage-version-migrator, monitoring, node-tuning, openshift-samples, service-ca, storage) were not available — these operators depend on the KCM to function.

TestCreateCluster — This cluster's version rollout was delayed (remained Partial during the 10-minute test timeout) due to the same resource pressure. Notably, the HostedCluster YAML captured after the test shows version.history[0].state: Completed and Degraded: False, confirming the cluster eventually recovered after the test had already timed out. This proves the failure was a transient timing issue, not a persistent product bug.

Underlying infrastructure cause: The management cluster (3× Standard_D4lds_v5 + 6× Standard_D14_v2 via NAP) hit limits documented in the build log: 0/15 nodes are available: 12 Too many pods, 3 Insufficient memory and Failed to schedule pod, did not tolerate taint (CriticalAddonsOnly=true:NoSchedule); all available instance types exceed limits for nodepool. Karpenter was scaling nodes but they appeared with karpenter.sh/unregistered taints, adding further scheduling delays.

Why this is NOT caused by PR #8571: The PR modifies only hack/github-actions-runner/restricted-v3-fuse-scc.yaml (a SecurityContextConstraints definition for CI runner pods) and hack/github-actions-runner/values.yaml (Helm values for ARC runner configuration). These files are not compiled into the hypershift binary, not deployed to the management cluster, and not referenced by any e2e test. They configure a completely separate GitHub Actions self-hosted runner infrastructure.

Recommendations
  1. Retry the job — This failure is a transient infrastructure flake. The PR changes are provably unrelated to the test failures.
  2. Consider /override e2e-aks — Since the PR modifies only hack/github-actions-runner/ files outside all operator and test code paths, overriding is safe if the flake recurs.
  3. Track e2e-aks flake rate — If TestCreateCluster and TestCreateClusterHABreakGlassCredentials fail frequently on this job, the management cluster node pool limits or hosted cluster concurrency (currently 9 simultaneous clusters) may need to be adjusted to prevent scheduling exhaustion.
Evidence
Evidence Detail
PR files changed hack/github-actions-runner/restricted-v3-fuse-scc.yaml, hack/github-actions-runner/values.yaml — unrelated to HyperShift operator or tests
Failed tests 4 of 294 (2 parent + 2 subtest); 7 other test suites passed
KCM pod 66d8ff85c9-h8tc6 Phase: Pending, PodScheduled: False (Unschedulable) — never assigned a node
KCM pod 66d8ff85c9-8rj72 Phase: Running, Ready: True — 1 of 2 replicas healthy
HA HostedCluster condition Degraded=True: UnavailableReplicas(kube-controller-manager deployment has 1 unavailable replicas)
HA HostedCluster version state: Partial — 11 cluster operators not available due to missing KCM
CreateCluster HostedCluster (post-test) version.history[0].state: Completed, Degraded: False — recovered after test timeout
CreateCluster test timeout controlPlaneVersion state is Partial at RV 53947 after 10m0s
Management cluster scheduling 0/15 nodes: 12 Too many pods, 3 Insufficient memory
Nodepool limits all available instance types exceed limits for nodepool (NodePool=default)
Karpenter scaling Nodes with karpenter.sh/unregistered taint observed during scaling
Concurrent hosted clusters 9 hosted clusters running simultaneously
TLS handshake timeouts Systemic across all clusters — not specific to failures

@openshift-ci

openshift-ci Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

@celebdor: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-aws 7f51242 link true /test e2e-aws
ci/prow/e2e-aks 7f51242 link true /test e2e-aks

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@celebdor

Copy link
Copy Markdown
Collaborator Author

Closing in favor of GOCACHEPROG approach

This PR attempted to enable fuse-overlayfs in runner pods via user namespaces (hostUsers: false) and a custom SCC. However, hostUsers: false requires idmapped mounts on every volume, and the EFS PVC (NFS-backed) does not support mount_setattr on RHEL 9's kernel 5.14:

Error: container create failed: mount_setattr `/cache/go-build`
(maybe the file system used doesn't support idmap mounts on this kernel?): Invalid argument

NFS idmapped mount support was added upstream in kernel 6.3 and has not been backported to RHEL 9.

Alternative: Use Go 1.24+'s GOCACHEPROG protocol instead. A small Go program reads from the read-only EFS cache directly (standard filesystem reads, no FUSE) and writes new entries to local temp storage. Zero copy, no special SCC, no user namespaces — works with the default restricted-v2.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/ci-tooling Indicates the PR includes changes for CI or tooling jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants