Skip to content

ROSAENG-726: Spike request-serving isolation on EKS (kata + qemu) - #738

Draft
typeid wants to merge 15 commits into
openshift-online:mainfrom
typeid:spike_request_serving_nodes
Draft

ROSAENG-726: Spike request-serving isolation on EKS (kata + qemu)#738
typeid wants to merge 15 commits into
openshift-online:mainfrom
typeid:spike_request_serving_nodes

Conversation

@typeid

@typeid typeid commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Design doc comparing isolation models for request-serving workloads on EKS (docs/design/request-serving-isolation-eks.md)
    • Option A: Karpenter dedicated nodes (A1: per-HCP subnets, A2: shared subnets)
    • Option B: Kata Containers microVM isolation (B1: Firecracker, B2: QEMU)
    • Security analysis with attack chain comparison across all options
    • Covers FIPS compliance, subnet isolation compatibility, VPA scaling overrides
  • Working POC of Option B1 (Kata/Firecracker) on AL2023 — validated with full KAS pods running under kata-fc

Related branches

The POC implementation spans three repos. The design doc covers multiple variants; this implementation is B1 (Firecracker) only:

Repo Branch Changes
rosa-hyperfleet (this PR) spike_request_serving_nodes kata-deploy Helm chart, Karpenter NodePool with nested virt + devmapper, design doc
rosa-hyperfleet-api request_serving_nodes Kata topology annotation on HostedClusters, CPO image update
hypershift request_serving_nodes Kata RuntimeClass for request-serving pods, aws-iam-authenticator KAS sidecar

Open questions

  1. Does AWS accept shared-subnet Nitro isolation (Option A2) for the ROSA HCP security bar?
  2. Does Kata deploy + run on RHCOS's immutable OSTree root? (FIPS requirement for production)
  3. Karpenter node pairing mechanism for Option A
  4. Full FIPS validation of RHCOS → KVM → VMM → guest kernel stack

Test plan

  • KAS pods boot and serve under kata-fc with all ConfigMap/Secret mounts
  • RHCOS AMI with Kata (not yet attempted)
  • QEMU variant (B2) validation
  • VPA minAllowed scaling override

🤖 Generated with Claude Code

@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 Aug 10, 2026
@openshift-ci

openshift-ci Bot commented Aug 10, 2026

Copy link
Copy Markdown

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 commented Aug 10, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign slopezz for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found 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 needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 10, 2026
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

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

@typeid
typeid force-pushed the spike_request_serving_nodes branch 2 times, most recently from 9ded404 to 34279f5 Compare August 10, 2026 07:50
@typeid typeid changed the title spike: request-serving isolation on EKS — design + Kata/Firecracker POC Spike: request-serving isolation on EKS (design + Kata/Firecracker POC) Aug 10, 2026
@typeid typeid changed the title Spike: request-serving isolation on EKS (design + Kata/Firecracker POC) ROSAENG-726: Spike request-serving isolation on EKS (design + Kata/Firecracker POC) Aug 10, 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 Aug 10, 2026
@openshift-ci-robot

openshift-ci-robot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

@typeid: This pull request references ROSAENG-726 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

  • Design doc comparing isolation models for request-serving workloads on EKS (docs/design/request-serving-isolation-eks.md)
  • Option A: Karpenter dedicated nodes (A1: per-HCP subnets, A2: shared subnets)
  • Option B: Kata Containers microVM isolation (B1: Firecracker, B2: QEMU)
  • Security analysis with attack chain comparison across all options
  • Covers FIPS compliance, subnet isolation compatibility, VPA scaling overrides
  • Working POC of Option B1 (Kata/Firecracker) on AL2023 — validated with full KAS pods running under kata-fc

Related branches

The POC implementation spans three repos. The design doc covers multiple variants; this implementation is B1 (Firecracker) only:

Repo Branch Changes
rosa-hyperfleet (this PR) spike_request_serving_nodes kata-deploy Helm chart, Karpenter NodePool with nested virt + devmapper, design doc
rosa-hyperfleet-api request_serving_nodes Kata topology annotation on HostedClusters, CPO image update
hypershift request_serving_nodes Kata RuntimeClass for request-serving pods, aws-iam-authenticator KAS sidecar

Open questions

  1. Does AWS accept shared-subnet Nitro isolation (Option A2) for the ROSA HCP security bar?
  2. Does Kata deploy + run on RHCOS's immutable OSTree root? (FIPS requirement for production)
  3. Karpenter node pairing mechanism for Option A
  4. Full FIPS validation of RHCOS → KVM → VMM → guest kernel stack

Test plan

  • KAS pods boot and serve under kata-fc with all ConfigMap/Secret mounts
  • RHCOS AMI with Kata (not yet attempted)
  • QEMU variant (B2) validation
  • VPA minAllowed scaling override

🤖 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.

@typeid
typeid force-pushed the spike_request_serving_nodes branch from 34279f5 to 9ba7735 Compare August 12, 2026 07:55
@typeid
typeid force-pushed the spike_request_serving_nodes branch from 9ba7735 to daeb951 Compare August 25, 2026 13:56
@openshift-ci openshift-ci Bot added needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. and removed needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. labels Aug 25, 2026
typeid and others added 2 commits September 2, 2026 09:27
…cker POC)

