Skip to content

Commit fdc0786

Browse files
pkg/proxy: Reconcile routes
Convert the proxy code to use the new route reconciliation for proxy routes. Signed-off-by: Dylan Reimerink <dylan.reimerink@isovalent.com>
1 parent 92abc8f commit fdc0786

File tree

6 files changed

+403
-129
lines changed

6 files changed

+403
-129
lines changed

pkg/datapath/loader/base.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -517,10 +517,8 @@ func (l *loader) Reinitialize(ctx context.Context, lnc *datapath.LocalNodeConfig
517517
}
518518

519519
// Reinstall proxy rules for any running proxies if needed
520-
if option.Config.EnableL7Proxy {
521-
if err := p.ReinstallRoutingRules(ctx, lnc.RouteMTU, lnc.EnableIPSec); err != nil {
522-
return err
523-
}
520+
if err := p.ReinstallRoutingRules(ctx, lnc.RouteMTU, lnc.EnableIPSec); err != nil {
521+
return err
524522
}
525523

526524
return nil

pkg/proxy/cell.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ package proxy
55

66
import (
77
"context"
8+
"fmt"
89
"log/slog"
910

1011
"github.com/cilium/hive/cell"
1112
"github.com/cilium/hive/job"
13+
"github.com/cilium/statedb"
1214

15+
"github.com/cilium/cilium/pkg/datapath/linux/route/reconciler"
16+
"github.com/cilium/cilium/pkg/datapath/tables"
1317
datapath "github.com/cilium/cilium/pkg/datapath/types"
1418
"github.com/cilium/cilium/pkg/envoy"
1519
fqdnproxy "github.com/cilium/cilium/pkg/fqdn/proxy"
@@ -49,18 +53,26 @@ type proxyParams struct {
4953
ProxyPorts *proxyports.ProxyPorts
5054
EnvoyProxyIntegration *envoyProxyIntegration
5155
DNSProxyIntegration *dnsProxyIntegration
56+
57+
DB *statedb.DB
58+
Devices statedb.Table[*tables.Device]
59+
RouteManager *reconciler.DesiredRouteManager
5260
}
5361

54-
func newProxy(params proxyParams) *Proxy {
62+
func newProxy(params proxyParams) (*Proxy, error) {
63+
p, err := createProxy(option.Config.EnableL7Proxy, params.Logger, params.LocalNodeStore, params.ProxyPorts, params.EnvoyProxyIntegration, params.DNSProxyIntegration, params.DB, params.Devices, params.RouteManager)
64+
if err != nil {
65+
return nil, fmt.Errorf("unable to create proxy: %w", err)
66+
}
67+
5568
if !option.Config.EnableL7Proxy {
5669
params.Logger.Info("L7 proxies are disabled")
5770
if option.Config.EnableEnvoyConfig {
5871
params.Logger.Warn("CiliumEnvoyConfig functionality isn't enabled when L7 proxies are disabled", logfields.Flag, option.EnableEnvoyConfig)
5972
}
60-
return nil
61-
}
6273

63-
p := createProxy(params.Logger, params.LocalNodeStore, params.ProxyPorts, params.EnvoyProxyIntegration, params.DNSProxyIntegration)
74+
return p, nil
75+
}
6476

6577
p.proxyPorts.Trigger = job.NewTrigger(job.WithDebounce(10 * time.Second))
6678

@@ -89,7 +101,7 @@ func newProxy(params proxyParams) *Proxy {
89101
},
90102
})
91103

92-
return p
104+
return p, nil
93105
}
94106

95107
type envoyProxyIntegrationParams struct {

pkg/proxy/proxy.go

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ import (
88
"fmt"
99
"log/slog"
1010

11+
"github.com/cilium/statedb"
12+
1113
"github.com/cilium/cilium/api/v1/models"
1214
"github.com/cilium/cilium/pkg/completion"
15+
"github.com/cilium/cilium/pkg/datapath/linux/route/reconciler"
16+
"github.com/cilium/cilium/pkg/datapath/tables"
1317
"github.com/cilium/cilium/pkg/identity"
1418
"github.com/cilium/cilium/pkg/lock"
1519
"github.com/cilium/cilium/pkg/logging/logfields"
@@ -34,6 +38,8 @@ const (
3438

3539
// Proxy maintains state about redirects
3640
type Proxy struct {
41+
enabled bool
42+
3743
// mutex is the lock required when modifying any proxy datastructure
3844
mutex lock.RWMutex
3945

@@ -51,31 +57,44 @@ type Proxy struct {
5157

5258
// proxyPorts manages proxy port allocation
5359
proxyPorts *proxyports.ProxyPorts
60+
61+
db *statedb.DB
62+
devices statedb.Table[*tables.Device]
63+
routeOwner *reconciler.RouteOwner
64+
routeInitializer reconciler.Initializer
65+
routeManager *reconciler.DesiredRouteManager
5466
}
5567

5668
func createProxy(
69+
enabled bool,
5770
logger *slog.Logger,
5871
localNodeStore *node.LocalNodeStore,
5972
proxyPorts *proxyports.ProxyPorts,
6073
envoyIntegration *envoyProxyIntegration,
6174
dnsIntegration *dnsProxyIntegration,
62-
) *Proxy {
75+
db *statedb.DB,
76+
devices statedb.Table[*tables.Device],
77+
routeManager *reconciler.DesiredRouteManager,
78+
) (*Proxy, error) {
79+
routeOwner, err := routeManager.RegisterOwner("proxy")
80+
if err != nil {
81+
return nil, fmt.Errorf("unable to register route owner: %w", err)
82+
}
83+
6384
return &Proxy{
85+
enabled: enabled,
6486
logger: logger,
6587
localNodeStore: localNodeStore,
6688
redirects: make(map[string]RedirectImplementation),
6789
envoyIntegration: envoyIntegration,
6890
dnsIntegration: dnsIntegration,
6991
proxyPorts: proxyPorts,
70-
}
71-
}
72-
73-
func (p *Proxy) ReinstallRoutingRules(ctx context.Context, mtu int, ipsecEnabled bool) error {
74-
ln, err := p.localNodeStore.Get(ctx)
75-
if err != nil {
76-
return fmt.Errorf("failed to retrieve local node: %w", err)
77-
}
78-
return ReinstallRoutingRules(p.logger, ln, mtu, ipsecEnabled)
92+
db: db,
93+
devices: devices,
94+
routeOwner: routeOwner,
95+
routeInitializer: routeManager.RegisterInitializer("proxy"),
96+
routeManager: routeManager,
97+
}, nil
7998
}
8099

81100
func (p *Proxy) GetListenerProxyPort(listener string) uint16 {

pkg/proxy/proxy_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,39 @@ import (
88
"os"
99
"testing"
1010

11+
"github.com/cilium/hive/cell"
1112
"github.com/cilium/hive/hivetest"
1213
"github.com/cilium/hive/job"
1314
"github.com/stretchr/testify/require"
1415

1516
"github.com/cilium/cilium/pkg/completion"
1617
datapath "github.com/cilium/cilium/pkg/datapath/fake/types"
18+
"github.com/cilium/cilium/pkg/datapath/linux/route/reconciler"
1719
"github.com/cilium/cilium/pkg/envoy"
20+
"github.com/cilium/cilium/pkg/hive"
1821
"github.com/cilium/cilium/pkg/policy"
1922
"github.com/cilium/cilium/pkg/proxy/proxyports"
2023
"github.com/cilium/cilium/pkg/time"
2124
"github.com/cilium/cilium/pkg/u8proto"
2225
)
2326

2427
func proxyForTest(t *testing.T) *Proxy {
28+
var drm *reconciler.DesiredRouteManager
29+
hive.New(
30+
reconciler.TableCell,
31+
cell.Invoke(func(m *reconciler.DesiredRouteManager) {
32+
drm = m
33+
}),
34+
).Populate(hivetest.Logger(t))
2535
fakeIPTablesManager := &datapath.FakeIptablesManager{}
2636
ppConfig := proxyports.ProxyPortsConfig{
2737
ProxyPortrangeMin: 10000,
2838
ProxyPortrangeMax: 20000,
2939
RestoredProxyPortsAgeLimit: 0,
3040
}
3141
pp := proxyports.NewProxyPorts(hivetest.Logger(t), ppConfig, fakeIPTablesManager)
32-
p := createProxy(hivetest.Logger(t), nil, pp, nil, nil)
42+
p, err := createProxy(true, hivetest.Logger(t), nil, pp, nil, nil, nil, nil, drm)
43+
require.NoError(t, err)
3344

3445
p.proxyPorts.Trigger = job.NewTrigger(job.WithDebounce(10 * time.Second))
3546
return p

0 commit comments

Comments
 (0)