func LoadBalancer()

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
}