Edera in AWS Bottlerocket
AWS’s Bottlerocket is a minimized Linux distribution that is purpose-built for running containers. Users choose to use it because it offers a pre-hardened, immutable, container-optimized platform which can be used as a part of a trusted and verified architecture. Unfortunately, this configuration traditionally precludes the ability to do Type-1 isolation between workloads, despite KVM support in Bottlerocket. You no longer need to choose between Bottlerocket’s security and Edera’s security. You can now get both.
Requirements
- Edera requires CPU virtualization features which are typically only available on bare-metal instance types or those offering nested virtualization.
- Although there are a number of Bottlerocket variants, providing FIPS certification or GPU access, we’re only supporting EKS Kubernetes 1.36 today.
How does Edera on Bottlerocket work?
Edera places our stack inside a superpowered Bottlerocket host container, which allows access to /dev/kvm. We configure the Kubelet to send CRI calls to Edera’s socket instead of the default socket. When you ask the Kubelet to launch an Edera workload, Edera launches a KVM-isolated guest with the usual Edera runtime.
Install
Early Access install is via a Bottlerocket-compatible Edera host container image. Please contact support@edera.dev for specifics, including access and what regions are available.
Launch
Edera strives to make things as transparent as possible for you. After a successful install, an Edera-enabled Bottlerocket should look and feel identical to how you’ve been working before. Here’s what we’re actually doing in the background when you launch a workload.
Kubernetes schedules a pod with
runtimeClassName: ederaThe
runtimeClassName: ederaconfig signals the scheduler to select a node that runs the edera runtime. The API server writes the binding; kubelet on the node picks it up.kubelet talks to
containerdvia CRIkubelet resolves
runtimeClassName: ederaand calls thecontainerdCRI gRPC endpoint.containerd maps handler and spawns shim
containerdlooks upederain its config. It spawns the Edera Containerd Shim/usr/bin/containerd-shim-edera-v2. This is the only edera binary that lives directly on the Bottlerocket host OS.The shim contacts protect-daemon
The shim uses the
/run/edera/daemon.socketthat the protect-daemon created inside the edera-runtime host container. Meanwhile, the host container’s entrypoint bound it via/.bottlerocket/rootfs/run/edera/daemon.socketso it appears at the same path on the host.protect-daemon packs the workload image
The daemon spawns
protect-oci-providerto pull the OCI image layers, pack them into a squashfs, and store it in the image cache. The cache is symlinked through/.bottlerocket/rootfs/so it persists on the host filesystem across container restarts.protect-daemon creates a KVM zone
The daemon launches
cloud-hypervisorwith the zone kernel,initrd, and the workload squashfs.virtiofsdprovides the rootfs to the VM overvirtio-fs.Shim proxies lifecycle back to containerd
The Edera Containerd Shim continues to translate between containerd’s OCI lifecycle model (start, exec, wait, kill) and the KVM zone managed by protect-daemon. From kubelet’s perspective the pod is indistinguishable from any other container.
Related pages
- Edera zones: what zones are and how they work
- Edera architecture: how Edera is structured