Design doc comparing two isolation models for request-serving workloads on EKS:
- Option A: Karpenter dedicated nodes (A1: per-HCP subnets, A2: shared subnets)
- Option B: Kata Containers microVM isolation (B1: Firecracker, B2: QEMU)

Working POC of Option B1 (Kata/Firecracker) on AL2023:
- kata-deploy Helm chart (upstream 3.27.0) with Firecracker runtime
- Karpenter NodePool with nested virtualization and devmapper thin-pool
- Validated with full KAS pods running under kata-fc

Related branches:
- rosa-hyperfleet-api: request_serving_nodes
- hypershift: request_serving_nodes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…OSC DaemonSet

Replace the upstream kata-deploy Helm chart (Firecracker/devmapper) with a
barebones DaemonSet modeled after the OpenShift Sandboxed Containers operator.
The OSC install script uses rpm-ostree to install Red Hat's FIPS-validated
kata + QEMU from the OCP 4.22 release payload.

Key changes:
- Custom RHEL-for-EKS AMI (bootc/OSTree-based) instead of AL2023
- QEMU backend via io.containerd.kata.v2 (not Firecracker)
- Removed devmapper thin-pool and kata-kernel-fix workarounds
- Added EKS-specific workarounds for CRI-O, pull secret, containerd config
- Kept kata-fc RuntimeClass name (HyperShift hardcodes it)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@typeid
typeid force-pushed the spike_request_serving_nodes branch from daeb951 to dc5b1e9 Compare September 2, 2026 07:38
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Sep 2, 2026
@typeid typeid changed the title ROSAENG-726: Spike request-serving isolation on EKS (design + Kata/Firecracker POC) ROSAENG-726: Spike request-serving isolation on EKS (kata + qemu) Sep 2, 2026
@typeid
typeid force-pushed the spike_request_serving_nodes branch 10 times, most recently from dc059da to 7dbd8f0 Compare September 2, 2026 09:50
@typeid
typeid force-pushed the spike_request_serving_nodes branch 6 times, most recently from 8a46a7e to c04fdc0 Compare September 2, 2026 10:23
Switch from custom RHEL-for-EKS AMI to AL2023 AMI (ami-01e8dae6601ab0069)
to align with the standard MC node AMI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@typeid
typeid force-pushed the spike_request_serving_nodes branch from c04fdc0 to 6015878 Compare September 2, 2026 11:12
typeid and others added 12 commits September 2, 2026 13:21
OCP 4.22 kata RPMs had a runtime incompatibility with CRI-O 1.36.2
(EUCLEAN on block device rootfs, ENOENT on virtiofs fallback), and
OCP 5.0 extensions image ships zero RPMs entirely.

Switch to the upstream kata-deploy image (quay.io/kata-containers/
kata-deploy:3.14.0) which copies pre-built kata + QEMU binaries to
/opt/kata/ and registers a kata-qemu CRI-O handler via drop-in config.
Not FIPS-compliant, but sufficient for the spike.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
/opt/ is read-only on the bootc AMI. Set INSTALLATION_PREFIX=/var so
kata-deploy writes to /var/opt/kata/ instead, and update the hostPath
volume to match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The NodeClass userData already loads kvm_intel at boot. The
initContainer used nsenter which isn't in amazonlinux:2023-minimal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
kata-deploy.sh uses set -o nounset. Add SHIMS, DEFAULT_SHIM,
CREATE_RUNTIMECLASSES, and CREATE_DEFAULT_RUNTIMECLASS. We manage
our own RuntimeClass so disable kata-deploy's RuntimeClass creation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The preStop hook runs kata-deploy.sh cleanup on every pod termination
(including restarts and rolling updates), which removes kata binaries
and bricks the node for kata workloads. Since Karpenter destroys nodes
on decommission, cleanup is unnecessary.

Switch nodeSelector from katacontainers.io/kata-runtime (managed by
kata-deploy, flips to 'cleanup' on pod termination) to karpenter.sh/
nodepool (stable, always present on kata nodes).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drop the custom bootc AMI (read-only rootfs, CRI-O 1.36 incompatible
with kata) in favor of the default EKS-optimized AL2023 AMI. This
gives us a writable /opt, containerd (which upstream kata-deploy
targets natively), and Karpenter-managed bootstrap.

Remove INSTALLATION_PREFIX=/var workaround and revert hostPath to
/opt/kata/ since AL2023 rootfs is writable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Karpenter v1 requires amiSelectorTerms to be set explicitly.
Use alias al2023@latest to auto-discover the EKS-optimized AL2023 AMI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace our custom DaemonSet with the upstream kata-deploy chart as a
subchart dependency. The v4.x chart handles containerd config detection,
runtime restart, and node labeling natively — fixing the containerd
config path and version issues we hit with the v3.x bash script.

- Add kata-deploy 4.1.0 as subchart dependency
- Delete custom daemonset, rbac, serviceaccount, pull-secret templates
- Keep our RuntimeClass template (kata-fc name for HyperShift compat)
- Disable upstream RuntimeClass creation (we manage kata-fc ourselves)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The upstream chart defaults DEFAULT_SHIM to qemu-runtime-rs which
isn't in our enabled shims list. Set it explicitly to qemu.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The upstream chart indexes defaultShim by architecture. Use the map
format: { amd64: qemu }.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
These are gitignored build artifacts — helm dependency update
generates them locally.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants