You can use one of the two container autoscalers to handle the scaling automatically based on any metric(s) you like, and the cluster autoscaler will scale the ASG as needed :)
This is useful for workloads that need to scale on some metric other than CPU/MEM, e.g. request rate, worker queue length...
I actually run 3 small bare metal clusters in production.
Maintain is basically just a `kubeadm upgrade` on all nodes + reboot (easily scriptable), after some updates get announced. OS Upgrades are done through container-linux-update-operator.
NAT is not a problem if you are below or equal to 50 nodes. Not sure if you run into problems if there are more nodes, thought.
Also BGP+metallb is quite good.
(P.S.: openstack uses NAT heavily as well. and IPVS for k8s should fix most problems if you are running into problems)