Skip to content

Commit e19cb3f

Browse files
Feature Implement Unix Domain Socket based connectivity for Envoy->Gateway XDS Server.
Implement Unix Domain Socket based connectivity for Envoy to connect to XDS server for gateway.
1 parent bdb9fd1 commit e19cb3f

3 files changed

Lines changed: 41 additions & 97 deletions

File tree

pkg/gateway/controller.go

Lines changed: 24 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -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 (
6767
const (
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-
724680
func (c *Controller) UpdateXDSServer(ctx context.Context, nodeid string, resources map[resourcev3.Type][]envoyproxytypes.Resource) error {
725681
c.xdsVersion.Add(1)
726682

pkg/gateway/envoy.go

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
const (
2222
proxyConfigPath = "/home/envoy/envoy.yaml"
2323
envoyAdminPort = 10000
24+
envoySocketName = "/var/run/envoy.sock"
2425

2526
// well known dns to reach host from containers
2627
// https://github.com/containerd/nerdctl/issues/747
@@ -46,7 +47,7 @@ dynamic_resources:
4647
4748
static_resources:
4849
clusters:
49-
- type: STRICT_DNS
50+
- type: STATIC
5051
typed_extension_protocol_options:
5152
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
5253
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
@@ -59,19 +60,8 @@ static_resources:
5960
- lb_endpoints:
6061
- endpoint:
6162
address:
62-
socket_address:
63-
address: {{ .ControlPlaneAddress }}
64-
port_value: {{ .ControlPlanePort }}
65-
- endpoint:
66-
address:
67-
socket_address:
68-
address: host.docker.internal
69-
port_value: {{ .ControlPlanePort }}
70-
- endpoint:
71-
address:
72-
socket_address:
73-
address: host.lima.internal
74-
port_value: {{ .ControlPlanePort }}
63+
pipe:
64+
path: {{ .EnvoySocket }}
7565
7666
admin:
7767
access_log_path: /dev/stdout
@@ -82,20 +72,17 @@ admin:
8272
`
8373

8474
type configData struct {
85-
Cluster string
86-
ID string
87-
AdminPort int
88-
ControlPlaneAddress string
89-
ControlPlanePort int
75+
Cluster string
76+
ID string
77+
AdminPort int
78+
EnvoySocket string
9079
}
9180

9281
// generateEnvoyConfig returns an envoy config generated from config data
9382
func generateEnvoyConfig(data *configData) (string, error) {
9483
if data.Cluster == "" ||
9584
data.ID == "" ||
96-
data.AdminPort == 0 ||
97-
data.ControlPlaneAddress == "" ||
98-
data.ControlPlanePort == 0 {
85+
data.AdminPort == 0 {
9986
return "", fmt.Errorf("missing parameters")
10087
}
10188

@@ -128,15 +115,14 @@ func gatewaySimpleName(clusterName, namespace, name string) string {
128115
}
129116

130117
// createGateway create a docker container with a gateway
131-
func createGateway(clusterName string, nameserver string, localAddress string, localPort int, gateway *gatewayv1.Gateway, enableTunnel bool) error {
118+
func createGateway(clusterName string, nameserver string, gateway *gatewayv1.Gateway, enableTunnel bool) error {
132119
name := gatewayName(clusterName, gateway.Namespace, gateway.Name)
133120
simpleName := gatewaySimpleName(clusterName, gateway.Namespace, gateway.Name)
134121
envoyConfigData := &configData{
135-
ID: name,
136-
Cluster: simpleName,
137-
AdminPort: envoyAdminPort,
138-
ControlPlaneAddress: localAddress,
139-
ControlPlanePort: localPort,
122+
ID: name,
123+
Cluster: simpleName,
124+
AdminPort: envoyAdminPort,
125+
EnvoySocket: envoySocketName,
140126
}
141127
dynamicFilesystemConfig, err := generateEnvoyConfig(envoyConfigData)
142128
if err != nil {
@@ -153,6 +139,8 @@ func createGateway(clusterName string, nameserver string, localAddress string, l
153139
"--user=0",
154140
"--label", fmt.Sprintf("%s=%s", constants.NodeCCMLabelKey, clusterName),
155141
"--label", fmt.Sprintf("%s=%s", constants.GatewayNameLabelKey, simpleName),
142+
"--env", "ENVOY_UID=0",
143+
"--volume", fmt.Sprintf("%s:%s", GWSocketName, envoySocketName),
156144
"--net", networkName,
157145
"--dns", nameserver,
158146
"--init=false",

pkg/gateway/kindcluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func (c *Controller) ensureGatewayContainer(ctx context.Context, gw *gatewayv1.G
196196
if !container.Exist(containerName) {
197197
klog.V(2).Infof("creating container %s for gateway %s/%s on cluster %s", containerName, namespace, name, c.clusterName)
198198
enableTunnels := c.tunnelManager != nil || config.DefaultConfig.LoadBalancerConnectivity == config.Portmap
199-
err := createGateway(c.clusterName, c.clusterNameserver, c.xdsLocalAddress, c.xdsLocalPort, gw, enableTunnels)
199+
err := createGateway(c.clusterName, c.clusterNameserver, gw, enableTunnels)
200200
if err != nil {
201201
return err
202202
}

0 commit comments

Comments
 (0)