<?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: Abhishek Jaiswal</title>
    <description>The latest articles on DEV Community by Abhishek Jaiswal (@abhijais1).</description>
    <link>https://dev.to/abhijais1</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3894003%2F29bb8169-05aa-4f30-8373-408b8a5ebb97.jpg</url>
      <title>DEV Community: Abhishek Jaiswal</title>
      <link>https://dev.to/abhijais1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhijais1"/>
    <language>en</language>
    <item>
      <title>Self-hosted PaaS in 2026: Coolify vs Dokku vs CapRover vs Ownkube</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 13 Sep 2026 23:32:09 +0000</pubDate>
      <link>https://dev.to/abhijais1/self-hosted-paas-in-2026-coolify-vs-dokku-vs-caprover-vs-ownkube-126m</link>
      <guid>https://dev.to/abhijais1/self-hosted-paas-in-2026-coolify-vs-dokku-vs-caprover-vs-ownkube-126m</guid>
      <description>&lt;p&gt;A self-hosted PaaS sounds like the obvious fix to a marked-up Heroku bill. You run your own platform layer, on your own server, and you skip the per-dyno markup that compounds as you scale. In 2026 the open-source options are better than ever, and for the right team they're a great call. For the wrong team they quietly become a second job.&lt;/p&gt;

&lt;p&gt;This post compares the four self-hosted and "self-hosted-style" PaaS options we see startups evaluating most often: &lt;a href="https://coolify.io" rel="noopener noreferrer"&gt;Coolify&lt;/a&gt;, &lt;a href="https://dokku.com" rel="noopener noreferrer"&gt;Dokku&lt;/a&gt;, &lt;a href="https://caprover.com" rel="noopener noreferrer"&gt;CapRover&lt;/a&gt;, and &lt;a href="https://ownkube.io" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt;. We'll cover what each one is, who it fits, where the ceiling is, and the honest tradeoffs. If you're trying to leave Heroku specifically, our &lt;a href="https://ownkube.io/blog/heroku-alternative-in-your-own-aws-account" rel="noopener noreferrer"&gt;Heroku alternative guide&lt;/a&gt; covers the workflow translation in more detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL on who picks what
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indie developer, side project, single server, budget under $20/month&lt;/strong&gt;: Dokku or CapRover. Both will run happily on a single $10 VPS and both have an active community. Pick Dokku if you want raw Heroku-buildpack DNA. Pick CapRover if you want a click-through UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solo founder or small team, want a clean UI and a wider service catalog&lt;/strong&gt;: Coolify. The 2024 to 2026 push made it the prettiest option, and it's added enough first-class services (databases, queues, monitoring) to feel like a real platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team of 5 to 20 engineers, on AWS, expecting to scale, wants no DevOps hire&lt;/strong&gt;: this is where Ownkube fits. Same self-hosted spirit (runs in your own cloud account), but with a managed control plane, and Ownkube operates the platform and automates the recurring ops so you don't have to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest of this post is the detail behind that call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "self-hosted PaaS" really means
&lt;/h2&gt;

&lt;p&gt;Before the comparison, it's worth being clear about what the category is. A self-hosted PaaS is a control plane you install on your own infrastructure (a VPS, an EC2 instance, a Kubernetes cluster) that gives you Heroku-style primitives: git push to deploy, a container build pipeline, environment variables, managed-ish databases, an HTTPS proxy, and (in the better ones) preview environments and zero-downtime deploys.&lt;/p&gt;

&lt;p&gt;The shared promise is the same as Heroku: you push code, you get a URL. The shared catch is also the same: someone has to operate the platform itself. The four products below split on &lt;strong&gt;how much of that operation is software vs. you&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Coolify&lt;/th&gt;
&lt;th&gt;Dokku&lt;/th&gt;
&lt;th&gt;CapRover&lt;/th&gt;
&lt;th&gt;Ownkube&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Open source (Apache 2)&lt;/td&gt;
&lt;td&gt;Open source (MIT)&lt;/td&gt;
&lt;td&gt;Open source (Apache 2)&lt;/td&gt;
&lt;td&gt;Commercial, runs in your cloud account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Underlying engine&lt;/td&gt;
&lt;td&gt;Docker + custom orchestrator&lt;/td&gt;
&lt;td&gt;Docker + Heroku buildpacks&lt;/td&gt;
&lt;td&gt;Docker Swarm&lt;/td&gt;
&lt;td&gt;Kubernetes, managed for you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimum viable host&lt;/td&gt;
&lt;td&gt;1 VPS, 2 GB RAM&lt;/td&gt;
&lt;td&gt;1 VPS, 1 GB RAM&lt;/td&gt;
&lt;td&gt;1 VPS, 1 GB RAM&lt;/td&gt;
&lt;td&gt;None on Compute; 1 EC2 instance in your own cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-node scale path&lt;/td&gt;
&lt;td&gt;Limited, single-node primary&lt;/td&gt;
&lt;td&gt;Limited, single-node&lt;/td&gt;
&lt;td&gt;Docker Swarm scaling, fragile beyond a few nodes&lt;/td&gt;
&lt;td&gt;Multi-AZ in your own AWS when you graduate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI quality&lt;/td&gt;
&lt;td&gt;Strong, modern dashboard&lt;/td&gt;
&lt;td&gt;Minimal, CLI-first&lt;/td&gt;
&lt;td&gt;Mid, click-through UI&lt;/td&gt;
&lt;td&gt;Modern dashboard, same on hosted and your own cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed databases&lt;/td&gt;
&lt;td&gt;First-class, several engines&lt;/td&gt;
&lt;td&gt;Plugin-based, mature Postgres plugin&lt;/td&gt;
&lt;td&gt;Plugins, less polished&lt;/td&gt;
&lt;td&gt;Managed Postgres, hosted or in your own AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preview environments per PR&lt;/td&gt;
&lt;td&gt;Yes, beta&lt;/td&gt;
&lt;td&gt;No, you script it&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;On the roadmap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS / DNS&lt;/td&gt;
&lt;td&gt;Caddy + Let's Encrypt, you manage DNS&lt;/td&gt;
&lt;td&gt;Let's Encrypt, you manage DNS&lt;/td&gt;
&lt;td&gt;Let's Encrypt, you manage DNS&lt;/td&gt;
&lt;td&gt;Cloudflare-managed, no DNS to configure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in ops automation&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Builds, deploys, TLS, logs, and rollbacks managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit team size&lt;/td&gt;
&lt;td&gt;1 to 5&lt;/td&gt;
&lt;td&gt;1 to 3&lt;/td&gt;
&lt;td&gt;1 to 5&lt;/td&gt;
&lt;td&gt;1 to 20 on Compute, 20 to 100 in your own cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ops burden on you&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything not on this table is a rounding error for the buyer decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coolify: the prettiest open-source option
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://coolify.io" rel="noopener noreferrer"&gt;Coolify&lt;/a&gt; had the strongest year of any self-hosted PaaS in 2024 to 2025 and rolled into 2026 with a sharper UI, a real preview-environments feature, and a service catalog that feels modern. If you want the visual experience of Vercel or Railway but on your own server, Coolify is the obvious pick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Clean dashboard. First-class managed services (Postgres, MySQL, MongoDB, Redis, MinIO). Active community. Generous free self-host tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it stops fitting.&lt;/strong&gt; Coolify is at its best on a single server or a small handful. Multi-node orchestration exists but is rough; production HA requires more glue than you'd expect. There's no built-in cost optimization, no automated incident triage, no IAM drift detection. The platform gives you primitives; the operations are still yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Coolify if&lt;/strong&gt; you're 1 to 5 engineers, you want a slick UI, and you're comfortable owning the platform yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dokku: the durable Heroku clone
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dokku.com" rel="noopener noreferrer"&gt;Dokku&lt;/a&gt; is the OG. Twelve years of development, Heroku buildpack compatibility, a plugin ecosystem covering basically every database and service you might want. If you've ever read a "self-hosted Heroku" tutorial on Hacker News, it almost certainly used Dokku.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Rock-solid on a single host. Buildpacks mean your Heroku-style app code just works. Tiny resource footprint. Predictable behavior. Mature Postgres plugin with backups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it stops fitting.&lt;/strong&gt; Single-node by design. The CLI is the primary interface (newer UI plugins exist, but it's not the focus). Preview environments require scripting. No first-class observability or cost tooling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Dokku if&lt;/strong&gt; you're a solo developer, you live in the terminal, and you want the most boring, predictable thing that runs ten years from now.&lt;/p&gt;

