{"id":79794,"date":"2020-04-07T07:00:25","date_gmt":"2020-04-07T14:00:25","guid":{"rendered":"https:\/\/cloudblogs.microsoft.com\/opensource\/?p=79794"},"modified":"2025-06-27T03:34:41","modified_gmt":"2025-06-27T10:34:41","slug":"announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm","status":"publish","type":"post","link":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/","title":{"rendered":"WebAssembly meets Kubernetes with Krustlet"},"content":{"rendered":"\n<p><span data-contrast=\"auto\">Linux container<\/span><span data-contrast=\"auto\">&nbsp;technology has<\/span><span data-contrast=\"auto\">&nbsp;changed the face of computing, but especially distributed computing in&nbsp;<\/span><span data-contrast=\"auto\">publicly rentable&nbsp;<\/span><span data-contrast=\"auto\">servers commonly said t<\/span><span data-contrast=\"auto\">o&nbsp;<\/span><span data-contrast=\"auto\">be \u201cthe public cloud\u201d (like Microsoft Azure). With&nbsp;<\/span><span data-contrast=\"auto\">containers&nbsp;<\/span><span data-contrast=\"auto\">came&nbsp;<\/span><span data-contrast=\"auto\">tooling \u2013 like&nbsp;<\/span><a href=\"https:\/\/docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">Docker<\/span><\/a><span data-contrast=\"auto\">&nbsp;\u2013 and systems that orchestrate potentially millions of them \u2013 with&nbsp;<\/span><a href=\"https:\/\/kubernetes.io\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">Kubernetes<\/span><\/a><span data-contrast=\"auto\">&nbsp;becoming the most widely used<\/span><span data-contrast=\"auto\">. Together,&nbsp;<\/span><span data-contrast=\"auto\">they have enabled millions of developers and organizations to deliver software more rapidly, widely, and productively than ever before.&nbsp;<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">Even so, there&nbsp;<\/span>are&nbsp;<span data-contrast=\"auto\">limitations to containers and Kubernetes, so tightly bound as they are in their&nbsp;<\/span><span data-contrast=\"auto\">boom<\/span><span data-contrast=\"auto\">ing ecosystem. <\/span>A couple areas stand out<span data-contrast=\"auto\">:&nbsp;<\/span><span data-contrast=\"auto\">the work required to lock container runtimes down&nbsp;<\/span><span data-contrast=\"auto\">and specialized environments<\/span><span data-contrast=\"auto\">&nbsp;either<\/span><span data-contrast=\"auto\">&nbsp;requiring&nbsp;<\/span><span data-contrast=\"auto\">more&nbsp;<\/span><span data-contrast=\"auto\">speed or having&nbsp;<\/span><span data-contrast=\"auto\">sharply&nbsp;<\/span><span data-contrast=\"auto\">constrained resources.<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">Yesterday, we released v0.1.0 of<\/span><span data-contrast=\"auto\">&nbsp;<\/span><a href=\"https:\/\/aka.ms\/krustlet\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">Krustlet<\/span><\/a><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">&nbsp;a project which explores&nbsp;<\/span><span data-contrast=\"auto\">using&nbsp;<\/span><a href=\"https:\/\/webassembly.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">WebAssembl<\/span><span data-contrast=\"none\">y modul<\/span><span data-contrast=\"none\">es<\/span><\/a><span data-contrast=\"auto\">&nbsp;in Kubernetes&nbsp;<\/span><span data-contrast=\"auto\">to&nbsp;<\/span><span data-contrast=\"auto\">address&nbsp;<\/span><span data-contrast=\"auto\">some<\/span><span data-contrast=\"auto\">&nbsp;of these scenarios<\/span><span data-contrast=\"auto\">.&nbsp;<\/span><span data-contrast=\"auto\">With&nbsp;<\/span><span data-contrast=\"auto\">Krustlet<\/span><span data-contrast=\"auto\">&nbsp;you can&nbsp;<\/span><span data-contrast=\"auto\">test-drive&nbsp;<\/span><a href=\"https:\/\/webassembly.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">WebAssemblies<\/span><\/a><span data-contrast=\"auto\">&nbsp;<\/span><span data-contrast=\"auto\">(also called&nbsp;<\/span>WASM)&nbsp;<span data-contrast=\"auto\">in Kubernetes alongside your containers<\/span><span data-contrast=\"auto\">,&nbsp;<\/span><span data-contrast=\"auto\">offering&nbsp;<\/span><span data-contrast=\"auto\">the possibility of&nbsp;<\/span><span data-contrast=\"auto\">new&nbsp;<\/span><span data-contrast=\"auto\">security and runtime&nbsp;<\/span><span data-contrast=\"auto\">capabilities<\/span><span data-contrast=\"auto\">.<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-contrast=\"auto\">If you\u2019re<\/span><span data-contrast=\"auto\">&nbsp;already hooked and want to experiment<\/span><span data-contrast=\"auto\">&nbsp;with Kubernetes and&nbsp;<\/span><span data-contrast=\"auto\">WASM<\/span><span data-contrast=\"auto\">, you can&nbsp;<\/span><span data-contrast=\"none\">dive right in with the project<\/span><span data-contrast=\"auto\">, or read<\/span><span data-contrast=\"auto\">&nbsp;the<\/span><span data-contrast=\"auto\">&nbsp;<\/span><a href=\"https:\/\/aka.ms\/krustlet-rust\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">introduction to Krustlet<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">by Matt Fisher<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"secure-runtimes-and-constrained-environments-are-hard\">Secure runtimes&nbsp;and&nbsp;constrained&nbsp;environments&nbsp;are hard<\/h2>\n\n\n\n<p><span data-contrast=\"auto\">The container&nbsp;<\/span><span data-contrast=\"auto\">community, i<\/span><span data-contrast=\"auto\">ncluding Microsoft, <\/span><span data-contrast=\"auto\">has worked extremely hard <\/span><span data-contrast=\"auto\">for years on security issues<\/span><span data-contrast=\"auto\"> and has made amazing progress<\/span><span data-contrast=\"auto\">. Container runtimes have restricted<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-contrast=\"auto\">the ability of containers to&nbsp;<\/span><span data-contrast=\"auto\">use sensitive&nbsp;<\/span><span data-contrast=\"auto\">kernel&nbsp;<\/span><span data-contrast=\"auto\">calls<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-contrast=\"auto\">and&nbsp;<\/span><span data-contrast=\"auto\">the Kubernetes ecosystem has&nbsp;<\/span><span data-contrast=\"auto\">enough new&nbsp;<\/span><span data-contrast=\"auto\">tools \u2013 meshes, access policy engines, thin hypervisors \u2013 that with work,&nbsp;<\/span><span data-contrast=\"auto\">a<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-contrast=\"auto\">substantial&nbsp;<\/span><span data-contrast=\"auto\">degree of confidence in&nbsp;<\/span><span data-contrast=\"auto\">security<\/span><span data-contrast=\"auto\">&#8211;<\/span><span data-contrast=\"auto\">sensitive environments can be achieved. If you\u2019re&nbsp;<\/span><span data-contrast=\"auto\">good<\/span><span data-contrast=\"auto\">.&nbsp;<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">Despite this tremendous work, there remain environments for which Kubernetes and containers are not yet well suited.&nbsp;<\/span><span data-contrast=\"auto\">For example, c<\/span><span data-contrast=\"auto\">ontainers<\/span><span data-contrast=\"auto\">&nbsp;should&nbsp;<\/span><span data-contrast=\"auto\">be small,&nbsp;<\/span><span data-contrast=\"auto\">but often aren\u2019t. E<\/span><span data-contrast=\"auto\">nvironments&nbsp;<\/span><span data-contrast=\"auto\">with constrained&nbsp;<\/span><span data-contrast=\"auto\">resources \u2013&nbsp;<\/span><span data-contrast=\"auto\">memory and disk space, primarily \u2013&nbsp;<\/span><span data-contrast=\"auto\">cannot<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-contrast=\"auto\">use&nbsp;<\/span><span data-contrast=\"auto\">large containers&nbsp;<\/span><span data-contrast=\"auto\">and the runtimes they need<\/span><span data-contrast=\"auto\">.&nbsp;<\/span><span data-contrast=\"auto\">Even if they&nbsp;<\/span><span data-contrast=\"auto\">could<\/span><span data-contrast=\"auto\">,&nbsp;<\/span><span data-contrast=\"auto\">some&nbsp;<\/span><span data-contrast=\"auto\">organizations remain unready to deploy a&nbsp;<\/span><span data-contrast=\"auto\">runtime when the default configuration must be dramatically tightened down to provide confidence.<\/span><span data-contrast=\"auto\">&nbsp;<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">What i<\/span><span data-contrast=\"auto\">f we had another&nbsp;<\/span><i><span data-contrast=\"auto\">sandboxed process type<\/span><\/i><span data-contrast=\"auto\">, one that was&nbsp;<\/span><span data-contrast=\"auto\">by default completely sandboxed<\/span><span data-contrast=\"auto\">&nbsp;and for which the runtimes could be both extremely fast \u2013 faster than launching containers \u2013&nbsp;<\/span><span data-contrast=\"auto\">and also<\/span><span data-contrast=\"auto\">&nbsp;much smaller<\/span><span data-contrast=\"auto\">? C<\/span><span data-contrast=\"auto\">ould&nbsp;<\/span><span data-contrast=\"auto\">it be<\/span><span data-contrast=\"auto\">&nbsp;possible for Kubernetes to run those?&nbsp;<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">The answer is&nbsp;<\/span><i><span data-contrast=\"auto\">yes, it is possible.<\/span><\/i><i><span data-contrast=\"auto\">&nbsp;<\/span><\/i><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">One way to do the above is to use a very small hypervisor; in fact, there are several that have been built, among them <\/span><a href=\"https:\/\/gvisor.dev\/\"><span data-contrast=\"none\">gVisor<\/span><\/a><span data-contrast=\"auto\">. Start-up time is reduced, and security aspects are addressed as well<\/span><span data-contrast=\"auto\">, so this approach is a promising area for the current workloads in Kubernetes. Even so, there&nbsp;<\/span><span data-contrast=\"auto\">is&nbsp;<\/span><span data-contrast=\"auto\">another sandboxed process type that has a vibrant ecosystem<\/span><span data-contrast=\"auto\">, a secure-by-default runtime model, and is very fast and very small.&nbsp;<\/span><span data-contrast=\"auto\">WebAssembly.<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"wasm-and-wasi-enter-the-picture\"><strong>WASM and WASI enter the picture<\/strong><\/h4>\n\n\n\n<p><span data-contrast=\"auto\">Get ready for a lot of acronyms.&nbsp;<\/span><span data-contrast=\"auto\">WebAssembly<\/span><span data-contrast=\"auto\">&nbsp;\u2013 commonly called&nbsp;<\/span><a href=\"https:\/\/webassembly.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">WASM<\/span><\/a><span data-contrast=\"auto\">&nbsp;\u2013&nbsp; is a compact bytecode format optimized for fast download and maximum execution speed and has been an&nbsp;<\/span><a href=\"https:\/\/www.w3.org\/wasm\/\"><span data-contrast=\"none\">open web standard<\/span><\/a><span data-contrast=\"auto\">&nbsp;for&nbsp;<\/span><span data-contrast=\"auto\">a few years<\/span><span data-contrast=\"auto\">. Up until now, it has been used mainly in browsers for fully sandboxed, but highly performant, computing. For one <\/span><span data-contrast=\"auto\">recent&nbsp;<\/span><span data-contrast=\"auto\">example, Microsoft\u2019s&nbsp;<\/span><a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/blazor\/?view=aspnetcore-3.1#blazor-webassembly\"><span data-contrast=\"none\">Blazor Framework<\/span><\/a><span data-contrast=\"auto\"> can use WASM to enable very performant and complex visualizations, among other things.<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">One of the hindrances of using&nbsp;<\/span><span data-contrast=\"auto\">WebAssembly<\/span><span data-contrast=\"auto\">&nbsp;outside browser environments has been the lack of a single compile target. But l<\/span><span data-contrast=\"auto\">ast year&nbsp;<\/span><a href=\"https:\/\/www.mozilla.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">Mozilla<\/span><\/a><span data-contrast=\"auto\">&nbsp;announced the&nbsp;<\/span><a href=\"https:\/\/hacks.mozilla.org\/2019\/03\/standardizing-wasi-a-webassembly-system-interface\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">WebAssembly System Interface<\/span><\/a><span data-contrast=\"auto\">&nbsp;effort, or&nbsp;<\/span><a href=\"https:\/\/wasi.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">WASI<\/span><\/a><span data-contrast=\"auto\">, to provide a system interface so that compilers can target the interface and not the&nbsp;<\/span><span data-contrast=\"auto\">underlying operating system \u2013 and that&nbsp;<\/span><span data-contrast=\"auto\">could&nbsp;<\/span><span data-contrast=\"auto\">make&nbsp;<\/span><span data-contrast=\"auto\">WebAssembly<\/span><span data-contrast=\"auto\"> a developer target at scale.&nbsp;<\/span><span data-contrast=\"auto\">If you want to know a lot more about WASI,&nbsp;<\/span><a href=\"https:\/\/hacks.mozilla.org\/2019\/03\/standardizing-wasi-a-webassembly-system-interface\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span data-contrast=\"none\">Lin Clark\u2019s original announcement<\/span><\/a><span data-contrast=\"auto\"> is a great explainer.<\/span><\/p>\n\n\n\n<p><span data-contrast=\"auto\">If you\u2019re unclear about the potential of WASI to bring WASM to the masses, perhaps&nbsp;<\/span><span data-contrast=\"auto\">Docker founder&nbsp;<\/span><span data-contrast=\"auto\">Solomon Hykes can convince you:<\/span><span data-wac-het=\"1\" data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/twitter.com\/solomonstre\/status\/1111004913222324225\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/Solomon-Hykes-WASM-WASI-tweet.png\" alt=\"Solomon Hykes WASM WASI tweet\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Importantly, at a very high level WASM has two main features that the Kubernetes ecosystem might be able to use to its advantage:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WebAssemblies and their runtimes can execute fast and be very small compared to containers<\/li>\n\n\n\n<li>WebAssemblies are by default unable to do anything; only with explicit permissions can they execute at all<\/li>\n<\/ul>\n\n\n\n<p>These two features hit our sweet spot, which suggested to us that we might profitably use WASM with Kubernetes to work in constrained and security-conscious environments \u2013 places where containers have a harder time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-krustlet-experiment\">The Krustlet experiment<\/h2>\n\n\n\n<p>For several months our team has been experimenting with a <a href=\"https:\/\/kubernetes.io\/docs\/reference\/command-line-tools-reference\/kubelet\/\">Kubelet<\/a> implementation written in <a href=\"https:\/\/www.rust-lang.org\/\">Rust<\/a> that runs WebAssemblies to understand how to run WASM in Kubernetes. Today we are announcing that this project, <a href=\"https:\/\/aka.ms\/krustlet\">Krustlet<\/a>, has reached a 0.1.0 release. Krustlet is early work, of course. Many of the things you would expect to be in a conformant Kubernetes system are not running yet, such as init \u201ccontainers\u201d and volumes; those will come soon.<\/p>\n\n\n\n<p>What you can do with Krustlet v0.1.0 and the <a href=\"https:\/\/radu-matei.com\/blog\/wasm-to-oci\/\">wasm-to-oci<\/a> tool:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Push and pull WASMs to Azure Container Registry or any OCI distribution greater than v2.7.0<\/li>\n\n\n\n<li>Use the YAML manifests you <em>know and LOVE <\/em>to schedule a WebAssembly module to a node running Krustlet \u2013 because it\u2019s just Kubernetes.<\/li>\n\n\n\n<li>Use Minikube, KinD, and Azure Kubernetes Service (with instructions for more distributions coming)<\/li>\n\n\n\n<li>Use either wasmtime or waSCC, with other runtime support coming<\/li>\n<\/ul>\n\n\n\n<p>Is that a lot? Well \u2013 not really. It\u2019s the very beginning. But it <em>means quite a bit about the future.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wasi-is-the-way-forward\">WASI is the way forward<\/h2>\n\n\n\n<p>Krustlet can run multiple runtimes because <a href=\"https:\/\/github.com\/appcypher\/awesome-wasm-runtimes\" target=\"_blank\" rel=\"noopener noreferrer\">there are so many<\/a> and not all of them support WASI, as it\u2019s still a work in progress. As a result, in this initial release, however, two providers are supported:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wasmtime<\/li>\n\n\n\n<li>WaSCC<\/li>\n<\/ul>\n\n\n\n<p>Both are great ways to get working with WASM in Kubernetes (and if you want to create a Krustlet provider for your favorite runtime, <a href=\"https:\/\/github.com\/deislabs\/krustlet\/issues\">jump in with an issue<\/a>). WaSCC is an interesting platform to try out WASMs in Kubernetes because it has a robust capabilities-based security model. You can build capability providers either as native binaries or as WASI modules, and support for these WASI capability providers will mature as the WASI specification and community progresses.<\/p>\n\n\n\n<p>While Microsoft has been involved with WebAssembly (the Edge browser supports it), many organizations have realized that WASM with WASI could be the process model that helps get hard jobs done. In particular, the work of the Mozilla Foundation to launch the WASI specification process was an inspiration and, we think, will pay dividends sooner rather than later, though much hard work remains to be done. Much of that work continues under the <a href=\"https:\/\/bytecodealliance.org\">Bytecode Alliance<\/a>, formed among other things to help shepherd WASI.<\/p>\n\n\n\n<p>We\u2019ve also been collaborating with <a href=\"https:\/\/www.capitalone.com\/\">CapitalOne<\/a> \u2013 the creators of waSCC \u2013 as well as taking notice of all the work in the WASM ecosystem, among them:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/solo.io\" target=\"_blank\" rel=\"noopener noreferrer\">Solo.io<\/a>&#8216; s creation of the <a href=\"https:\/\/medium.com\/solo-io\/introducing-the-webassembly-hub-a-service-for-building-deploying-sharing-and-discovering-wasm-d461719383ca\">WebAssembly Hub<\/a> for <a href=\"https:\/\/twitter.com\/copyconstruct\/status\/1106585959838052352?s=20\">WASM-based Envoy proxy filters<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudflare.com\">CloudFlare<\/a>, who has introduced WASM-based <a href=\"https:\/\/workers.cloudflare.com\/\">Workers<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.fastly.com\/\">Fastly<\/a>, who created <a href=\"https:\/\/www.fastly.com\/blog\/announcing-lucet-fastly-native-webassembly-compiler-runtime\">Lucet<\/a>, a runtime optimized for speed and who is working hard on WASI as well<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"why-krustlet-is-a-kubelet\">Why Krustlet is a Kubelet<\/h2>\n\n\n\n<p>We didn\u2019t set out to build a Kubelet. But trying to create a <a href=\"https:\/\/kubernetes.io\/blog\/2016\/12\/container-runtime-interface-cri-in-kubernetes\/\">Container Runtime Interface<\/a> implementation taught us that CRI v1 is really meant for container runtimes. <em>Really meant for container runtimes. <\/em>Though this work may pave the way for an elaboration of CRI v2, we learned that a Kubelet was really the best way to extend Kubernetes, much like the <a href=\"https:\/\/virtual-kubelet.io\/\">Virtual Kubelet<\/a> project, which has many provider implementations.<\/p>\n\n\n\n<p>We also learned that using Rust to build Kubernetes components was a wonderful experience compared to Go, and it should be much more widely adopted for Kubernetes work. We\u2019ll elaborate on this point in the near future, but the use of Rust is the reason we did not rely on Virtual Kubelet for the project.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"both-webassemblies-and-containers-are-needed\"><strong>Both WebAssemblies and containers are needed<\/strong><\/h4>\n\n\n\n<p>Despite the excitement about Wasm and WASI, it should be clear that containers are the major workload in K8s, and for good reason. No one will be replacing the vast majority of their workloads with WebAssembly. Our usage so far makes this clear. Do not be confused by having more tools at your disposal.<\/p>\n\n\n\n<p>For example, WebAssembly modules are binaries and not OS environments, so you can\u2019t simply bring your app code and compile it into a WASM like you can a container. Instead, you\u2019re going to build one binary, which in good cloud-native style should do one thing, and well. This means, however, that WASM \u201cpods\u201d in Kubernetes are going to be brand new work; they likely didn\u2019t exist before. Containers clearly remain the vast bulk of Kubernetes work.<\/p>\n\n\n\n<p>WASMs can be packed very, very densely, however, so using WebAssembly might maximize the processing throughput for large public cloud servers as well as more constrained environments. They\u2019re unable to perform any work unless granted the permissions to do so, which means organizations that do not yet have confidence in container runtimes will have a great possibility to explore. And memory or otherwise constrained environments such as ARM32 or other system-on-a-chips (SOCs) and microcontroller units (MCUs) may be now attachable to and schedulable from larger clusters and managed using the same or similar tooling to that which Kubernetes uses right now.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"get-going-with-krustlet\">Get going with Krustlet<\/h2>\n\n\n\n<p>Get up and running with Krustlet by jumping straight into the quickstart. If you\u2019re the sort who wants to understand WASM and WASI, start with Lin Clark\u2019s <a href=\"https:\/\/hacks.mozilla.org\/2019\/03\/standardizing-wasi-a-webassembly-system-interface\/\">WASI announcement<\/a>, but for a larger tour, it\u2019s really worth watching Fastly\u2019s CTO Tyler McMullen\u2019s <a href=\"https:\/\/www.youtube.com\/watch?v=QdWaQOgvd-g\">presentation at CodeMesh LDN<\/a> this past year.<\/p>\n\n\n\n<p>Give it a run, and let us know what you think.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Linux container&nbsp;technology has&nbsp;changed the face of computing, but especially distributed computing in&nbsp;publicly rentable&nbsp;servers commonly said to&nbsp;be \u201cthe public cloud\u201d (like Microsoft Azure). With&nbsp;containers&nbsp;came&nbsp;tooling \u2013 like&nbsp;Docker&nbsp;\u2013 and systems that orchestrate potentially millions of them \u2013 with&nbsp;Kubernetes&nbsp;becoming the most widely used.<\/p>\n","protected":false},"author":3163,"featured_media":79941,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"msxcm_post_with_no_image":false,"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","footnotes":""},"post_tag":[2272],"content-type":[346],"topic":[2241,2242],"programming-languages":[],"coauthors":[711],"class_list":["post-79794","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-microsoft","content-type-news","topic-cloud","topic-containers","review-flag-1-1593580432-963","review-flag-7-1593580463-151","review-flag-micro-1680215167-604","review-flag-new-1593580248-669"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WebAssembly meets Kubernetes with Krustlet | Microsoft Open Source Blog<\/title>\n<meta name=\"description\" content=\"Krustlet\u00a0is a brand new project that helps you test drive\u00a0WebAssemblies\u00a0(WASM)\u00a0in Kubernetes alongside your containers,\u00a0offering\u00a0the possibility of\u00a0new\u00a0security and runtime\u00a0capabilities.\u00a0\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebAssembly meets Kubernetes with Krustlet | Microsoft Open Source Blog\" \/>\n<meta property=\"og:description\" content=\"Krustlet\u00a0is a brand new project that helps you test drive\u00a0WebAssemblies\u00a0(WASM)\u00a0in Kubernetes alongside your containers,\u00a0offering\u00a0the possibility of\u00a0new\u00a0security and runtime\u00a0capabilities.\u00a0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Open Source Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-07T14:00:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-27T10:34:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ralph Squillace\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.png\" \/>\n<meta name=\"twitter:creator\" content=\"@OpenAtMicrosoft\" \/>\n<meta name=\"twitter:site\" content=\"@OpenAtMicrosoft\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ralph Squillace\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 min read\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\"},\"author\":[{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/author\/ralph-squillace\/\",\"@type\":\"Person\",\"@name\":\"Ralph Squillace\"}],\"headline\":\"WebAssembly meets Kubernetes with Krustlet\",\"datePublished\":\"2020-04-07T14:00:25+00:00\",\"dateModified\":\"2025-06-27T10:34:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\"},\"wordCount\":1750,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp\",\"keywords\":[\"Microsoft\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\",\"name\":\"WebAssembly meets Kubernetes with Krustlet | Microsoft Open Source Blog\",\"isPartOf\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp\",\"datePublished\":\"2020-04-07T14:00:25+00:00\",\"dateModified\":\"2025-06-27T10:34:41+00:00\",\"description\":\"Krustlet\u00a0is a brand new project that helps you test drive\u00a0WebAssemblies\u00a0(WASM)\u00a0in Kubernetes alongside your containers,\u00a0offering\u00a0the possibility of\u00a0new\u00a0security and runtime\u00a0capabilities.\u00a0\",\"breadcrumb\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp\",\"contentUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp\",\"width\":1024,\"height\":512,\"caption\":\"a screenshot of a computer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/opensource.microsoft.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebAssembly meets Kubernetes with Krustlet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#website\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/\",\"name\":\"Microsoft Open Source Blog\",\"description\":\"Open dialogue about openness at Microsoft \u2013 open source, standards, interoperability\",\"publisher\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/opensource.microsoft.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#organization\",\"name\":\"Microsoft Open Source Blog\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"contentUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"width\":259,\"height\":194,\"caption\":\"Microsoft Open Source Blog\"},\"image\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/OpenAtMicrosoft\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WebAssembly meets Kubernetes with Krustlet | Microsoft Open Source Blog","description":"Krustlet\u00a0is a brand new project that helps you test drive\u00a0WebAssemblies\u00a0(WASM)\u00a0in Kubernetes alongside your containers,\u00a0offering\u00a0the possibility of\u00a0new\u00a0security and runtime\u00a0capabilities.\u00a0","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/","og_locale":"en_US","og_type":"article","og_title":"WebAssembly meets Kubernetes with Krustlet | Microsoft Open Source Blog","og_description":"Krustlet\u00a0is a brand new project that helps you test drive\u00a0WebAssemblies\u00a0(WASM)\u00a0in Kubernetes alongside your containers,\u00a0offering\u00a0the possibility of\u00a0new\u00a0security and runtime\u00a0capabilities.\u00a0","og_url":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/","og_site_name":"Microsoft Open Source Blog","article_published_time":"2020-04-07T14:00:25+00:00","article_modified_time":"2025-06-27T10:34:41+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.png","type":"image\/png"}],"author":"Ralph Squillace","twitter_card":"summary_large_image","twitter_image":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.png","twitter_creator":"@OpenAtMicrosoft","twitter_site":"@OpenAtMicrosoft","twitter_misc":{"Written by":"Ralph Squillace","Est. reading time":"7 min read"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#article","isPartOf":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/"},"author":[{"@id":"https:\/\/opensource.microsoft.com\/blog\/author\/ralph-squillace\/","@type":"Person","@name":"Ralph Squillace"}],"headline":"WebAssembly meets Kubernetes with Krustlet","datePublished":"2020-04-07T14:00:25+00:00","dateModified":"2025-06-27T10:34:41+00:00","mainEntityOfPage":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/"},"wordCount":1750,"commentCount":0,"publisher":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#organization"},"image":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage"},"thumbnailUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp","keywords":["Microsoft"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/","url":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/","name":"WebAssembly meets Kubernetes with Krustlet | Microsoft Open Source Blog","isPartOf":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage"},"image":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage"},"thumbnailUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp","datePublished":"2020-04-07T14:00:25+00:00","dateModified":"2025-06-27T10:34:41+00:00","description":"Krustlet\u00a0is a brand new project that helps you test drive\u00a0WebAssemblies\u00a0(WASM)\u00a0in Kubernetes alongside your containers,\u00a0offering\u00a0the possibility of\u00a0new\u00a0security and runtime\u00a0capabilities.\u00a0","breadcrumb":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#primaryimage","url":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp","contentUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2020\/04\/krustlet-0.1.0_1024x512.webp","width":1024,"height":512,"caption":"a screenshot of a computer"},{"@type":"BreadcrumbList","@id":"https:\/\/opensource.microsoft.com\/blog\/2020\/04\/07\/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/opensource.microsoft.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WebAssembly meets Kubernetes with Krustlet"}]},{"@type":"WebSite","@id":"https:\/\/opensource.microsoft.com\/blog\/#website","url":"https:\/\/opensource.microsoft.com\/blog\/","name":"Microsoft Open Source Blog","description":"Open dialogue about openness at Microsoft \u2013 open source, standards, interoperability","publisher":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/opensource.microsoft.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/opensource.microsoft.com\/blog\/#organization","name":"Microsoft Open Source Blog","url":"https:\/\/opensource.microsoft.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","contentUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","width":259,"height":194,"caption":"Microsoft Open Source Blog"},"image":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/OpenAtMicrosoft"]}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Open Source Blog","distributor_original_site_url":"https:\/\/opensource.microsoft.com\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts\/79794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/users\/3163"}],"replies":[{"embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/comments?post=79794"}],"version-history":[{"count":1,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts\/79794\/revisions"}],"predecessor-version":[{"id":97696,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts\/79794\/revisions\/97696"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/media\/79941"}],"wp:attachment":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/media?parent=79794"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/post_tag?post=79794"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/content-type?post=79794"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/topic?post=79794"},{"taxonomy":"programming-languages","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/programming-languages?post=79794"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/coauthors?post=79794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}