In this bloghttps://blog.alexellis.io/create-a-3-node-k3s-cluster-with-k3sup-digitalocean/ I found this statement:
... a LoadBalancer (...) is not required because of the way k3s exposes traffic through HostPorts.
I don't find a reference how k3s is able to replace a "real" loadbalancer which makes sure that incoming traffic is routed to 1 out of n hosts forming a HA solution
By default it uses something that k3s calls ServiceLB, which is a managed deployment of https://github.com/rancher/klipper-lb
This works by using a host port for each service load balancer and setting up iptables to forward the request to the cluster IP. The regular k8s scheduler will find a free host port. If there are no free host ports, the service load balancer will stay in pending.
So, if you want a Service on port 80, the scheduler will find a node with port 80 available on the node's public interface. If all your nodes already have something on port 80 (other Services, local Apache install, etc) the Service will fail to create. It's great for simple setups, but I think most people replace it with MetalLB or something more capable in production.
Most helpful comment
By default it uses something that k3s calls ServiceLB, which is a managed deployment of https://github.com/rancher/klipper-lb
So, if you want a Service on port 80, the scheduler will find a node with port 80 available on the node's public interface. If all your nodes already have something on port 80 (other Services, local Apache install, etc) the Service will fail to create. It's great for simple setups, but I think most people replace it with MetalLB or something more capable in production.