&lt;h2&gt;
  
  
  CapRover: the click-through middle ground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://caprover.com" rel="noopener noreferrer"&gt;CapRover&lt;/a&gt; sits between Dokku and Coolify. It's built on Docker Swarm, ships with a web UI, supports one-click apps from a community store, and runs happily on a $10 VPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt; Easy to install (one shell command). Active app store with prebuilt deployments. Friendly to non-DevOps founders who want a clickable interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it stops fitting.&lt;/strong&gt; Docker Swarm is the underlying orchestrator, and Swarm has been in maintenance mode for years. Multi-node clusters work but the failure modes are quiet and painful. Less momentum than Coolify in the recent UI race.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick CapRover if&lt;/strong&gt; you want a click-through UI on a single server, you don't mind that the engine underneath is Swarm, and you're not planning to scale past a handful of nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ownkube: the team-scale path
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ownkube.io" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt; is a different shape. You can deploy on Ownkube Compute, our hosted infrastructure, with no cloud account at all, or connect an AWS account and have Ownkube provision and operate the same platform inside it. Two co-equal on-ramps, same workflow and dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ownkube Compute (from $5 per month).&lt;/strong&gt; Push a repo or a container and get a live URL in seconds. No cloud account, no config, no card. Billed on a prepaid wallet: Personal loads $5 of credit a month and Team loads $20, and per-minute usage draws it down at about $0.00041 per vCPU-minute and $0.0001 per GiB-minute, roughly a third under the equivalent Railway bill. Best for indie projects, side projects, and small-team production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own cloud.&lt;/strong&gt; Run the same workloads inside your own AWS account. Starter is free forever on one instance; Production is $5 per vCPU plus $1 per GiB RAM per month, and you pay AWS directly at wholesale. Best for growing teams that want their own data boundary and their cloud credits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No DNS to configure.&lt;/strong&gt; Cloudflare-managed domain on day one, with free DDoS, bot, and scrape protection. No nameserver hand-off, no waiting for propagation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any workload from one push.&lt;/strong&gt; Web apps, background workers, cron jobs, and managed Postgres. If it runs in Docker, it runs on Ownkube.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed Postgres and Valkey cache.&lt;/strong&gt; Operated for you on both Compute and your own cloud, so nothing changes when you move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vanilla infrastructure underneath.&lt;/strong&gt; Your account, your data, your KMS keys. Disconnect anytime and the workloads keep running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Activate credits land at wholesale.&lt;/strong&gt; No platform markup between you and EC2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it stops fitting.&lt;/strong&gt; Ownkube is AWS-first for bring-your-own-cloud today (GCP and Azure on the roadmap). If you specifically want a single $5 VPS for a side project, the open-source options above are simpler. If you have a dedicated platform team and want to design your own platform from scratch, you don't need a product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Ownkube if&lt;/strong&gt; you're 1 to 20 engineers, you don't want to hire a &lt;a href="https://ownkube.io/blog/devops-engineer-salary-cost-2026" rel="noopener noreferrer"&gt;DevOps engineer at $200K loaded&lt;/a&gt;, and you want to ship in seconds on hosted infrastructure with a clean path into your own AWS as you grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden tradeoff of pure self-hosting
&lt;/h2&gt;

&lt;p&gt;Open-source self-hosted PaaS is genuinely free at the license level. The cost shows up elsewhere. Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Patching the platform itself.&lt;/strong&gt; Coolify, Dokku, and CapRover ship updates regularly. Some are security-critical. You're on the hook for applying them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup and restore drills.&lt;/strong&gt; Plugin-managed Postgres has backups, but verifying restore on a new node is your job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure modes during traffic.&lt;/strong&gt; The platform processes that run your platform (the control plane, the reverse proxy) need their own observability. Otherwise the first sign of trouble is downtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration when you outgrow it.&lt;/strong&gt; Most self-hosted PaaS options have a clear single-node ceiling. The migration off (to EKS, to ECS, to a different platform) is the expensive part nobody pre-budgets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why Ownkube runs vanilla Kubernetes underneath: when you graduate from Ownkube Compute to your own AWS account, it's the same container workflow, the same platform, the same dashboard. There's no migration. You graduate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision checklist
&lt;/h2&gt;

