in kinder/pkg/cluster/manager/actions/loadbalancer.go [34:85]
func LoadBalancer(c *status.Cluster, nodes ...*status.Node) error {
// identify external load balancer node
lb := c.ExternalLoadBalancer()
// if there's no loadbalancer we're done
if lb == nil {
return nil
}
ipv6 := (c.Settings.IPFamily == status.IPv6Family)
// collect info about the existing controlplane nodes
lb.Infof("Updating load balancer configuration with %d control plane backends", len(nodes))
var backendServers = map[string]string{}
for _, n := range nodes {
controlPlaneIPv4, controlPlaneIPv6, err := n.IP()
if err != nil {
return errors.Wrapf(err, "failed to get IP for node %s", n.Name())
}
if controlPlaneIPv4 != "" && !ipv6 {
backendServers[n.Name()] = fmt.Sprintf("%s:%d", controlPlaneIPv4, constants.APIServerPort)
}
if controlPlaneIPv6 != "" && ipv6 {
backendServers[n.Name()] = fmt.Sprintf("[%s]:%d", controlPlaneIPv6, constants.APIServerPort)
}
}
// create loadbalancer config data
loadbalancerConfig, err := loadbalancer.Config(&loadbalancer.ConfigData{
ControlPlanePort: constants.ControlPlanePort,
BackendServers: backendServers,
IPv6: ipv6,
})
if err != nil {
return errors.Wrap(err, "failed to generate loadbalancer config data")
}
// create loadbalancer config on the node
log.Debugf("Writing loadbalancer config on %s...", lb.Name())
if err := lb.WriteFile(constants.LoadBalancerConfigPath, []byte(loadbalancerConfig)); err != nil {
return errors.Wrap(err, "failed to copy loadbalancer config to node")
}
// reload the config
if err := host.SendSignal("SIGHUP", lb.Name()); err != nil {
return errors.Wrap(err, "failed to reload loadbalancer")
}
return nil
}