<p>I was looking at the <a href="https://kubernetes.io/docs/getting-started-guides/windows/" rel="noreferrer">kubernetes documentation</a> which seems to have a windows compability, however I don't find completely clear if both Linux and Windows can live together (I mean, in diferent VMs but the same cluster).</p>

<p>I would like to know if there is any support for this scenario in <code>gcloud</code>, <code>azure</code> or <code>aws</code>. And also, the procedure or example to make it work. Like how to create a pod in the correct VM (windows or linux) and how horizontal and cluster autoscalers work.</p>

<p>The use case is 2 APIs, one running in windows (.NET Framework) and other in linux (python/c++) and I want to be able to reroute them, be able to call each other, scale them and so on with kubernetes. As a note, the <code>.NET Framework</code> application have dependencies (mainly for mathematical optimization) that cannot be passed to <code>.NET Core</code>, this implies that I cannot convert the application to <a href="https://learn.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x" rel="noreferrer">linux-based</a>.</p>

<p>Some history, so containers is a Linux thing so there are no containers per se on Windows. Docker created Docker for Windows but essentially what it does is run a Hyper-V Linux VM (used to be VirtualBox) and inside it runs your containers. As of the latest Docker version, Microsoft has added capabilities on Hyper-V to allow running these containers kinda natively making it easy to run <a href="https://learn.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc" rel="noreferrer">.NET apps</a> in containers.</p>

<p>K8s is implemented in Golang so it was generally easier to port main components like the <code>kubelet</code>, <code>kube-proxy</code>, <code>kubectl</code> to Windows, by using the Golang cross-compiler (or native on Windows)</p>

<p>A tricky part is the networking but looks like they've got it figured out in the <a href="https://kubernetes.io/docs/getting-started-guides/windows/#upstream-l3-routing-topology" rel="noreferrer">docs</a></p>

<p>As far as public cloud support from major providers:</p>

<ul>
<li><p>AWS  </p>

<ul>
<li>Hypervisor:  Modified Xen or KVM. No nested virtualization support.</li>
<li>VMs: Windows VMs. Can't take advantage of Hyper-V with nested virtualization, but can run Docker for Windows. </li>
<li>Bare-metal: (i3.metal as of this writing). Run Hyper-V natively and Docker for Windows.</li>
</ul></li>
<li><p>Azure</p>

<ul>
<li>Hypervisor: Hyper-V. Supports nested virtualization on some instance types.</li>
<li>VMs: Windows VMs, can use nested virtualization with Hyper-V, and can run Docker for Windows.</li>
<li>ACS, AKS, ACE: Should be able to take advantage of Hyper-V with nested virtualization and some cases natively.</li>
</ul></li>
<li><p>GCP</p>

<ul>
<li>Hypervisor: KVM. Supports nested virtualization on some instance types.</li>
<li>VMs: Windows VMs. Can run Hyper-V with nested virtualization and can run Docker for Windows.</li>
</ul></li>
</ul>

<p>Other than that I don't know what else there's to it (Other than what's in the <a href="https://kubernetes.io/docs/getting-started-guides/windows/" rel="noreferrer">docs</a>) The question is very broad. Just install Docker for Windows, setup networking, join your cluster with <code>kubeadm</code> and schedule your Windows workloads using the <code>nodeSelector</code> spec in your pods and make sure you label your Windows nodes with <code>beta.kubernetes.io/os=windows</code></p>

<p>There's another good guide on to set up Kubernetes with Windows nodes <a href="https://onedrive.live.com/view.aspx?resid=E2B6765015E5FA01!339&amp;ithint=file%2Cdocx&amp;app=Word&amp;authkey=!AGvs_s_hWs7xHGs" rel="noreferrer">here</a></p>