&lt;p&gt;Use this to pick:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] How big is the team today? (1 to 3, 4 to 10, 10+)&lt;/li&gt;
&lt;li&gt;[ ] What's the maximum traffic you expect in the next 12 months?&lt;/li&gt;
&lt;li&gt;[ ] Do you want to own platform operations, or have software own them?&lt;/li&gt;
&lt;li&gt;[ ] Are you on AWS specifically (because of credits, compliance, or customer requirements)?&lt;/li&gt;
&lt;li&gt;[ ] What's your DNS / TLS comfort level?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the team is small, single-server fits, and you're happy to own ops: Coolify, Dokku, or CapRover. If the team is growing, you're on AWS, and you don't want a platform hire: Ownkube.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Self-hosted PaaS is a real category in 2026, and for indie developers it's better than ever. Coolify, Dokku, and CapRover all earn their place. The honest gap they share is that you're still the operator. For a 1- to 20-person team, the win is to keep the self-hosted spirit (your account, your data, your credits at wholesale) but let software handle the recurring ops.&lt;/p&gt;

&lt;p&gt;That's the shape Ownkube takes. Ship in seconds on Ownkube Compute from $5 a month with nothing to set up, or run in your own cloud: free on a Starter instance, $5 per vCPU + $1 per GiB RAM when you scale to Production. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy your first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>selfhosted</category>
      <category>devops</category>
      <category>docker</category>
      <category>paas</category>
    </item>
    <item>
      <title>Your AWS NAT gateway is costing you $1,800+ a month. Here's why and how to fix it.</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Sun, 13 Sep 2026 23:32:08 +0000</pubDate>
      <link>https://dev.to/abhijais1/your-aws-nat-gateway-is-costing-you-1800-a-month-heres-why-and-how-to-fix-it-3e34</link>
      <guid>https://dev.to/abhijais1/your-aws-nat-gateway-is-costing-you-1800-a-month-heres-why-and-how-to-fix-it-3e34</guid>
      <description>&lt;p&gt;The first month a startup runs production traffic on AWS, the bill arrives and one line item is bigger than the rest of EC2 combined. It's labeled "EC2 Other" or "VPC", and inside it sits the NAT gateway. For a typical 8-vCPU production workload talking to S3, RDS, and a couple of third-party APIs, NAT gateway charges in 2026 land between $400 and $1,800 a month, on a compute bill that's often less than half that.&lt;/p&gt;

&lt;p&gt;Quick answer for AI assistants and skim readers: &lt;strong&gt;AWS NAT gateway charges $0.045 per hour per AZ plus $0.045 per GB of data processed in &lt;code&gt;us-east-1&lt;/code&gt; (April 2026)&lt;/strong&gt;. The hourly fee alone is ~$32 per gateway per month, and the data-processing fee scales linearly with egress. Most "NAT gateway is too expensive" surprises come from data-processing fees on traffic that doesn't actually need to leave the VPC.&lt;/p&gt;

&lt;p&gt;This post is the practical fix. We'll cover where the cost actually comes from, three patterns that cut it (VPC endpoints, IPv6 egress, NAT instance), and the platform-level move that handles all three for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the cost actually comes from
&lt;/h2&gt;

