@@ -20,7 +20,7 @@ import (
2020 "context"
2121 "fmt"
2222 "net"
23- "sort "
23+ "os "
2424 "sync/atomic"
2525 "time"
2626
@@ -67,6 +67,7 @@ import (
6767const (
6868 controllerName = "kind.sigs.k8s.io/gateway-controller"
6969 GWClassName = "cloud-provider-kind"
70+ GWSocketName = "/var/run/cloudproviderkind.sock"
7071 maxRetries = 5
7172 workers = 5
7273)
@@ -120,11 +121,9 @@ type Controller struct {
120121 referenceGrantLister gatewaylistersv1beta1.ReferenceGrantLister
121122 referenceGrantListerSynced cache.InformerSynced
122123
123- xdscache cachev3.SnapshotCache
124- xdsserver serverv3.Server
125- xdsLocalAddress string
126- xdsLocalPort int
127- xdsVersion atomic.Uint64
124+ xdscache cachev3.SnapshotCache
125+ xdsserver serverv3.Server
126+ xdsVersion atomic.Uint64
128127
129128 tunnelManager * tunnels.TunnelManager
130129}
@@ -428,29 +427,35 @@ func (c *Controller) Run(ctx context.Context) error {
428427 secretv3 .RegisterSecretDiscoveryServiceServer (grpcServer , c .xdsserver )
429428 runtimev3 .RegisterRuntimeDiscoveryServiceServer (grpcServer , c .xdsserver )
430429
431- address , err := GetControlPlaneAddress ()
432- if err != nil {
433- return err
430+ // Cleanup any existing socket file remaining incase from previous crash.
431+ if err := os . RemoveAll ( GWSocketName ); err != nil {
432+ return fmt . Errorf ( "failed to remove old socket: %s" , err . Error ())
434433 }
435- listener , err := net .Listen ("tcp" , fmt .Sprintf ("%s:0" , address ))
434+
435+ // Start a Unix Domain Socket
436+ listener , err := net .Listen ("unix" , GWSocketName )
436437 if err != nil {
437438 return err
438439 }
439- defer listener .Close ()
440440
441- addr := listener .Addr ()
442- tcpAddr , ok := addr .(* net.TCPAddr )
443- if ! ok {
444- return fmt .Errorf ("could not assert listener address to TCPAddr: %s" , addr .String ())
441+ defer func () {
442+ listener .Close ()
443+ logger .Info ("Cleaning up socket" )
444+ if err := os .RemoveAll (GWSocketName ); err != nil {
445+ logger .Error (err , "failed to cleanup socket" )
446+ }
447+ }()
448+
449+ if err := os .Chmod (GWSocketName , 0666 ); err != nil {
450+ listener .Close ()
451+ return err
445452 }
446453
447- c .xdsLocalAddress = address
448- c .xdsLocalPort = tcpAddr .Port
449454 go func () {
450455 logger .Info (
451456 "XDS management server listening" ,
452- "address " , c . xdsLocalAddress ,
453- "port" , c . xdsLocalPort )
457+ "Unix Domain Socket " , GWSocketName ,
458+ )
454459 if err = grpcServer .Serve (listener ); err != nil {
455460 logger .Error (err , "gRPC server error:" )
456461 }
@@ -650,7 +655,6 @@ func (c *Controller) processNextGatewayItem(ctx context.Context) bool {
650655 return false
651656 }
652657 defer c .gatewayqueue .Done (key )
653-
654658 err := c .syncGateway (ctx , key )
655659 c .handleGatewayErr (err , key )
656660 return true
@@ -673,54 +677,6 @@ func (c *Controller) handleGatewayErr(err error, key string) {
673677 klog .Infof ("Dropping Gateway %q out of the queue: %v" , key , err )
674678}
675679
676- func GetControlPlaneAddress () (string , error ) {
677- interfaces , err := net .Interfaces ()
678- if err != nil {
679- return "" , err
680- }
681-
682- sort .Slice (interfaces , func (i , j int ) bool {
683- nameI := interfaces [i ].Name
684- nameJ := interfaces [j ].Name
685-
686- if nameI == "docker0" {
687- return true
688- }
689- if nameJ == "docker0" {
690- return false
691- }
692-
693- if nameI == "eth0" {
694- return nameJ != "docker0"
695- }
696- if nameJ == "eth0" {
697- return false
698- }
699-
700- return nameI < nameJ
701- })
702-
703- for _ , iface := range interfaces {
704- if iface .Flags & net .FlagUp == 0 || iface .Flags & net .FlagLoopback != 0 {
705- continue
706- }
707-
708- addrs , err := iface .Addrs ()
709- if err != nil {
710- continue
711- }
712-
713- for _ , addr := range addrs {
714- ipNet , ok := addr .(* net.IPNet )
715- if ok && ipNet .IP .To4 () != nil && ! ipNet .IP .IsLinkLocalUnicast () && ! ipNet .IP .IsLoopback () {
716- return ipNet .IP .String (), nil
717- }
718- }
719- }
720-
721- return "" , fmt .Errorf ("no suitable global unicast IPv4 address found on any active non-loopback interface" )
722- }
723-
724680func (c * Controller ) UpdateXDSServer (ctx context.Context , nodeid string , resources map [resourcev3.Type ][]envoyproxytypes.Resource ) error {
725681 c .xdsVersion .Add (1 )
726682
0 commit comments