I use keepalived along with k3s’s inbuilt load-balancer support and Traefik 2, which - while it probably wouldn’t work well for a cloud cluster, since it depends on doing your own network-wrangling - works great for a local one.
Short version: I proxy everything through Traefik, http, raw tcp, or udp. Since Traefik is defined as a LoadBalancer-type service in this configuration, k3s automatically spawns a DaemonSet of svclb-traefik-* pods which ensure that the exposed ports (25, 443, 53, etc.) are available on every node and forwarded to Traefik; and then I have keepalived set up to create a cluster address (172.16.0.140) which is always forwarded to a cluster node (172.16.0.141-149) that’s up.
And voila, single (redundant) cluster address with arbitrary number of service ports! ![]()