mirror of https://github.com/k3s-io/k3s
Fixed loadbalancer in case of IPv6 addresses
Signed-off-by: Roberto Bonafiglia <roberto.bonafiglia@suse.com>pull/5385/head
parent
80b22ded81
commit
ba0270c6bc
|
@ -308,7 +308,8 @@ func get(ctx context.Context, envInfo *cmds.Agent, proxy proxy.Proxy) (*config.N
|
||||||
|
|
||||||
// If the supervisor and externally-facing apiserver are not on the same port, tell the proxy where to find the apiserver.
|
// If the supervisor and externally-facing apiserver are not on the same port, tell the proxy where to find the apiserver.
|
||||||
if controlConfig.SupervisorPort != controlConfig.HTTPSPort {
|
if controlConfig.SupervisorPort != controlConfig.HTTPSPort {
|
||||||
if err := proxy.SetAPIServerPort(ctx, controlConfig.HTTPSPort); err != nil {
|
_, isIPv6, _ := util.GetFirstString([]string{envInfo.NodeIP.String()})
|
||||||
|
if err := proxy.SetAPIServerPort(ctx, controlConfig.HTTPSPort, isIPv6); err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to setup access to API Server port %d on at %s", controlConfig.HTTPSPort, proxy.SupervisorURL())
|
return nil, errors.Wrapf(err, "failed to setup access to API Server port %d on at %s", controlConfig.HTTPSPort, proxy.SupervisorURL())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,13 @@ var (
|
||||||
ETCDServerServiceName = version.Program + "-etcd-server-load-balancer"
|
ETCDServerServiceName = version.Program + "-etcd-server-load-balancer"
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(ctx context.Context, dataDir, serviceName, serverURL string, lbServerPort int) (_lb *LoadBalancer, _err error) {
|
func New(ctx context.Context, dataDir, serviceName, serverURL string, lbServerPort int, isIPv6 bool) (_lb *LoadBalancer, _err error) {
|
||||||
config := net.ListenConfig{Control: reusePort}
|
config := net.ListenConfig{Control: reusePort}
|
||||||
listener, err := config.Listen(ctx, "tcp", "127.0.0.1:"+strconv.Itoa(lbServerPort))
|
localhostAddress := "127.0.0.1"
|
||||||
|
if isIPv6 {
|
||||||
|
localhostAddress = "[::1]"
|
||||||
|
}
|
||||||
|
listener, err := config.Listen(ctx, "tcp", localhostAddress+":"+strconv.Itoa(lbServerPort))
|
||||||
defer func() {
|
defer func() {
|
||||||
if _err != nil {
|
if _err != nil {
|
||||||
logrus.Warnf("Error starting load balancer: %s", _err)
|
logrus.Warnf("Error starting load balancer: %s", _err)
|
||||||
|
|
|
@ -106,7 +106,7 @@ func Test_UnitFailOver(t *testing.T) {
|
||||||
DataDir: tmpDir,
|
DataDir: tmpDir,
|
||||||
}
|
}
|
||||||
|
|
||||||
lb, err := New(context.TODO(), cfg.DataDir, SupervisorServiceName, cfg.ServerURL, RandomPort)
|
lb, err := New(context.TODO(), cfg.DataDir, SupervisorServiceName, cfg.ServerURL, RandomPort, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
assertEqual(t, err, nil)
|
assertEqual(t, err, nil)
|
||||||
}
|
}
|
||||||
|
@ -157,7 +157,7 @@ func Test_UnitFailFast(t *testing.T) {
|
||||||
DataDir: tmpDir,
|
DataDir: tmpDir,
|
||||||
}
|
}
|
||||||
|
|
||||||
lb, err := New(context.TODO(), cfg.DataDir, SupervisorServiceName, cfg.ServerURL, RandomPort)
|
lb, err := New(context.TODO(), cfg.DataDir, SupervisorServiceName, cfg.ServerURL, RandomPort, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
assertEqual(t, err, nil)
|
assertEqual(t, err, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
|
|
||||||
type Proxy interface {
|
type Proxy interface {
|
||||||
Update(addresses []string)
|
Update(addresses []string)
|
||||||
SetAPIServerPort(ctx context.Context, port int) error
|
SetAPIServerPort(ctx context.Context, port int, isIPv6 bool) error
|
||||||
SetSupervisorDefault(address string)
|
SetSupervisorDefault(address string)
|
||||||
SupervisorURL() string
|
SupervisorURL() string
|
||||||
SupervisorAddresses() []string
|
SupervisorAddresses() []string
|
||||||
|
@ -29,7 +29,7 @@ type Proxy interface {
|
||||||
// NOTE: This is a proxy in the API sense - it returns either actual server URLs, or the URL of the
|
// NOTE: This is a proxy in the API sense - it returns either actual server URLs, or the URL of the
|
||||||
// local load-balancer. It is not actually responsible for proxying requests at the network level;
|
// local load-balancer. It is not actually responsible for proxying requests at the network level;
|
||||||
// this is handled by the load-balancers that the proxy optionally steers connections towards.
|
// this is handled by the load-balancers that the proxy optionally steers connections towards.
|
||||||
func NewSupervisorProxy(ctx context.Context, lbEnabled bool, dataDir, supervisorURL string, lbServerPort int) (Proxy, error) {
|
func NewSupervisorProxy(ctx context.Context, lbEnabled bool, dataDir, supervisorURL string, lbServerPort int, isIPv6 bool) (Proxy, error) {
|
||||||
p := proxy{
|
p := proxy{
|
||||||
lbEnabled: lbEnabled,
|
lbEnabled: lbEnabled,
|
||||||
dataDir: dataDir,
|
dataDir: dataDir,
|
||||||
|
@ -40,7 +40,7 @@ func NewSupervisorProxy(ctx context.Context, lbEnabled bool, dataDir, supervisor
|
||||||
}
|
}
|
||||||
|
|
||||||
if lbEnabled {
|
if lbEnabled {
|
||||||
lb, err := loadbalancer.New(ctx, dataDir, loadbalancer.SupervisorServiceName, supervisorURL, p.lbServerPort)
|
lb, err := loadbalancer.New(ctx, dataDir, loadbalancer.SupervisorServiceName, supervisorURL, p.lbServerPort, isIPv6)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ func (p *proxy) setSupervisorPort(addresses []string) []string {
|
||||||
// load-balancing is enabled, another load-balancer is started on a port one below the supervisor
|
// load-balancing is enabled, another load-balancer is started on a port one below the supervisor
|
||||||
// load-balancer, and the address of this load-balancer is returned instead of the actual apiserver
|
// load-balancer, and the address of this load-balancer is returned instead of the actual apiserver
|
||||||
// addresses.
|
// addresses.
|
||||||
func (p *proxy) SetAPIServerPort(ctx context.Context, port int) error {
|
func (p *proxy) SetAPIServerPort(ctx context.Context, port int, isIPv6 bool) error {
|
||||||
u, err := url.Parse(p.initialSupervisorURL)
|
u, err := url.Parse(p.initialSupervisorURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to parse server URL %s", p.initialSupervisorURL)
|
return errors.Wrapf(err, "failed to parse server URL %s", p.initialSupervisorURL)
|
||||||
|
@ -125,7 +125,7 @@ func (p *proxy) SetAPIServerPort(ctx context.Context, port int) error {
|
||||||
if lbServerPort != 0 {
|
if lbServerPort != 0 {
|
||||||
lbServerPort = lbServerPort - 1
|
lbServerPort = lbServerPort - 1
|
||||||
}
|
}
|
||||||
lb, err := loadbalancer.New(ctx, p.dataDir, loadbalancer.APIServerServiceName, p.apiServerURL, lbServerPort)
|
lb, err := loadbalancer.New(ctx, p.dataDir, loadbalancer.APIServerServiceName, p.apiServerURL, lbServerPort, isIPv6)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,8 +239,9 @@ func createProxyAndValidateToken(ctx context.Context, cfg *cmds.Agent) (proxy.Pr
|
||||||
if err := os.MkdirAll(agentDir, 0700); err != nil {
|
if err := os.MkdirAll(agentDir, 0700); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
_, isIPv6, _ := util.GetFirstString([]string{cfg.NodeIP.String()})
|
||||||
|
|
||||||
proxy, err := proxy.NewSupervisorProxy(ctx, !cfg.DisableLoadBalancer, agentDir, cfg.ServerURL, cfg.LBServerPort)
|
proxy, err := proxy.NewSupervisorProxy(ctx, !cfg.DisableLoadBalancer, agentDir, cfg.ServerURL, cfg.LBServerPort, isIPv6)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/rancher/k3s/pkg/cluster/managed"
|
"github.com/rancher/k3s/pkg/cluster/managed"
|
||||||
"github.com/rancher/k3s/pkg/daemons/config"
|
"github.com/rancher/k3s/pkg/daemons/config"
|
||||||
"github.com/rancher/k3s/pkg/etcd"
|
"github.com/rancher/k3s/pkg/etcd"
|
||||||
|
"github.com/k3s-io/k3s/pkg/util"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -52,7 +53,8 @@ func (c *Cluster) Start(ctx context.Context) (<-chan struct{}, error) {
|
||||||
clientURL.Host = clientURL.Hostname() + ":2379"
|
clientURL.Host = clientURL.Hostname() + ":2379"
|
||||||
clientURLs = append(clientURLs, clientURL.String())
|
clientURLs = append(clientURLs, clientURL.String())
|
||||||
}
|
}
|
||||||
etcdProxy, err := etcd.NewETCDProxy(ctx, true, c.config.DataDir, clientURLs[0])
|
IPv6OnlyService, _ := util.IsIPv6OnlyCIDRs(c.config.ServiceIPRanges)
|
||||||
|
etcdProxy, err := etcd.NewETCDProxy(ctx, true, c.config.DataDir, clientURLs[0], IPv6OnlyService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ type Proxy interface {
|
||||||
|
|
||||||
// NewETCDProxy initializes a new proxy structure that contain a load balancer
|
// NewETCDProxy initializes a new proxy structure that contain a load balancer
|
||||||
// which listens on port 2379 and proxy between etcd cluster members
|
// which listens on port 2379 and proxy between etcd cluster members
|
||||||
func NewETCDProxy(ctx context.Context, enabled bool, dataDir, etcdURL string) (Proxy, error) {
|
func NewETCDProxy(ctx context.Context, enabled bool, dataDir, etcdURL string, isIPv6 bool) (Proxy, error) {
|
||||||
u, err := url.Parse(etcdURL)
|
u, err := url.Parse(etcdURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to parse etcd client URL")
|
return nil, errors.Wrap(err, "failed to parse etcd client URL")
|
||||||
|
@ -30,7 +30,7 @@ func NewETCDProxy(ctx context.Context, enabled bool, dataDir, etcdURL string) (P
|
||||||
}
|
}
|
||||||
|
|
||||||
if enabled {
|
if enabled {
|
||||||
lb, err := loadbalancer.New(ctx, dataDir, loadbalancer.ETCDServerServiceName, etcdURL, 2379)
|
lb, err := loadbalancer.New(ctx, dataDir, loadbalancer.ETCDServerServiceName, etcdURL, 2379, isIPv6)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue