<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nicolás A. Georger</title>
    <description>The latest articles on DEV Community by Nicolás A. Georger (@ngeorger).</description>
    <link>https://dev.to/ngeorger</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F645899%2Fc5e023b4-d74a-4d73-b860-d9be0c109e6d.jpeg</url>
      <title>DEV Community: Nicolás A. Georger</title>
      <link>https://dev.to/ngeorger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ngeorger"/>
    <language>en</language>
    <item>
      <title>kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway</title>
      <dc:creator>Nicolás A. Georger</dc:creator>
      <pubDate>Mon, 24 Mar 2025 07:28:42 +0000</pubDate>
      <link>https://dev.to/sredevopsorg/kgateway-an-amazing-tool-to-simplify-traffic-management-using-kubernetes-api-gateway-4ahd</link>
      <guid>https://dev.to/sredevopsorg/kgateway-an-amazing-tool-to-simplify-traffic-management-using-kubernetes-api-gateway-4ahd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu85hczw7zh6l1qdkfpq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu85hczw7zh6l1qdkfpq.png" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kgateway is a feature-rich, fast, and flexible Kubernetes-native ingress controller and next-generation API gateway. Built on top of the robust &lt;a href="https://www.envoyproxy.io/?ref=sredevops.org" rel="noopener noreferrer"&gt;Envoy proxy&lt;/a&gt; and the Kubernetes Gateway API, Kgateway acts as a reverse proxy, providing a crucial security barrier between your clients and the microservices that constitute your application. Think of it as the bouncer at the club, but instead of checking IDs, it verifies and routes requests to the appropriate microservice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kgateway's Superpowers
&lt;/h2&gt;

&lt;p&gt;Kgateway isn't just another API gateway; it's fully compliant with the Kubernetes Gateway API and extends its functionality with custom Gateway APIs like &lt;code&gt;RoutePolicies&lt;/code&gt;, &lt;code&gt;ListenerPolicies&lt;/code&gt;, and &lt;code&gt;Backends&lt;/code&gt;. These resources allow for centralized configuration of advanced traffic management, security, and resiliency rules for an &lt;code&gt;HTTPRoute&lt;/code&gt; or Gateway listener. In simpler terms, Kgateway gives you more control and flexibility over how traffic flows through your Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3x5ob7uiim3z561q196.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3x5ob7uiim3z561q196.png" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensions and integrations
&lt;/h2&gt;

&lt;p&gt;The kgateway project offers a range of extensions on top of the Kubernetes Gateway API, enabling advanced routing, security, and resiliency capabilities. Some of these extensions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/security/access-logging/?ref=sredevops.org" rel="noopener noreferrer"&gt;Access logging Security&lt;/a&gt;: Keep tabs on who's accessing what.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/setup/customize/aws-elb/?ref=sredevops.org" rel="noopener noreferrer"&gt;AWS ALB and NLB Traffic&lt;/a&gt;: Seamlessly integrate with AWS load balancers.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/traffic-management/destination-types/backends/lambda?ref=sredevops.org" rel="noopener noreferrer"&gt;AWS Lambda Traffic&lt;/a&gt;: Route traffic to serverless functions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/traffic-management/buffering/?ref=sredevops.org" rel="noopener noreferrer"&gt;Buffering Traffic&lt;/a&gt;: Manage traffic spikes like a pro.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/traffic-management/route-delegation/?ref=sredevops.org" rel="noopener noreferrer"&gt;Delegation Traffic&lt;/a&gt;: Delegate routing decisions for more granular control.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/traffic-management/direct-response/?ref=sredevops.org" rel="noopener noreferrer"&gt;Direct responses Traffic&lt;/a&gt;: Send direct responses without hitting a backend.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/setup/customize/?ref=sredevops.org" rel="noopener noreferrer"&gt;Gateway customization Setup&lt;/a&gt;: Tailor the gateway to your specific needs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/integrations/?ref=sredevops.org" rel="noopener noreferrer"&gt;Integrations Setup&lt;/a&gt;: Integrate with other tools and services.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/resiliency/mirroring/?ref=sredevops.org" rel="noopener noreferrer"&gt;Mirroring Resiliency&lt;/a&gt;: Mirror traffic for testing and debugging.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kgateway.dev/docs/traffic-management/transformations/?ref=sredevops.org" rel="noopener noreferrer"&gt;Transformations Traffic&lt;/a&gt;: Modify requests and responses on the fly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Default Gateway Proxy Setup: The Magic Behind the Scenes
&lt;/h2&gt;

&lt;p&gt;When you create a Kubernetes Gateway resource, Kgateway automatically spins up, bootstraps, and manages gateway proxy deployments. This magic is achieved through a combination of Kgateway and Kubernetes resources, including &lt;code&gt;GatewayClass&lt;/code&gt;, &lt;code&gt;GatewayParameters&lt;/code&gt;, and a gateway proxy template that includes the Envoy configuration for each proxy.&lt;/p&gt;

&lt;p&gt;For a deeper dive into the default setup and how these resources interact, check out the &lt;a href="https://kgateway.dev/docs/setup/default/?ref=sredevops.org" rel="noopener noreferrer"&gt;Default gateway proxy setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of a &lt;code&gt;GatewayClass&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: kgateway
spec:
  controllerName: kgateway.dev/kgateway
  description: KGateway Controller
  parametersRef:
    group: gateway.kgateway.dev
    kind: GatewayParameters
    name: kgateway
    namespace: kgateway-system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment Patterns: Choose how to route your traffic
&lt;/h2&gt;

&lt;p&gt;Kgateway's flexibility allows you to deploy it in a way that best suits your environment. Here are some recommended deployment patterns:&lt;/p&gt;

&lt;h3&gt;
  
  
  Simple Ingress: The Classic Approach
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-simple-ingress.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-simple-ingress.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="1593" height="1387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this setup, a single Kgateway proxy serves as the ingress API gateway for all workloads in a Kubernetes cluster. It's centrally managed by the Kgateway control plane and configured to match and forward traffic based on your defined rules. This is a great starting point for smaller environments where all workloads run in a single cluster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sharded Gateway: Divide and Conquer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-sharded-gateway.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-sharded-gateway.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="1594" height="1387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For larger environments or those with both high and low traffic services, a sharded gateway can help isolate services and protect against noisy neighbors. Multiple gateway proxies split the traffic for different services, providing better load balancing and isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sharded Gateway with Central Ingress: The Best of Both Worlds
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-central-ingress-gloo.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-central-ingress-gloo.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="2339" height="1387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This pattern combines a central ingress gateway proxy with a second layer of sharded gateway proxies. The central gateway applies common traffic management, resiliency, and security rules, while the second layer handles traffic for specific apps, teams, or namespaces. This is ideal if you need a central IP address and DNS name for the gateway that serves all your traffic.&lt;/p&gt;

&lt;p&gt;Kgateway can also be paired with other proxy types, such as HAProxy or AWS NLB/ALB, as your central ingress endpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-central-ingress-any.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fpattern-central-ingress-any.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="2281" height="1381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API Gateway for a Service Mesh: Istio Ambient Mesh Integration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fambient-ingress.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkgateway.dev%2Fimg%2Fambient-ingress.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="2496" height="1300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kgateway can be deployed as an ingress, egress, or waypoint proxy gateway for workloads in an Istio ambient mesh. This allows you to leverage Kgateway's features within your service mesh environment.&lt;/p&gt;

&lt;p&gt;For more details, refer to the guides for using Kgateway as an &lt;a href="https://kgateway.dev/docs/integrations/istio/ambient/ambient-ingress/?ref=sredevops.org" rel="noopener noreferrer"&gt;ingress&lt;/a&gt; or &lt;a href="https://kgateway.dev/docs/integrations/istio/ambient/waypoint/?ref=sredevops.org" rel="noopener noreferrer"&gt;waypoint proxy&lt;/a&gt; for your ambient mesh.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Gateway API Success with kgateway
&lt;/h2&gt;

&lt;p&gt;Kgateway is a powerful and versatile tool for managing traffic in your Kubernetes environment. Whether you're running a small cluster or a large, complex infrastructure, Kgateway provides the features and flexibility you need to ensure secure, reliable, and efficient communication between your services. So, go ahead and give Kgateway a try – your microservices will thank you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;p&gt;[&lt;/p&gt;

&lt;p&gt;kgateway&lt;/p&gt;

&lt;p&gt;Kgateway is a feature-rich, fast, and flexible API gateway that is built on top of Envoy proxy and the Kubernetes Gateway API. It excels in function-level routing, supports legacy apps, microservices and serverless, offers robust discovery capabilities, integrates seamlessly with open-source projects, and is designed to support hybrid applications with various technologies, architectures, protocols, and clouds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtuasehgqe5y8r5nolqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtuasehgqe5y8r5nolqa.png" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="180" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Fthumbnail%2Fuse-case-security.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Fthumbnail%2Fuse-case-security.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="65" height="86"&gt;&lt;/a&gt;&lt;br&gt;
](&lt;a href="https://kgateway.dev/?ref=sredevops.org" rel="noopener noreferrer"&gt;https://kgateway.dev/?ref=sredevops.org&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;[&lt;/p&gt;

&lt;p&gt;Welcome&lt;/p&gt;

&lt;p&gt;Kgateway is a feature-rich, fast, and flexible API gateway that is built on top of Envoy proxy and the Kubernetes Gateway API. It excels in function-level routing, supports legacy apps, microservices and serverless, offers robust discovery capabilities, integrates seamlessly with open-source projects, and is designed to support hybrid applications with various technologies, architectures, protocols, and clouds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylqwybqvvqbfpfsw2j2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylqwybqvvqbfpfsw2j2f.png" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="180" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Fthumbnail%2Flogo.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Fthumbnail%2Flogo.svg" alt="kgateway: An amazing tool to simplify traffic management using Kubernetes API Gateway" width="494" height="100"&gt;&lt;/a&gt;&lt;br&gt;
](&lt;a href="https://kgateway.dev/docs/?ref=sredevops.org" rel="noopener noreferrer"&gt;https://kgateway.dev/docs/?ref=sredevops.org&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cloud</category>
      <category>apps</category>
      <category>microservicios</category>
    </item>
    <item>
      <title>Kiss Goodbye to QEMU: Unleash the Power of Native GitHub Runners for Multi-Arch Docker Images</title>
      <dc:creator>Nicolás A. Georger</dc:creator>
      <pubDate>Tue, 18 Mar 2025 10:01:46 +0000</pubDate>
      <link>https://dev.to/sredevopsorg/kiss-goodbye-to-qemu-unleash-the-power-of-native-github-runners-for-multi-arch-docker-images-3e2p</link>
      <guid>https://dev.to/sredevopsorg/kiss-goodbye-to-qemu-unleash-the-power-of-native-github-runners-for-multi-arch-docker-images-3e2p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2F2025%2F03%2Fgha.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2F2025%2F03%2Fgha.webp" alt="Kiss Goodbye to QEMU: Unleash the Power of Native GitHub Runners for Multi-Arch Docker Images" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the cutthroat world of DevOps, where speed and efficiency are the holy grail, building multi-architecture Docker images used to be a pain in the neck. But hold on tight! With the advent of native GitHub runners, you can finally ditch the quirky QEMU emulation and embrace the lightning speed of native builds. This guide will take you by the hand and lead you through the dark arts of setting up a multi-architecture build process using GitHub Actions.&lt;/p&gt;

&lt;p&gt;[&lt;/p&gt;

&lt;p&gt;GitHub - sredevopsorg/multi-arch-docker-github-workflow: How to build a Multi-Architecture Docker Image in Github Actions using multiple runners without QEMU&lt;/p&gt;

&lt;p&gt;How to build a Multi-Architecture Docker Image in Github Actions using multiple runners without QEMU - sredevopsorg/multi-arch-docker-github-workflow&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Ficon%2Fpinned-octocat-093da3e6fa40-6.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Ficon%2Fpinned-octocat-093da3e6fa40-6.svg" alt="Kiss Goodbye to QEMU: Unleash the Power of Native GitHub Runners for Multi-Arch Docker Images" width="36" height="36"&gt;&lt;/a&gt;GitHubsredevopsorg&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F996c34e08b586b609dd111813a8f11643d2566f95dfdb1c182e7f92fce70c372%2Fsredevopsorg%2Fmulti-arch-docker-github-workflow" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F996c34e08b586b609dd111813a8f11643d2566f95dfdb1c182e7f92fce70c372%2Fsredevopsorg%2Fmulti-arch-docker-github-workflow" alt="Kiss Goodbye to QEMU: Unleash the Power of Native GitHub Runners for Multi-Arch Docker Images" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
](&lt;a href="https://github.com/sredevopsorg/multi-arch-docker-github-workflow?ref=sredevops.org" rel="noopener noreferrer"&gt;https://github.com/sredevopsorg/multi-arch-docker-github-workflow?ref=sredevops.org&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;
  
  
  Overview: The Two-Headed Beast
&lt;/h2&gt;

&lt;p&gt;This workflow is like a two-headed beast, split into two main jobs:&lt;/p&gt;
&lt;h3&gt;
  
  
  Build Job: The Workhorse
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matrix Strategy:&lt;/strong&gt;  This bad boy builds images for each platform separately, like a well-oiled machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Context and Buildx Setup:&lt;/strong&gt;  Configures the native builds, so you don't have to mess with QEMU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GHCR Login and Push:&lt;/strong&gt;  Uploads the image by its unique digest, keeping things tidy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact Export:&lt;/strong&gt;  Saves the digest for later use, because we're smart like that.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Merge Job: The Brain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Digest Download:&lt;/strong&gt;  Retrieves the digests from the build job, like a detective gathering clues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata Generation:&lt;/strong&gt;  Ensures consistency with the built images, because we like things neat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Arch Manifest Creation:&lt;/strong&gt;  Combines the images into a single, powerful manifest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manifest Push:&lt;/strong&gt;  Uploads everything to GHCR, enabling Docker to magically select the correct image based on architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This two-step process results in a "fat" image – a monstrous creation that delivers the right binary for any user's architecture, no questions asked.&lt;/p&gt;
&lt;h2&gt;
  
  
  Features: The Cool Stuff
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native Builds:&lt;/strong&gt;  We're using GitHub's native runners, so say adios to QEMU and its shenanigans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Arch Manifest:&lt;/strong&gt;  Merges per-architecture images into one, because we're efficient like that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Caching:&lt;/strong&gt;  Speeds up subsequent builds, because who has time to wait?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCI Metadata:&lt;/strong&gt;  Enhances image provenance with labels and annotations, making your images look professional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency Control:&lt;/strong&gt;  Cancels outdated builds using GitHub Actions concurrency, keeping things clean and tidy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Getting Started: Let's Roll Up Our Sleeves
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Prerequisites: What You Need
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub public repository (because the arm64 runners are picky and only work with public repos).&lt;/li&gt;
&lt;li&gt;A valid Dockerfile in the repository root, ready to be built.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Setup: The Nitty-Gritty
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Fork the Repository and edit the &lt;a href="https://github.com/sredevopsorg/multi-arch-docker-github-workflow/blob/main/.github/workflows/multi-build.yaml?ref=sredevops.org" rel="noopener noreferrer"&gt;multi-build.yaml&lt;/a&gt; file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review and Customize:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dockerfile:&lt;/strong&gt;  Tweak it to suit your application's dark desires.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow File:&lt;/strong&gt;  Adjust the parameters in &lt;code&gt;.github/workflows/multi-build.yaml&lt;/code&gt; as needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  A Step-by-Step Detailed Explanation: The Gory Details
&lt;/h2&gt;
&lt;h3&gt;
  
  
  File: &lt;a href="https://github.com/sredevopsorg/multi-arch-docker-github-workflow/blob/main/.github/workflows/multi-build.yaml?ref=sredevops.org" rel="noopener noreferrer"&gt;multi-build.yaml&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Let's dissect this beast, shall we?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Build multi arch Docker Image with separate Github Runners

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - 'Dockerfile'
      - '.github/workflows/multi-build.yaml'
env:
  GHCR_IMAGE: ghcr.io/${{ github.repository }}
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This workflow is a masterpiece that builds a multi-arch Docker image using GitHub Actions. It leverages separated GitHub Runners with native support for ARM64 and AMD64 architectures, completely avoiding the dreaded QEMU emulation.&lt;/li&gt;
&lt;li&gt;It uses Docker Buildx, a powerful tool, to build and push the image to the GitHub Container Registry (GHCR).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GHCR_IMAGE&lt;/code&gt;: Defines the name of the Docker image to be built and pushed to GHCR. The image name is cleverly derived from the GitHub repository name and the GHCR URL, resulting in a format like &lt;code&gt;ghcr.io/owner/repo&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

permissions:
  contents: read
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;permissions&lt;/code&gt;: Sets global permissions for the workflow. These can be overridden at the job level if needed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;concurrency&lt;/code&gt;: This ensures that only one job in the group runs at a time. If a new job is triggered, the previous one is mercilessly canceled.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        platform:
          - linux/amd64
          - linux/arm64
    permissions:
      attestations: write
      actions: read
      checks: write
      contents: write
      deployments: none
      id-token: write
      issues: read
      discussions: read
      packages: write
      pages: none
      pull-requests: read
      repository-projects: read
      security-events: read
      statuses: read
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;build&lt;/code&gt;: This job is the workhorse, building the Docker image for each platform specified in the matrix.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;matrix&lt;/code&gt;: Defines the platforms: &lt;code&gt;linux/amd64&lt;/code&gt; and &lt;code&gt;linux/arm64&lt;/code&gt;. The build job will run for each of these platforms.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permissions&lt;/code&gt;: Sets specific permissions for the build job, allowing it to write to GHCR and read from the repository.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

    runs-on: ${{ matrix.platform == 'linux/amd64' &amp;amp;&amp;amp; 'ubuntu-latest' || matrix.platform == 'linux/arm64' &amp;amp;&amp;amp; 'ubuntu-24.04-arm' }}
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;runs-on&lt;/code&gt;: This cleverly selects the appropriate runner based on the platform:

&lt;ul&gt;
&lt;li&gt;For &lt;code&gt;linux/amd64&lt;/code&gt;, it uses the latest Ubuntu runner.&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;linux/arm64&lt;/code&gt;, it uses an Ubuntu 24.04 ARM runner.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

    name: Build Docker image for ${{ matrix.platform }}
    steps:
      -
        name: Prepare environment for current platform 
        id: prepare
        run: |
          platform=${{ matrix.platform }}
          echo "PLATFORM_PAIR=${platform//\//-}" &amp;gt;&amp;gt; $GITHUB_ENV

      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Docker meta default
        id: meta
        uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
        with:
          images: ${{ env.GHCR_IMAGE }}
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;prepare&lt;/code&gt; step sets up the environment for the current platform. It replaces '/' in the platform name with '-' and sets it as an environment variable (&lt;code&gt;PLATFORM_PAIR&lt;/code&gt;). This is useful for naming artifacts and other resources that can't handle '/'.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Checkout&lt;/code&gt;: This step uses &lt;code&gt;actions/checkout@v4.2.2&lt;/code&gt; to clone the repository into the runner's workspace.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Docker meta default&lt;/code&gt;: This step uses &lt;code&gt;docker/metadata-action@v5.7.0&lt;/code&gt; to generate metadata for the Docker image, including the image name, tags, and labels. This metadata will be used later for building and pushing the image.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

      - name: Set up Docker Context for Buildx

        id: buildx-context
        run: |
          docker context create builders

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
        with:
          endpoint: builders
          platforms: ${{ matrix.platform }}

      - name: Login to GitHub Container Registry
        # This step logs in to the GitHub Container Registry (GHCR) using the docker/login-action.
        # It uses the GitHub actor's username and the GITHUB_TOKEN secret for authentication.
        uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Set up Docker Context for Buildx&lt;/code&gt;: Creates a new context named "builders" for Buildx, allowing it to use the Docker daemon for building images.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Set up Docker Buildx&lt;/code&gt;: Configures Buildx (&lt;code&gt;docker/setup-buildx-action@v3.10.0&lt;/code&gt;) with the specified context and platforms.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Login to GitHub Container Registry&lt;/code&gt;: Logs in to GHCR using &lt;code&gt;docker/login-action@v3.4.0&lt;/code&gt; with the GitHub actor's username and the &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; secret.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

      - name: Build and push by digest
        id: build
        uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
        env:
          DOCKER_BUILDKIT: 1
        with:
          context: .
          platforms: ${{ matrix.platform }}
          labels: ${{ steps.meta.outputs.labels }}
          annotations: ${{ steps.meta.outputs.annotations }}
          outputs: type=image,name=${{ env.GHCR_IMAGE }},push-by-digest=true,name-canonical=true,push=true,oci-mediatypes=true
          cache-from: type=gha,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }}
          cache-to: type=gha,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }}
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Build and push by digest&lt;/code&gt;: This is where the magic happens. It uses &lt;code&gt;docker/build-push-action@v6.15.0&lt;/code&gt; to build the image with the specified context and platforms. The image is built with the labels and annotations generated earlier.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;outputs&lt;/code&gt;: Configures the action to push the image by digest, enabling better caching and versioning.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cache-from&lt;/code&gt; and &lt;code&gt;cache-to&lt;/code&gt;: Enable caching for the build process, storing the cache in GitHub Actions cache and scoping it to the repository, branch, and platform.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)

      - name: Export digest
        run: |
          mkdir -p /tmp/digests
          digest="${{ steps.build.outputs.digest }}"
          touch "/tmp/digests/${digest#sha256:}"

      - name: Upload digest      
        uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
        with:
          name: digests-${{ env.PLATFORM_PAIR }}
          path: /tmp/digests/*
          if-no-files-found: error
          retention-days: 1
#(...)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Export digest&lt;/code&gt;: Creates a directory &lt;code&gt;/tmp/digests&lt;/code&gt; and saves the digest of the built image to a file. The digest uniquely identifies the built image.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Upload digest&lt;/code&gt;: Uploads the digest file to GitHub Actions artifact storage using &lt;code&gt;actions/upload-artifact@v4.6.1&lt;/code&gt;. The artifact is named &lt;code&gt;digests-${{ env.PLATFORM_PAIR }}&lt;/code&gt; and is retained for 1 day.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# (...)
  merge:
    name: Merge Docker manifests
    runs-on: ubuntu-latest
    permissions:
      attestations: write
      actions: read
      checks: read
      contents: read
      deployments: none
      id-token: write
      issues: read
      discussions: read
      packages: write
      pages: none
      pull-requests: read
      repository-projects: read
      security-events: read
      statuses: read

    needs:
      - build
    steps:
      - name: Download digests
        uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
        with:
          path: /tmp/digests
          pattern: digests-*
          merge-multiple: true

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;merge&lt;/code&gt;: This job merges the Docker manifests for the different platforms built in the previous job.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;needs: - build&lt;/code&gt;: Ensures that the &lt;code&gt;build&lt;/code&gt; job completes successfully before starting.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Download digests&lt;/code&gt;: Downloads the digest files uploaded in the &lt;code&gt;build&lt;/code&gt; job using &lt;code&gt;actions/download-artifact@v4.1.9&lt;/code&gt;. The files are merged into the &lt;code&gt;/tmp/digests&lt;/code&gt; directory.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      - name: Docker meta
        id: meta
        uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
        with:
          images: ${{ env.GHCR_IMAGE }}
          annotations: |
            type=org.opencontainers.image.description,value=${{ github.event.repository.description || 'No description provided' }}
          tags: |
            type=raw,value=main,enable=${{ github.ref_name == 'main' }}
            type=raw,value=latest,enable=${{ github.ref_name == 'main' }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
        with:
          driver-opts: |
            network=host

      - name: Login to GitHub Container Registry
        uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Get execution timestamp with RFC3339 format
        id: timestamp
        run: |
          echo "timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" &amp;gt;&amp;gt; $GITHUB_OUTPUT

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Docker meta&lt;/code&gt;: Generates metadata for the Docker image using &lt;code&gt;docker/metadata-action@v5.7.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Set up Docker Buildx&lt;/code&gt;: Sets up Buildx again (&lt;code&gt;docker/setup-buildx-action@v3.10.0&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Login to GitHub Container Registry&lt;/code&gt;: Logs in to GHCR (&lt;code&gt;docker/login-action@v3.4.0&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Get execution timestamp with RFC3339 format&lt;/code&gt;: Gets the current UTC time in RFC3339 format for annotating the Docker manifest list.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      - name: Create manifest list and pushs
        working-directory: /tmp/digests
        id: manifest-annotate
        continue-on-error: true
        run: |
              docker buildx imagetools create \
                $(jq -cr '.tags | map("-t " + .) | join(" ")' &amp;lt;&amp;lt;&amp;lt; "$DOCKER_METADATA_OUTPUT_JSON") \
                --annotation='index:org.opencontainers.image.description=${{ github.event.repository.description }}' \
                --annotation='index:org.opencontainers.image.created=${{ steps.timestamp.outputs.timestamp }}' \
                --annotation='index:org.opencontainers.image.url=${{ github.event.repository.url }}' \
                --annotation='index:org.opencontainers.image.source=${{ github.event.repository.url }}' \
                $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *)

      - name: Create manifest list and push without annotations
        if: steps.manifest-annotate.outcome == 'failure'
        working-directory: /tmp/digests
        run: |
              docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' &amp;lt;&amp;lt;&amp;lt; "$DOCKER_METADATA_OUTPUT_JSON") \
                $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *)

      - name: Inspect image
        id: inspect
        run: |
          docker buildx imagetools inspect '${{ env.GHCR_IMAGE }}:${{ steps.meta.outputs.version }}'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Create manifest list and push&lt;/code&gt;: Creates a manifest list for the Docker images built for different platforms using &lt;code&gt;docker buildx imagetools create&lt;/code&gt;. The manifest list is annotated with metadata and pushed to GHCR.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Create manifest list and push without annotations&lt;/code&gt;: If the previous step fails, this step creates the manifest list without annotations and pushes it to GHCR.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Inspect image&lt;/code&gt;: Inspects the created manifest list using &lt;code&gt;docker buildx imagetools inspect&lt;/code&gt; to verify its contents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There you have it! A complete, step-by-step guide to building multi-arch Docker images like a pro, using native GitHub Runners and leaving QEMU in the dust. Now go forth and conquer the world of multi-architecture deployments!&lt;/p&gt;

&lt;p&gt;[&lt;/p&gt;

&lt;p&gt;GitHub - sredevopsorg/multi-arch-docker-github-workflow: How to build a Multi-Architecture Docker Image in Github Actions using multiple runners without QEMU&lt;/p&gt;

&lt;p&gt;How to build a Multi-Architecture Docker Image in Github Actions using multiple runners without QEMU - sredevopsorg/multi-arch-docker-github-workflow&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Ficon%2Fpinned-octocat-093da3e6fa40-7.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Ficon%2Fpinned-octocat-093da3e6fa40-7.svg" alt="Kiss Goodbye to QEMU: Unleash the Power of Native GitHub Runners for Multi-Arch Docker Images" width="36" height="36"&gt;&lt;/a&gt;GitHubsredevopsorg&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Fthumbnail%2Fmulti-arch-docker-github-workflow" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsredevops.org%2Fcontent%2Fimages%2Fthumbnail%2Fmulti-arch-docker-github-workflow" alt="Kiss Goodbye to QEMU: Unleash the Power of Native GitHub Runners for Multi-Arch Docker Images" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
](&lt;a href="https://github.com/sredevopsorg/multi-arch-docker-github-workflow?ref=sredevops.org" rel="noopener noreferrer"&gt;https://github.com/sredevopsorg/multi-arch-docker-github-workflow?ref=sredevops.org&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>containers</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>WebAssembly listo para producción? WASI Preview 2 lo hace realidad</title>
      <dc:creator>Nicolás A. Georger</dc:creator>
      <pubDate>Wed, 10 Apr 2024 19:56:47 +0000</pubDate>
      <link>https://dev.to/sredevopsorg/webassembly-listo-para-produccion-wasi-preview-2-lo-hace-realidad-3ij8</link>
      <guid>https://dev.to/sredevopsorg/webassembly-listo-para-produccion-wasi-preview-2-lo-hace-realidad-3ij8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Resumen:  &lt;/p&gt;

&lt;p&gt;WebAssembly, o Wasm para abreviar, ha prometido desde hace mucho tiempo revolucionar el desarrollo de aplicaciones. El sueño era simple pero poderoso (y familiar): escribe tu código una vez y hazlo funcionar en cualquier lugar. Wasm también prometió ejecutar código a velocidades cercanas a las nativas. Incluso mejor, a diferencia de intentos anteriores de runtimes universales como Java, Wasm ofreció garantías de seguridad más elevadas y una postura de seguridad predeterminada deny-by-default (el acceso a los recursos del sistema está deshabilitado a menos que un desarrollador lo indique de otra manera).&lt;br&gt;&lt;br&gt;
Hasta hace poco, la realidad de Wasm no alcanzó el potencial prometido. Las herramientas y características críticas necesarias para una adopción más amplia todavía faltaban. Sin embargo, WASI Preview 2 ha llenado esas brechas y ha abierto la puerta a la adopción masiva de Wasm en entornos de producción.  &lt;/p&gt;

&lt;p&gt;El modelo de componentes y el soporte HTTP integrado en WASI Preview 2 simplifican ciertos aspectos en comparación con POSIX, haciendo que WASI sea una interfaz más moderna y portable para aplicaciones web y back-end. Con esta tecnología, los desarrolladores pueden elegir bibliotecas de cualquier ecosistema o lenguaje, compilarlas como módulos y estructurarlos en una sola aplicación. Esto permite que los equipos dentro de una organización desarrollen sistemas con el stack de su preferencia y luego unifiquen sus componentes y módulos en una aplicación monolítica.  &lt;/p&gt;

&lt;p&gt;No es difícil ver cómo WASI Preview 2 ha transformado la posibilidad del futuro de Wasm. Esta tecnología debe impulsar un aumento rápido en la adopción y despliegue de Wasm, lo que beneficiará a desarrolladores e inversionistas tecnológicos alrededor del mundo. WASI Preview 2 es el punto de inflexión que lleva a una era de desarrollo de software más fácil, rápido y seguro para todos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;¿Por qué WASI Preview 2 hace que WebAssembly esté listo para producción?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VCXXKgnd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sredevops.org/content/images/2024/04/WebAssembly-WASM-WASI.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VCXXKgnd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sredevops.org/content/images/2024/04/WebAssembly-WASM-WASI.png" alt="WebAssembly listo para producción? WASI Preview 2 lo hace realidad" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WebAssembly, o Wasm para abreviar, ha prometido desde hace mucho tiempo revolucionar el desarrollo de aplicaciones. El sueño era simple pero poderoso (y familiar): escribe tu código una vez y hazlo funcionar en cualquier lugar. Wasm también prometió ejecutar código a velocidades cercanas a las nativas. Incluso mejor, a diferencia de intentos anteriores de runtimes universales como Java, Wasm ofreció garantías de seguridad más elevadas y una postura de seguridad predeterminada deny-by-default &lt;em&gt;(el acceso a los recursos del sistema está deshabilitado a menos que un desarrollador lo indique de otra manera)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Hasta hace poco, la realidad de Wasm no cumplía con la promesa. A pesar del enorme potencial y la comunidad creciente, Wasm carecía de las herramientas, interfaces y APIs necesarias para que fuera verdaderamente apto para producción. Los desarrolladores que deseaban usar Wasm tenían que convertirse en expertos en Wasm, adentrándose en aguas oscuras y sin documentar o recurrir a empresas especializadas en Wasm como Cosmonic o Fermyon, que ofrecen PaaS simplificadoras de la curva inicial de aprendizaje.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Más que una vista previa: estabilizando el modelo de componente&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;WASI Preview 2, aunque se llame "vista previa", es sólo el nombre. WASI Preview 2 es el eslabón perdido que Wasm necesitaba para volverse una opción viable para casos de uso en producción. WASI, que significa "Interfaz de Sistema WebAssembly" (Inglés), es un conjunto de estándares que definen una manera estándar y segura para que los módulos Wasm interactúen con recursos de sistema. WASI Preview 2 representa un hito significativo en la evolución de Wasm porque provee un standard sólido desde el cual los desarrolladores pueden construir con confianza sabiendo que toda la plataforma no va a tener cambios que impliquen refactoring o incompatibilidades (similar a &lt;a href="https://www.postman.com/api-platform/api-versioning/?ref=sredevops.org"&gt;API versioning&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;En el corazón de WASI Preview 2 se encuentra el Modelo de Componente WebAssembly. Esta pieza crucial del rompecabezas brinda una manera de componer módulos Wasm en componentes más grandes, incluso si fueron programados en diferentes lenguajes. Es un gran paso adelante en términos de flexibilidad y compatibilidad. El modelo de componentes define una IAB canónica (interfaz de aplicación binaria) que estandariza la manera en que los componentes se comunican entre sí y les impide acceder a las memorias de otros componentes. Esto elimina los tipos de errores y vulnerabilidades de seguridad más comunes.&lt;/p&gt;

&lt;p&gt;Otro aspecto clave de WASI Preview 2 es la estabilización de las API. Esto garantiza la compatibilidad en el futuro para aplicaciones Wasm, dando a los desarrolladores la confianza para construir encima de Preview 2 sin preocuparse por desastres futuros. Es análogo al modo en que POSIX (la Interfaz de Sistema Portátil) estandarizó las interfaces a través de sistemas operativos Unix, facilitando en gran medida la creación de software "portable".&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Más allá de 'POSIX para Wasm'&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pero WASI tiene la intención de ir más allá, incluidas las interfaces para todas las cosas que no son necesariamente recursos de sistema. WASI incluye HTTP como una interfaz de primera clase, una capacidad de red y conexión crítica que no está presente en POSIX, brindando mejores opciones para mantener tracing de lo que un módulo está permitido hacer en lugar de manejarlo como un socket (por supuesto, también puedes hacer eso). También simplifica ciertos aspectos en comparación con POSIX que hacen que WASI Preview 2 sea una interfaz más moderna y portable — tanto para aplicaciones web como de back-end.&lt;/p&gt;

&lt;p&gt;Las implicaciones prácticas de WASI Preview 2 son enormes. Anteriormente, los desarrolladores lucharon por construir aplicaciones Wasm fuera de sistemas especializados (como PaaS que enmascaraban la complejidad). La falta de APIs y herramientas estables hizo difícil la confianza en Wasm como tecnología apta para producción. Preview 2 cambia todo eso, allanando el camino para una adopción más amplia, incluso mayoritaria, de Wasm.&lt;/p&gt;

&lt;p&gt;En resumen, cuando se construyen aplicaciones Wasm, ahora se pueden elegir bibliotecas (o mal llamadas librerías) de cualquier ecosistema o lenguaje, compilarlas como módulos y estructurarlos para hacer una sola aplicación. Los equipos dentro de su organización pueden desarrollar los sistemas de los que son responsables con el stack que prefieran. Luego, a través de componentes y módulos, los desarrolladores y equipos pueden unificarlos en una aplicación monolítica con la confianza de que las piezas encajarán y se comportarán de manera predecible.&lt;/p&gt;

&lt;p&gt;No hay duda de que Wasm siempre ha sido una tecnología con un enorme potencial. Hasta ahora, ese potencial ha sido frenado por brechas en las herramientas, la estabilidad y las características críticas. WASI Preview 2 llena esas brechas agradablemente, allanando el camino para que Wasm realice su promesa de amigabilidad con el desarrollador en entornos de producción. WASI Preview 2 y el modelo de componentes deben impulsar un aumento rápido en la adopción y el despliegue de Wasm. Por encima de todo, es un gran paso adelante que debería entusiasmar a cualquier desarrollador o líder tecnológico sobre el futuro de Wasm y alentarlos a ensuciarse las manos construyendo aplicaciones Wasm.&lt;/p&gt;

&lt;p&gt;Cada gran cambio tecnológico tiene un punto de inflexión que impulsa la adopción. WASI Preview 2 debería ser ese punto de inflexión para Wasm. Hará que desarrollar software sea más fácil, más rápido y más seguro para los desarrolladores en todas partes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Adaptación del original por Oscar Spencer en The New Stack:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MtXKHMCq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.thenewstack.io/media/2024/04/7ae76b9b-merging.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MtXKHMCq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.thenewstack.io/media/2024/04/7ae76b9b-merging.png" alt="WebAssembly listo para producción? WASI Preview 2 lo hace realidad" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
](&lt;a href="https://thenewstack.io/why-wasi-preview-2-makes-webassembly-production-ready/?ref=sredevops.org"&gt;https://thenewstack.io/why-wasi-preview-2-makes-webassembly-production-ready/?ref=sredevops.org&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>español</category>
      <category>opensource</category>
      <category>webassembly</category>
      <category>security</category>
    </item>
  </channel>
</rss>
