| package kubernetes | 
 |  | 
 | import ( | 
 | 	"context" | 
 | 	"fmt" | 
 | 	"net" | 
 |  | 
 | 	"source.monogon.dev/go/net/tinylb" | 
 | 	"source.monogon.dev/metropolis/node" | 
 | 	"source.monogon.dev/metropolis/node/core/localstorage" | 
 | 	"source.monogon.dev/metropolis/node/core/network" | 
 | 	"source.monogon.dev/metropolis/pkg/event/memory" | 
 | 	"source.monogon.dev/metropolis/pkg/supervisor" | 
 |  | 
 | 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api" | 
 | ) | 
 |  | 
 | type ConfigWorker struct { | 
 | 	ServiceIPRange net.IPNet | 
 | 	ClusterNet     net.IPNet | 
 | 	ClusterDomain  string | 
 |  | 
 | 	Root          *localstorage.Root | 
 | 	Network       *network.Service | 
 | 	NodeID        string | 
 | 	CuratorClient ipb.CuratorClient | 
 | } | 
 |  | 
 | type Worker struct { | 
 | 	c ConfigWorker | 
 | } | 
 |  | 
 | func NewWorker(c ConfigWorker) *Worker { | 
 | 	s := &Worker{ | 
 | 		c: c, | 
 | 	} | 
 | 	return s | 
 | } | 
 |  | 
 | func (s *Worker) Run(ctx context.Context) error { | 
 | 	// Run apiproxy, which load-balances connections from worker components to this | 
 | 	// cluster's api servers. This is necessary as we want to round-robin across all | 
 | 	// available apiservers, and Kubernetes components do not implement client-side | 
 | 	// load-balancing. | 
 | 	err := supervisor.Run(ctx, "apiproxy", func(ctx context.Context) error { | 
 | 		lis, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", node.KubernetesWorkerLocalAPIPort)) | 
 | 		if err != nil { | 
 | 			return fmt.Errorf("failed to listen: %w", err) | 
 | 		} | 
 | 		defer lis.Close() | 
 |  | 
 | 		v := memory.Value[tinylb.BackendSet]{} | 
 | 		srv := tinylb.Server{ | 
 | 			Provider: &v, | 
 | 			Listener: lis, | 
 | 		} | 
 | 		err = supervisor.Run(ctx, "updater", func(ctx context.Context) error { | 
 | 			return updateLoadbalancerAPIServers(ctx, &v, s.c.CuratorClient) | 
 | 		}) | 
 | 		if err != nil { | 
 | 			return err | 
 | 		} | 
 |  | 
 | 		supervisor.Logger(ctx).Infof("Starting proxy...") | 
 | 		return srv.Run(ctx) | 
 | 	}) | 
 | 	if err != nil { | 
 | 		return err | 
 | 	} | 
 | 	supervisor.Signal(ctx, supervisor.SignalHealthy) | 
 | 	<-ctx.Done() | 
 | 	return nil | 
 | } |