Sandboxing and workload isolation
fly.io
fly.io
I also can't help but think we're going to end up with a microkernel with some sort of nested cgroups for user processes. Which is itself going to look a little bit like Erlang...
I'm going to speak to the docker-style containers because that's what I'm most familiar with.
Filesystem, process, and even network isolation facilitate the illusion of an application having a fresh install of an OS to a degree. This includes details like /dev/, a package manager, things sitting in /etc/.
Added to that there's decent tooling for sharing, composing/layering, shipping, baking images. They're declarative (enough-ish) too.
This is nice because that's a pretty decent compatibility layer across a ton of software like databases and webservers that have always run expecting a full host, services written with bare metal in mind, and new things too.
The kernel isolation features are powerful enablers, but don't undervalue how important it was to have things sorted out for you, like ldloader quirks with different glibc versions against the same kernel. Real issue I had.
Source: Too much futzing around with chroots.
The irony of having monoliths like Linux running type 1 hypervisors, on Intel CPUs running ME.
In the past, we never had an easy way to package various applications (including all needed resources and executables). Each language ecosystem invented their own ways of packaging, distributing and installing the application, and this always relied on pre-existing environment.
With Docker you don't care what versions of language runtime, or dependencies, each application runs, you can run them on the same machine. There are no incompatible dependencies between multiple Docker containers, everything almost always works.
Same goes with building, image layers made building of images a lot easier, and doing incremental changes is fast. Of course there are downsides, image size can really grow if you are not careful, and you need to regularly rebuild images from the ground up, to ensure everything is patched.
UNIX-like Linux kernel -> POSIX environment -> Kubernetes API -> Docker/CRI-O runtime -> POSIX environment -> Applications
From the developer perspective only the last POSIX layer is relevant, all the layers below are efforts to strong-arm old UNIX paradigms into 21st century compute/storage/network architecture. Could it be possible to replace this huge layered stack with something lighter that is better designed for the current compute/storage/networking paradigm in the cloud/data center and supports the POSIX compatibility layer for applications? For example:
Harvey OS -> orchestration API -> APEX -> Applications
Plan 9 -> orchestration API -> APE -> Applications
Clients could still rely on the desktop Linux distribution, Android or some other OSes.
Everything that Docker sells was already possible with JEE application containers, just Java only.
I did like the permissions inheritance model quite a bit, but the hybrid ACL/capabilities system was always a bit schizophrenic.
Now if those guys didn't understood the WebSphere capabilities that is another matter.
It doesn't do magic if the users don't bother to use the tools put at their disposal.
This isn't sandboxing at click of button.
Also sounds like https://redox-os.org, a microkernel that has namespaces, written in Rust and actively under development
https://www.zdnet.com/article/bea-runs-java-on-bare-virtual-...
I think some of their custom hardware was also a 'bare metal' VM arrangement for years, but I never actually met anyone who was a customer.
Interesting comparison with Cloudflare's isolate approach which they expanded on earlier this week: https://blog.cloudflare.com/mitigating-spectre-and-other-sec...
Seems like there is an edge compute option for any requirement these days!
I am working on such a thing now and it has a 6-microsecond overhead in a highly concurrent scenario (60k req/s). So, I think there are cases for everything.
I could just use docker (and I have docker images of this app that some people like to run) but I think this way is more lightweight, gives me more explicit control, and leans into the OS level security features, like privileges and cgroups with a couple of Unix commands.
But.. I am running OpenBSD ;(
Have we come full circle?
"The first, and really the big problem for the whole virtualization approach, is that you need bare metal servers to efficiently do lightweight virtualization;" <- this isn't really true anymore as unikernels can be deployed to {aws, gcloud, azure} as machine images and so can be as light-weight as your program needs.
If you're deploying a unikernel to ec2, you're just using their underlying isolation. You can't safely deploy multiple unikernels on the same ec2 instances without figuring out your own, nested isolation.
The only? reason I can see for wanting to deploy N unikernels to one AWS instance is if you want full control on the orchestration of things like multi-tenancy, however, it is very much possible and it is possible on GCloud as well. It should be noted that you are in the same boat as firecracker here. They both use virtualization.
Actually it's rather ugly for this specific page for some reason, with weird boxes around every paragraph.
But at least the contrast isn't an issue.
[1] https://support.mozilla.org/en-US/kb/firefox-reader-view-clu...