ROSAENG-726: Spike request-serving isolation on EKS (kata + qemu) - #738
ROSAENG-726: Spike request-serving isolation on EKS (kata + qemu)#738typeid wants to merge 15 commits into
Conversation
|
Skipping CI for Draft Pull Request. |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueComment |
9ded404 to
34279f5
Compare
|
@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. DetailsIn response to this:
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. |
34279f5 to
9ba7735
Compare
9ba7735 to
daeb951
Compare
…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>
daeb951 to
dc5b1e9
Compare
dc059da to
7dbd8f0
Compare
8a46a7e to
c04fdc0
Compare
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>
c04fdc0 to
6015878
Compare
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>
Summary
docs/design/request-serving-isolation-eks.md)kata-fcRelated branches
The POC implementation spans three repos. The design doc covers multiple variants; this implementation is B1 (Firecracker) only:
spike_request_serving_nodesrequest_serving_nodesrequest_serving_nodesOpen questions
Test plan
kata-fcwith all ConfigMap/Secret mountsminAllowedscaling override🤖 Generated with Claude Code