You shouldn't use Kubernetes as a startup
&gt; <i>If you add Kubernetes to this setup you will need to make your machines double the size just the extra side-cars that you need make things functional add 3 machines to be the control plane of Kubernetes, add 3 more machines for etcd cluster, add multiple internal services like ingress controllers and log and metrics collection.</i><p>No, you really don&#x27;t. I run multiple 3-node (i.e., the bare minimum to survive an AZ loss) clusters, and they are just fine. We run multiple workloads on them. It&#x27;s <i>three entire VMs of RAM and compute</i>. If that&#x27;s not sufficient, you need to dig into which of the services you&#x27;re running on it are eating too much of whatever resource is falling short, and conclude through debugging whether that&#x27;s a bug, or you need to scale up. That&#x27;s the exact same procedure as a service on a VMs.<p>If your counter-example is not doing &quot;log and metrics collection&quot; — that&#x27;s an apples-to-oranges comparison. I run both k8s &amp; raw VMs, and … both run these &quot;side-cars&quot;. Not only do both run it, they&#x27;re often <i>the exact same process</i>.<p>Even the ingress: in most &quot;service is deployed to VM&quot; scenarios I&#x27;ve seen, often the service is fronted with nginx acting as a reverse proxy. That&#x27;s not only fulfilling the same role as something like ingress-nginx, it&#x27;s practically the same process.<p>Most startups should probably go with a managed k8s, in which case they&#x27;re likely not going to even have etcd in the cluster, nor more of the rest of the control plane. (IMO: don&#x27;t choose AKS, but IMO the problem there is the A, not the K.)<p>&gt; <i>You already are paying double of what you would have if you just excluded Kubernetes out of this because in a medium to small business there isn’t any feature of Kubernetes you are really using.</i><p>You shouldn&#x27;t be, because again, I think the k8s example is grossly over-provisioned.<p>But I also think k8s&#x27;s ability to move workloads between nodes easily lends it an advantage here: if I need to change the underlying makeup of the VMs, <i>I can</i>. That means that I can shrink-to-fit them. In my career eng spinning up VMs are far more likely to over-provision than to right-size or under-provision.<p>&gt; <i>The normal setup would cost any CI&#x2F;CD engineer a couple of days to setup and normally not more than an hour or 2 to debug infrastructure related issues.</i><p>&gt; <i>Deploying on Kubernetes usually involves rendering templates, setting CI&#x2F;CD runners, generating on the fly kubeconfigs for security and so much more that setting up CI&#x2F;CD would take not less than a month to have something that is production grade ready.</i><p>I&#x27;ve spent time on both. &quot;Normal&quot; (to a VM) CI&#x2F;CD flows have pathological corner cases dependent on the state of the VM. Flux or Argo is not hard to set up, and the benefit of YAML is reproducibility: pods consistently start from a clean state.<p>Much of the deploy work I&#x27;ve done with deployment scripts on VMs is re-inventing features that are part of k8s.<p>YAML generation is straight-forward from the need to have it be configurable. One you understand the need for it … IDK what the problem people have here is. &quot;setting CI&#x2F;CD runners&quot;?<p>&gt; <i>The idea of deploying that many components together with different versions and different maintainers makes it impossible near to have an error free Kubernetes cluster, from network CNI to controllers to custom operators things tends to breakdown most of the https</i><p>… this is always going to be a problem…? On a VM, I&#x27;ve got nginx, whatever handles certs, logs, metrics, security team&#x27;s spyware^Wprotection etc. … all from different vendors, at different versions.<p>&quot;things tends to breakdown most of the https&quot; ???<p>&gt; <i>It makes perfect sense with all the network encapsulation over the cloud network virtualization over the real network well things tend to get crazy.</i><p>???<p>&gt; <i>To be able to keep track of the versions of all components deployed on your cluster</i><p>(same complaint)<p>&gt; <i>And it should you are opting in for a setup intended for huge enterprises that have huge budgets and don’t mind having Kubernetes because it is actually benefiting them.</i><p>This is begging the question.<p>&gt; <i>Bigger attack surface</i><p>While the API server is certainly a non-zero attack surface, this blows it out of proportion. People run salt on VMs, … see it&#x27;s security track record: k8s fairs a far bit better. I&#x27;ve witnessed many orgs not set up some for of SSO, and try to manage VM access via SSH keys, and old keys do not get cleaned from nodes.<p>The standard tools work for the API server: you can firewall it off, if it scares you?<p>I would <i>caution</i> a <i>young</i> startup against running k8s: if you want to do it, you either need to have someone familiar with it who can teach, or eng who are capable of learning. If you have the all-too-common eng who don&#x27;t like learning and who aren&#x27;t familiar with it, you are going to have a bad time. But it isn&#x27;t hard to learn: k8s has great documentation. But I&#x27;ve witnessed a lot of frustration from people who haven&#x27;t RTFM.