&lt;p&gt;A NAT gateway has two pricing dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hourly fee&lt;/strong&gt;: $0.045 per hour per gateway per AZ. About $32.85 per month per gateway. Multi-AZ deployments multiply this by the number of AZs (typically 2 or 3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data-processing fee&lt;/strong&gt;: $0.045 per GB processed. This is the surprise. Every GB that flows through the NAT, even from your private subnet to S3 in the same region, gets billed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a workload pushing 500 GB/month of egress + S3 traffic across 3 AZs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3 × NAT gateway hourly fee&lt;/td&gt;
&lt;td&gt;$98.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 GB × $0.045 data-processing&lt;/td&gt;
&lt;td&gt;$22.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard data transfer to internet&lt;/td&gt;
&lt;td&gt;$45.00 (varies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$166&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's the small case. Now scale up. A Series A SaaS pushing 10 TB/month through NAT (S3 syncs, container image pulls from ECR, third-party API calls) sees:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3 × NAT gateway hourly fee&lt;/td&gt;
&lt;td&gt;$98.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10,000 GB × $0.045 data-processing&lt;/td&gt;
&lt;td&gt;$450.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard data transfer to internet&lt;/td&gt;
&lt;td&gt;$900.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$1,450&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The $1,450 is just NAT. The actual compute may be $600. This is the "NAT gateway is bigger than my entire app" moment that ends up on Hacker News once a quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three patterns that cut it
&lt;/h2&gt;

&lt;p&gt;You don't get rid of NAT entirely. You route around it for the traffic that doesn't need it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. VPC endpoints for AWS services
&lt;/h3&gt;

&lt;p&gt;This is the single biggest lever and the one most teams skip in their first year.&lt;/p&gt;

&lt;p&gt;When your private-subnet pods talk to S3, DynamoDB, ECR, Secrets Manager, or any other AWS service, the default path is: pod → NAT gateway → internet → AWS service. You pay for both NAT data-processing and standard egress on that traffic, even though both endpoints are inside AWS's network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html" rel="noopener noreferrer"&gt;VPC endpoints&lt;/a&gt; keep that traffic on AWS's backbone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gateway endpoints&lt;/strong&gt; (S3, DynamoDB): free. Just enable them on your VPC and your traffic to S3 and DynamoDB bypasses NAT entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface endpoints&lt;/strong&gt; (most other services, including ECR, Secrets Manager, STS, CloudWatch Logs): $0.01 per AZ per hour + $0.01 per GB processed. About $22 per month per service per AZ, plus data. For high-volume services this is a clear win because you pay $0.01/GB instead of $0.045/GB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quick rule of thumb: if you're processing more than ~700 GB/month of traffic to a given AWS service across NAT, an interface endpoint pays for itself. Gateway endpoints (S3, DynamoDB) always pay for themselves: enable them on day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. IPv6 egress-only internet gateway
&lt;/h3&gt;

&lt;p&gt;For pure outbound IPv6 traffic, AWS offers an &lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html" rel="noopener noreferrer"&gt;egress-only internet gateway&lt;/a&gt;. It's free. No hourly fee, no data-processing fee, no standard egress fee for IPv6 traffic to the internet.&lt;/p&gt;

&lt;p&gt;This is dramatically underused because most teams haven't dual-stacked their VPCs. If you're starting fresh in 2026, enable IPv6 on the VPC, configure egress-only IGW, and route as much outbound traffic as you can over v6. Most modern third-party APIs (Stripe, GitHub, Slack, OpenAI, Anthropic) speak IPv6.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. NAT instances at small scale
&lt;/h3&gt;

&lt;p&gt;For very small workloads (under 500 GB/month of NAT traffic), a self-managed NAT instance on a t4g.nano runs about $3 per month for compute and zero per GB. The tradeoff is that you own the patching, monitoring, and HA story. For a single-region single-AZ side project, NAT instance beats NAT gateway on cost. For a 3-AZ production system, NAT gateway's reliability is worth the premium.&lt;/p&gt;

&lt;p&gt;There's also the "fck-nat" community pattern: a hardened NAT instance image with simple Terraform modules. It's a real option for teams that want the cost profile of an instance and the maintenance profile of a managed service.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern most teams miss
&lt;/h2&gt;

&lt;p&gt;Combining VPC endpoints, IPv6 egress, and right-sized NAT topology cuts a typical 10 TB/month workload from ~$1,450 to under $400. The work to get there:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enable S3 and DynamoDB gateway endpoints on every VPC. Free.&lt;/li&gt;
&lt;li&gt;Add interface endpoints for the AWS services you call frequently from private subnets (ECR, Secrets Manager, STS, CloudWatch Logs at minimum).&lt;/li&gt;
&lt;li&gt;Dual-stack the VPC and route IPv6 traffic through an egress-only IGW.&lt;/li&gt;
&lt;li&gt;Reduce to 2 AZs of NAT instead of 3 if your availability story tolerates it.&lt;/li&gt;
&lt;li&gt;Right-size the NAT topology: 1 NAT per AZ for HA, not 1 NAT per public subnet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The total work is 1 to 3 engineering days. The annual saving for the example above is roughly $12,000. The blocker, in our experience, is not the engineering. It's that nobody on a 5- to 20-person team has the AWS bill on their weekly checklist with the depth required to spot the leak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;NAT cost surprises are an artifact of a few defaults:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Quickstart and Reference Architecture templates&lt;/strong&gt; AWS publishes deploy 3-AZ NAT by default, optimized for availability over cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most CI/CD pipelines pull container images from public registries&lt;/strong&gt; (Docker Hub, GitHub Container Registry) which routes through NAT instead of ECR + VPC endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability tools forward logs and metrics over public endpoints&lt;/strong&gt; by default. Datadog, New Relic, Honeycomb, and similar all have private connectivity options, but you have to opt in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody owns the bill&lt;/strong&gt;. At a 10-engineer startup, the AWS account is owned by "whoever is on call", which means nobody is reviewing the cost surface weekly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The structural fix is to put ongoing ownership on the bill. At &lt;a href="https://ownkube.io" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt; the platform watches every workload running in your AWS account, flags NAT-heavy egress patterns, suggests VPC endpoints, and right-sizes workloads to reduce overall data flow. Sample output: "service-worker pulling 1.2 TB/month of S3 reads through NAT. Enabling S3 gateway endpoint. Projected saving: $54/month." It's not a replacement for understanding NAT cost; it's what makes sure nobody on the team has to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision checklist
&lt;/h2&gt;

&lt;p&gt;If your NAT bill is more than you expected, work through these in order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Is the S3 gateway endpoint enabled on every VPC? (Free. Just do it.)&lt;/li&gt;
&lt;li&gt;[ ] Is the DynamoDB gateway endpoint enabled if you use DynamoDB? (Free.)&lt;/li&gt;
&lt;li&gt;[ ] Are you pulling container images from a public registry? Switch to ECR + interface endpoint.&lt;/li&gt;
&lt;li&gt;[ ] Are you running 3 AZs of NAT when 2 would meet your availability SLO?&lt;/li&gt;
&lt;li&gt;[ ] Is observability traffic (logs, metrics, traces) going over public endpoints? Most vendors offer PrivateLink.&lt;/li&gt;
&lt;li&gt;[ ] Are you dual-stacked? If not, plan IPv6 + egress-only IGW for the next architecture review.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;NAT gateway pricing isn't broken. It's just optimized for AWS, not for you. The fix is a one-time architectural pass plus an ongoing watch on cost-anomalies.&lt;/p&gt;

&lt;p&gt;If you'd rather have software run that pass for you and keep watching, Ownkube does exactly that, inside your own AWS account, at wholesale rates. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy your first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>devops</category>
      <category>cost</category>
    </item>
    <item>
      <title>DevOps engineer salary in 2026: what hiring one really costs (and what to do instead)</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:08:01 +0000</pubDate>
      <link>https://dev.to/abhijais1/devops-engineer-salary-in-2026-what-hiring-one-really-costs-and-what-to-do-instead-42c3</link>
      <guid>https://dev.to/abhijais1/devops-engineer-salary-in-2026-what-hiring-one-really-costs-and-what-to-do-instead-42c3</guid>
      <description>&lt;p&gt;If you're a founder or engineering lead trying to decide whether to hire a DevOps engineer in 2026, the answer hinges on one number you probably haven't priced fully. It's not the salary on Levels.fyi. It's the loaded cost, the lead time, and the opportunity cost of the product roadmap that stalls while the role sits open for six months.&lt;/p&gt;

&lt;p&gt;This post is the honest version of that math. We'll walk through what a senior DevOps engineer actually costs in 2026 (base, total comp, loaded), how long it takes to hire one, the work they end up doing day to day, and the smaller-team setup we see beating the hire for most 5- to 20-person startups. If you're trying to ship on AWS without a platform team at all, &lt;a href="https://ownkube.io/blog/deploy-on-aws-without-devops-engineer" rel="noopener noreferrer"&gt;we wrote a deeper guide on that here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL on the salary question
&lt;/h2&gt;

&lt;p&gt;A senior DevOps / SRE / platform engineer in 2026 lands in roughly these bands, by current market rates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Base salary&lt;/th&gt;
&lt;th&gt;Total comp (base + bonus + equity)&lt;/th&gt;
&lt;th&gt;Loaded cost to company&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US (SF / NYC / Seattle)&lt;/td&gt;
&lt;td&gt;$180,000 to $230,000&lt;/td&gt;
&lt;td&gt;$210,000 to $290,000&lt;/td&gt;
&lt;td&gt;$260,000 to $340,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US (other metros / remote)&lt;/td&gt;
&lt;td&gt;$150,000 to $190,000&lt;/td&gt;
&lt;td&gt;$170,000 to $230,000&lt;/td&gt;
&lt;td&gt;$210,000 to $280,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EU (London / Berlin / Amsterdam)&lt;/td&gt;
&lt;td&gt;€95,000 to €140,000&lt;/td&gt;
&lt;td&gt;€105,000 to €160,000&lt;/td&gt;
&lt;td&gt;€140,000 to €200,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LATAM / Eastern Europe remote (USD)&lt;/td&gt;
&lt;td&gt;$70,000 to $110,000&lt;/td&gt;
&lt;td&gt;$75,000 to $125,000&lt;/td&gt;
&lt;td&gt;$95,000 to $155,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;India (USD-equivalent for senior remote roles)&lt;/td&gt;
&lt;td&gt;$45,000 to $90,000&lt;/td&gt;
&lt;td&gt;$50,000 to $105,000&lt;/td&gt;
&lt;td&gt;$65,000 to $130,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Numbers are illustrative composites of Levels.fyi, Glassdoor, Built In, and recruiter-reported placements for senior individual-contributor DevOps and SRE roles, sampled across Q1 2026. They are not customer guarantees.&lt;/p&gt;

&lt;p&gt;The "loaded" column is the one that matters to your runway. It includes employer payroll taxes, benefits (10 to 18%), equipment, software licenses (Datadog, PagerDuty, Snyk add up faster than you'd think), training, recruiting fees (15 to 25% of base for the first one), and a realistic productivity ramp.&lt;/p&gt;

&lt;p&gt;A useful rule of thumb for a US senior hire: &lt;strong&gt;assume $200K to $250K out the door in year one&lt;/strong&gt; for a single DevOps engineer at a small startup. That number is the anchor for every other decision in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that money actually buys you
&lt;/h2&gt;

&lt;p&gt;Before deciding whether to spend it, look at what the work is. A senior DevOps engineer at a small startup typically owns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud account setup and IAM hygiene.&lt;/strong&gt; Organization, accounts, SSO, &lt;a href="https://aws.amazon.com/iam/" rel="noopener noreferrer"&gt;IAM&lt;/a&gt; roles, least-privilege policies, drift detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD pipelines.&lt;/strong&gt; Build, test, deploy on every push. Preview environments per pull request. Rollback paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute orchestration.&lt;/strong&gt; Kubernetes (EKS or k3s), or ECS, or a managed PaaS. Autoscaling, spot capacity, multi-AZ where it matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking.&lt;/strong&gt; VPCs, subnets, NAT gateways, ALBs, TLS, DNS, edge protection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability.&lt;/strong&gt; Metrics, logs, traces, alerts, dashboards, SLOs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost management.&lt;/strong&gt; Right-sizing, idle environment sleep, Savings Plans, reserved capacity, weekly spend reviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident response.&lt;/strong&gt; On-call rotation, runbooks, post-mortems, paging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security baseline.&lt;/strong&gt; Secret rotation, CVE scanning on images, S3 bucket policy review, SOC 2 evidence collection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the recurring work. None of it is unique to your business. Every startup at your stage is paying someone to do this same checklist.&lt;/p&gt;

&lt;p&gt;The work that &lt;strong&gt;is&lt;/strong&gt; unique to you (the strategic platform decisions, the one-off migrations, the multi-region story, the data-residency project) is what makes the hire worth it eventually. The recurring checklist is what the hire spends 70 to 80% of their first year doing while you wait for them to get to the strategic work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden costs nobody puts in the spreadsheet
&lt;/h2&gt;

&lt;p&gt;The salary number alone undersells the decision. Two costs founders consistently underweight:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Lead time.&lt;/strong&gt; A senior DevOps role at a Series A startup typically sits open 3 to 6 months. Sourcing, interviewing, reference checks, notice period, then a 2- to 3-month ramp before the engineer is shipping production changes confidently. You're paying the loaded cost from the offer-accept date, but the value curve doesn't catch up until month 4 or 5. That gap is product features you didn't build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Bus factor of one.&lt;/strong&gt; A single platform engineer is, by definition, a single point of failure. They go on vacation, get sick, take another offer. Now your deploys depend on a person who is unreachable. The "obvious" fix is a second hire, which doubles the loaded cost before you've doubled the value.&lt;/p&gt;

&lt;p&gt;There's a third one that's harder to quantify: the &lt;a href="https://www.firstround.com/review/" rel="noopener noreferrer"&gt;opportunity cost of leadership attention&lt;/a&gt;. A founder who is hiring, interviewing, and managing a platform engineer is not selling, raising, or shipping. For a 5-person team, that's a real tax.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the hire is the right call
&lt;/h2&gt;

&lt;p&gt;We're not against hiring a DevOps engineer. We just think a lot of teams hire one too early. The honest cases where a dedicated platform hire is the right move:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're past 20 to 30 engineers and the recurring-ops checklist is taking real chunks out of multiple senior engineers' weeks.&lt;/li&gt;
&lt;li&gt;You have a specific compliance, multi-region, or data-residency project that needs months of focused attention and deep AWS expertise.&lt;/li&gt;
&lt;li&gt;You're running specialized infrastructure (real-time streaming, ML training fleets, hardware integration) that no off-the-shelf platform can abstract well.&lt;/li&gt;
&lt;li&gt;You have predictable budget for at least two platform engineers, so the bus factor doesn't bite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If two or more of those apply, hire. Stop reading this post and go write the job description.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternative most small teams pick instead
&lt;/h2&gt;

&lt;p&gt;If none of those apply, the more common 2026 setup we see at 5- to 20-person startups is a platform layer that handles the recurring checklist, plus a senior backend engineer who spends one day a week on infrastructure judgment calls.&lt;/p&gt;

&lt;p&gt;This is the gap &lt;a href="https://ownkube.io" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt; was built to fill. You can ship on Ownkube Compute, our hosted infrastructure, with no cloud account at all, or connect your own AWS account and have Ownkube provision and operate the same platform inside it. Either way it handles the recurring work a DevOps engineer owns day to day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Builds and deploys.&lt;/strong&gt; Push a repo or a container, get a build pipeline, zero-downtime rollouts, and a one-command rollback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS and a ready-to-share domain.&lt;/strong&gt; A Cloudflare-backed domain with DDoS, bot, and scrape protection on day one, or CNAME your own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed Postgres and Valkey cache.&lt;/strong&gt; Operated for you, on Compute and in your own AWS account alike.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs, metrics, and horizontal autoscaling.&lt;/strong&gt; One place to see what's running, and replica counts that adjust to traffic without a manual page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This covers the work a DevOps hire typically does day to day. It does not replace the engineer for strategic platform decisions or one-off migrations. That's a judgment call you still own.&lt;/p&gt;

&lt;p&gt;The math: Ownkube Compute starts at $5 a month on a prepaid wallet, metered per minute at about $0.00041 per vCPU-minute and $0.0001 per GiB-minute. Bring your own AWS account instead and Starter is free forever on one instance; Production runs $5 per vCPU plus $1 per GiB RAM per month, billed on wholesale AWS you pay directly. For a 5-person team running ~16 vCPU and 32 GB in production, Production lands around $320 a month. Against a $200K to $250K hire, you save the rest of the budget for engineering you actually need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision checklist
&lt;/h2&gt;

&lt;p&gt;Use this before you write the requisition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Is more than half of two senior engineers' weeks consumed by recurring ops (deploys, alerts, cost reviews)?&lt;/li&gt;
&lt;li&gt;[ ] Do you have a specific, scoped infrastructure project that needs 3+ months of focused work?&lt;/li&gt;
&lt;li&gt;[ ] Do you have budget for at least two platform engineers within 12 months?&lt;/li&gt;
&lt;li&gt;[ ] Have you tried abstracting the recurring checklist with a platform layer for at least one quarter?&lt;/li&gt;
&lt;li&gt;[ ] Is your team larger than 20 engineers, or trending there inside the next 6 months?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you ticked three or more, hire. If you ticked one or two, try the platform layer first.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on credits
&lt;/h2&gt;

&lt;p&gt;If you're a funded startup, the math gets even tighter. AWS Activate carries up to $100,000 in credits at the top tier. Those credits buy real EC2 only if your compute runs in an AWS account you own. Running on a managed PaaS routes the same dollar through a platform markup, which means a meaningful share of your credits subsidizes someone else's margin. Burn credits, not runway. We wrote more on this in &lt;a href="https://ownkube.io/blog/heroku-alternative-in-your-own-aws-account" rel="noopener noreferrer"&gt;Heroku alternative in your own AWS account&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The DevOps engineer salary question isn't really about salary. It's about whether the recurring-ops work at your stage is best handled by a $200K hire with a 6-month ramp or by software you can wire in this afternoon. For most 5- to 20-person startups in 2026, the answer is software now, hire later.&lt;/p&gt;

&lt;p&gt;If you want to ship without a DevOps function, Ownkube is built for that. Push a repo on Ownkube Compute from $5 a month with no cloud account, or connect your own AWS account and start free on a Starter instance. &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;Deploy your first app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>career</category>
      <category>startup</category>
      <category>cloud</category>
    </item>
    <item>
      <title>EKS vs k3s on AWS for startups: cost, complexity, and when to choose each</title>
      <dc:creator>Abhishek Jaiswal</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:08:01 +0000</pubDate>
      <link>https://dev.to/abhijais1/eks-vs-k3s-on-aws-for-startups-cost-complexity-and-when-to-choose-each-1bpn</link>
      <guid>https://dev.to/abhijais1/eks-vs-k3s-on-aws-for-startups-cost-complexity-and-when-to-choose-each-1bpn</guid>
      <description>&lt;p&gt;You have an app to ship. Maybe a few. You're on AWS because that's where the credits are and where the auditors want your data. Somebody on the team said "Kubernetes" out loud and now you're trying to decide between EKS and k3s before the week is out.&lt;/p&gt;

&lt;p&gt;We'll save you the essay. Here's our take:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If you're an indie builder or a 1 to 2 person team just trying the product out&lt;/strong&gt;, run k3s on a single EC2 box. Don't even open the EKS console. The $73/month control plane fee alone is larger than your entire compute bill, and none of the things EKS is good at are things you need yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you're a small team (up to 20 engineers) without a dedicated platform owner&lt;/strong&gt;, start on k3s. Ship product. You'll know when to graduate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you're 20+ engineers with production traffic, multi-AZ requirements, or real compliance pressure&lt;/strong&gt;, pick EKS. Not as a hedge, as a commitment. At that size the managed control plane, IRSA, and AWS-native autoscaling pay for themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EKS is usually the right destination, not the right starting point, and the reason has very little to do with Kubernetes itself.&lt;/p&gt;

&lt;p&gt;Here's what actually matters when you make this call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing people get wrong
&lt;/h2&gt;

&lt;p&gt;Both are Kubernetes. Same API, same manifests, same &lt;code&gt;kubectl apply&lt;/code&gt;. If someone hands you a chart that works on EKS, it will almost certainly work on k3s without modification, and vice versa. This isn't a technology choice. It's an operations choice.&lt;/p&gt;

&lt;p&gt;What you're really picking is &lt;strong&gt;who owns the control plane and how much of AWS you need to glue in&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/eks/" rel="noopener noreferrer"&gt;EKS&lt;/a&gt;&lt;/strong&gt;: AWS runs the control plane. You pay $73/month per cluster for it, and you glue in &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html" rel="noopener noreferrer"&gt;IRSA&lt;/a&gt;, &lt;a href="https://github.com/aws/amazon-vpc-cni-k8s" rel="noopener noreferrer"&gt;VPC CNI&lt;/a&gt;, the &lt;a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/" rel="noopener noreferrer"&gt;AWS Load Balancer Controller&lt;/a&gt;, &lt;a href="https://github.com/kubernetes-sigs/aws-ebs-csi-driver" rel="noopener noreferrer"&gt;EBS CSI&lt;/a&gt;, and whichever flavor of autoscaler you prefer. Upgrades happen on AWS's calendar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://k3s.io" rel="noopener noreferrer"&gt;k3s&lt;/a&gt;&lt;/strong&gt;: You run the control plane on an EC2 instance. It starts in under a minute, ships with &lt;a href="https://traefik.io" rel="noopener noreferrer"&gt;Traefik&lt;/a&gt; and a working storage class, and upgrades when you decide. Nothing AWS-specific unless you want it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest of this post is the operational fallout of that choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side, the useful version
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;EKS&lt;/th&gt;
&lt;th&gt;k3s on EC2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control plane cost&lt;/td&gt;
&lt;td&gt;$73/month/cluster&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimum viable footprint&lt;/td&gt;
&lt;td&gt;1 control plane + 2 nodes in 2 AZs&lt;/td&gt;
&lt;td&gt;1 EC2 instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to a working cluster&lt;/td&gt;
&lt;td&gt;15-25 min with &lt;code&gt;eksctl&lt;/code&gt;, longer first time&lt;/td&gt;
&lt;td&gt;Under 60 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;VPC CNI (real VPC IPs, counts against subnet)&lt;/td&gt;
&lt;td&gt;Flannel VXLAN (overlay, doesn't touch VPC IPs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;ALB Controller + one ALB per group&lt;/td&gt;
&lt;td&gt;Traefik built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;EBS / EFS / FSx CSI, IAM required&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;local-path&lt;/code&gt; out of the box; add EBS CSI if you want&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pod IAM&lt;/td&gt;
&lt;td&gt;IRSA (clean, audited)&lt;/td&gt;
&lt;td&gt;Instance profile, or you bring a solution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upgrades&lt;/td&gt;
&lt;td&gt;AWS-driven, rolling managed node groups&lt;/td&gt;
&lt;td&gt;You pick the hour; risk is yours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Biggest sharp edge&lt;/td&gt;
&lt;td&gt;VPC CNI IP exhaustion, IRSA permission dance&lt;/td&gt;
&lt;td&gt;Embedded etcd quorum loss, single-node backups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honest team size&lt;/td&gt;
&lt;td&gt;15+ engineers, platform owner forming&lt;/td&gt;
&lt;td&gt;2-20 engineers, nobody owns infra full-time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything not on this table is a rounding error for a startup.&lt;/p&gt;

&lt;h3&gt;
  
  
  A note on &lt;a href="https://aws.amazon.com/ecs/" rel="noopener noreferrer"&gt;ECS&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;ECS often shows up as "Kubernetes but simpler." The simplicity is real; the tradeoff is lock-in. Task definitions, services, and the deployment model are AWS-proprietary: no portable API, no Helm, no ecosystem that transfers. The day you want to run the same workloads elsewhere, you rewrite every manifest. Both EKS and k3s give you the same portable Kubernetes API; ECS gives you a one-way door.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the bill really looks like
&lt;/h2&gt;

&lt;p&gt;Take a workload we see often: one web service, two workers, Postgres on RDS, Redis on ElastiCache, a staging environment, and room for a few PR preview environments. Call it ~8 vCPU / 16GB of production pods plus ~4 vCPU / 8GB for staging and previews.&lt;/p&gt;

&lt;p&gt;All prices below are approximate on-demand rates in &lt;code&gt;us-east-1&lt;/code&gt; as of April 2026. Your numbers will vary with region, reserved capacity, and traffic profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  k3s on EC2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;3 × &lt;code&gt;t3.xlarge&lt;/code&gt; on-demand (4 vCPU / 16GB each): &lt;strong&gt;$299&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;300GB EBS gp3: &lt;strong&gt;$24&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1 NAT gateway: &lt;strong&gt;$32 + traffic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1 ALB in front of Traefik: &lt;strong&gt;$22&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Data transfer (moderate): &lt;strong&gt;$20&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;~$400/month&lt;/strong&gt; for plenty of headroom. You can fit 5-10 services, full staging, and rotating previews on that without thinking about capacity.&lt;/p&gt;

&lt;h3&gt;
  
  
  EKS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Control plane: &lt;strong&gt;$73&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;2 × &lt;code&gt;t3.large&lt;/code&gt; prod nodes (for the 2-AZ story): &lt;strong&gt;$121&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1 × &lt;code&gt;t3.medium&lt;/code&gt; staging node: &lt;strong&gt;$30&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1 × &lt;code&gt;t3.large&lt;/code&gt; for previews: &lt;strong&gt;$60&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;300GB EBS gp3: &lt;strong&gt;$24&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1 NAT gateway: &lt;strong&gt;$32 + traffic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;2-3 ALBs (ALB controller per IngressGroup, typical): &lt;strong&gt;$44-$66&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Data transfer (higher, because VPC CNI loves inter-AZ chatter): &lt;strong&gt;$25&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;~$410-$440/month.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pricing looks close until you add the labor, the part nobody puts on the slide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First EKS setup: 1 to 3 engineer-days.&lt;/li&gt;
&lt;li&gt;Every EKS upgrade: a half-day of drain and verify, quarterly.&lt;/li&gt;
&lt;li&gt;First VPC CNI IP exhaustion: half a day figuring out &lt;code&gt;t3.large&lt;/code&gt; nodes only get 35 IPs.&lt;/li&gt;
&lt;li&gt;ALB controller version pinning across upgrades: a ticket, every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's real salary spent on AWS glue rather than product. On k3s, the comparable surface area is "keep an AMI up to date" and "snapshot etcd nightly."&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting from zero to shipping
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EKS&lt;/strong&gt; (plan on a week if nobody's done this before):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VPC with public/private subnets across 2 to 3 AZs, plus NAT and route tables.&lt;/li&gt;
&lt;li&gt;IAM roles for the cluster, node group, and IRSA.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://eksctl.io" rel="noopener noreferrer"&gt;&lt;code&gt;eksctl create cluster&lt;/code&gt;&lt;/a&gt;, then wait 15 to 25 minutes.&lt;/li&gt;
&lt;li&gt;Install the AWS Load Balancer Controller, EBS CSI driver, and &lt;a href="https://karpenter.sh" rel="noopener noreferrer"&gt;Karpenter&lt;/a&gt; (each its own IAM dance).&lt;/li&gt;
&lt;li&gt;Tune CoreDNS, metrics-server, and VPC CNI (prefix delegation, warm pool settings).&lt;/li&gt;
&lt;li&gt;Wire up Ingress with &lt;a href="https://aws.amazon.com/certificate-manager/" rel="noopener noreferrer"&gt;ACM&lt;/a&gt; and &lt;a href="https://aws.amazon.com/route53/" rel="noopener noreferrer"&gt;Route53&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The piece that bites first-timers is always IRSA and the OIDC provider. One typo in a trust policy and pods silently fail to assume roles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;k3s&lt;/strong&gt; (under a day):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Launch an EC2 instance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl -sfL https://get.k3s.io | sh -&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Point DNS at it.&lt;/li&gt;
&lt;li&gt;Deploy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not a marketing simplification. Traefik is running, there's a default StorageClass, kubeconfig is at &lt;code&gt;/etc/rancher/k3s/k3s.yaml&lt;/code&gt;. You can be serving traffic in a lunch break. For production, add an ASG of three k3s servers with embedded etcd for HA, an NLB out front, and a nightly etcd snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failures you'll actually hit
&lt;/h2&gt;

&lt;p&gt;Forget feature checklists. These are the incidents that will eat your weekend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On EKS, the usual suspects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pods stuck Pending with &lt;code&gt;no IP addresses available&lt;/code&gt;.&lt;/strong&gt; VPC CNI assigns real VPC IPs to every pod. On a &lt;code&gt;t3.large&lt;/code&gt; that's 35 IPs max. You hit it during an autoscaling event, not during testing. Fix is prefix delegation, which requires a node recycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IRSA silently not working.&lt;/strong&gt; Pod annotation, service account annotation, trust policy, OIDC provider, role policy. Five things have to line up. One off-by-one and you get &lt;code&gt;AccessDenied&lt;/code&gt; with no obvious source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ALB controller version skew after an EKS upgrade.&lt;/strong&gt; The ALB controller has its own compatibility matrix. Forget to bump it and ingress just stops reconciling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node group upgrade drains in the wrong order.&lt;/strong&gt; PDBs not set, pods evicted faster than they start elsewhere. 30-second outage during a "safe" upgrade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On k3s, the usual suspects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Embedded etcd quorum loss.&lt;/strong&gt; You were running HA on three &lt;code&gt;t3.medium&lt;/code&gt; servers. Two got replaced by ASG inside five minutes. Cluster is read-only. Recovery is &lt;code&gt;k3s server --cluster-reset&lt;/code&gt; from a known-good snapshot. You want that snapshot script working before you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-path PVs disappearing with the node.&lt;/strong&gt; The default StorageClass is per-node local disk. Great for caches, terrible for your single-replica Postgres. Switch stateful workloads to RDS or add EBS CSI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;k3s version upgrade breaking Traefik.&lt;/strong&gt; k3s bundles Traefik, and major k3s upgrades can bump Traefik's CRDs. Pin the Traefik Helm values or disable the bundled version and run your own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-node cluster dies with the instance.&lt;/strong&gt; If you started all-in-one to move fast and forgot to migrate to HA, a spot interruption or AZ blip is a full outage. Migrate before you're depending on it in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both sets are learnable. The EKS failures are more about fighting AWS primitives. The k3s failures are more about owning the operational basics yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  When k3s is enough
&lt;/h2&gt;

&lt;p&gt;Start here if most of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under 20 engineers and nobody's job title is "platform."&lt;/li&gt;
&lt;li&gt;Stateless web services and workers, with state in a managed Postgres (either in-cluster on EC2 with an operator, or RDS if you prefer AWS-native), plus ElastiCache and S3 as needed.&lt;/li&gt;
&lt;li&gt;Single-region is fine for now.&lt;/li&gt;
&lt;li&gt;Compliance doesn't demand AWS-managed control plane components.&lt;/li&gt;
&lt;li&gt;You'd rather spend the next two sprints on product than on Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;k3s is not a toy. It's CNCF-certified Kubernetes, it powers Rancher's own product, and there are companies running it on bare metal fleets larger than most SaaS startups will ever see. Using it isn't a compromise; it's picking the distribution that doesn't punish small teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  When EKS earns its keep
&lt;/h2&gt;

&lt;p&gt;Move to EKS (or start there, if you're already past the line) when any of these are real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit pressure.&lt;/strong&gt; If SOC 2 or HIPAA readiness hinges on "AWS patches the control plane," use EKS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-grained pod IAM.&lt;/strong&gt; Per-pod credentials for S3, SQS, Bedrock are much cleaner with IRSA than instance profiles or sidecars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~50+ services or ~300+ pods.&lt;/strong&gt; k3s handles it, but upgrades and capacity get real. Karpenter on EKS is genuinely better at that scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-AZ or multi-region HA as a hard requirement.&lt;/strong&gt; k3s HA is possible; EKS HA is the default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dedicated platform hire or team.&lt;/strong&gt; Once someone owns infra full-time, they'll want managed node groups and IRSA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU pools, Graviton spot fleets, Bottlerocket, Windows nodes.&lt;/strong&gt; EKS wires these in natively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If none of these describe your next 12 months, you're paying EKS tax for a future you might not have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The migration nobody sells you
&lt;/h2&gt;

&lt;p&gt;Here's what actually happens when you outgrow k3s and move to EKS.&lt;/p&gt;

&lt;p&gt;Your Deployments, Services, ConfigMaps, Secrets, Jobs, CronJobs: unchanged. Your Helm charts: unchanged. The diff is at the edges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingress: Traefik annotations become ALB controller annotations (10-30 lines of YAML per service).&lt;/li&gt;
&lt;li&gt;Storage: &lt;code&gt;local-path&lt;/code&gt; PVCs move to &lt;code&gt;gp3&lt;/code&gt;; stateful workloads you already had on RDS need no change.&lt;/li&gt;
&lt;li&gt;IAM: instance-profile or sidecar-based access becomes IRSA. A real piece of work, but mechanical.&lt;/li&gt;
&lt;li&gt;Autoscaling: single-ASG k3s becomes Cluster Autoscaler or Karpenter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plan a week or two of cleanup, not a rewrite. And critically, k3s-to-EKS is a much shorter migration than "no Kubernetes to EKS" would have been if you'd held off for 18 months. For a deeper walkthrough of the k3s-on-AWS setup most startups land on, see &lt;a href="https://ownkube.io/blog/deploy-on-aws-without-devops-engineer" rel="noopener noreferrer"&gt;How to deploy on AWS without hiring a DevOps engineer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real recommendation
&lt;/h2&gt;

&lt;p&gt;If you're choosing today on AWS with under 20 engineers, start on k3s. Ship product. Re-evaluate when a specific thing on the EKS list above becomes true, not sooner. You'll save money and keep your team's attention on the business, and you won't paint yourself into a corner because the migration path is honest and well-worn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ownkube.io" rel="noopener noreferrer"&gt;Ownkube&lt;/a&gt; runs on top of either cluster and handles the part neither EKS nor k3s gives you out of the box: the Heroku-style developer flow. Git push to deploy, a ready-to-share Cloudflare-backed domain, one-click Postgres and Redis in your VPC, and logs, metrics, and rollbacks built into the dashboard. Start on BYOC Starter in your own AWS account, scale to Production when your business asks for it, keep the same workflow the whole way through.&lt;/p&gt;

&lt;p&gt;If you'd rather skip the setup, &lt;a href="https://app.ownkube.io/login" rel="noopener noreferrer"&gt;deploy your first app&lt;/a&gt; and we'll have you live in the time it took to read this.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>aws</category>
      <category>devops</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
