Skip to content

Commit 75fe04c

Browse files
authored
Merge pull request #5186 from kyrtapz/inter_udn_isolation
Drop trafffic between advertised UDN networks
2 parents a3d0a2b + b4b15ef commit 75fe04c

21 files changed

+317
-3217
lines changed

dist/images/Dockerfile.fedora

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ RUN git log -n 1
7575
# Stage to download OVN RPMs from koji #
7676
########################################
7777
FROM fedora:41 AS kojidownloader
78-
ARG ovnver=ovn-24.09.1-10.fc41
78+
ARG ovnver=ovn-24.09.2-71.fc41
7979

8080
USER root
8181

go-controller/pkg/controllermanager/controller_manager.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/containernetworking/cni/pkg/types"
1010

11+
"k8s.io/apimachinery/pkg/util/sets"
1112
"k8s.io/apimachinery/pkg/util/wait"
1213
clientset "k8s.io/client-go/kubernetes"
1314
"k8s.io/client-go/tools/record"
@@ -139,8 +140,12 @@ func (cm *ControllerManager) GetDefaultNetworkController() networkmanager.Reconc
139140

140141
func (cm *ControllerManager) CleanupStaleNetworks(validNetworks ...util.NetInfo) error {
141142
existingNetworksMap := map[string]string{}
143+
validNetworksSubnets := sets.New[string]()
142144
for _, network := range validNetworks {
143145
existingNetworksMap[network.GetNetworkName()] = network.TopologyType()
146+
for _, subnet := range network.Subnets() {
147+
validNetworksSubnets.Insert(subnet.CIDR.String())
148+
}
144149
}
145150

146151
// Get all the existing secondary networks and its logical entities
@@ -188,6 +193,29 @@ func (cm *ControllerManager) CleanupStaleNetworks(validNetworks ...util.NetInfo)
188193
klog.Errorf("Failed to delete stale OVN logical entities for network %s: %v", netName, err)
189194
}
190195
}
196+
197+
if util.IsRouteAdvertisementsEnabled() {
198+
// Remove stale subnets from the advertised networks address set used for isolation
199+
// NOTE: network reconciliation will take care of removing the subnets for existing networks that are no longer
200+
// advertised.
201+
addressSetFactory := addressset.NewOvnAddressSetFactory(cm.nbClient, config.IPv4Mode, config.IPv6Mode)
202+
advertisedSubnets, err := addressSetFactory.GetAddressSet(ovn.GetAdvertisedNetworkSubnetsAddressSetDBIDs())
203+
if err != nil {
204+
return fmt.Errorf("failed to get advertised subnets addresset %s: %w", ovn.GetAdvertisedNetworkSubnetsAddressSetDBIDs(), err)
205+
}
206+
v4AdvertisedSubnets, v6AdvertisedSubnets := advertisedSubnets.GetAddresses()
207+
var invalidSubnets []string
208+
for _, subnet := range append(v4AdvertisedSubnets, v6AdvertisedSubnets...) {
209+
if !validNetworksSubnets.Has(subnet) {
210+
klog.Infof("Cleanup stale advertised subnet: %q", subnet)
211+
invalidSubnets = append(invalidSubnets, subnet)
212+
}
213+
}
214+
215+
if err := advertisedSubnets.DeleteAddresses(invalidSubnets); err != nil {
216+
klog.Errorf("Failed to delete stale advertised subnets: %v", invalidSubnets)
217+
}
218+
}
191219
return nil
192220
}
193221

@@ -451,6 +479,11 @@ func (cm *ControllerManager) Start(ctx context.Context) error {
451479
return fmt.Errorf("failed to init default network controller: %v", err)
452480
}
453481

482+
if util.IsRouteAdvertisementsEnabled() {
483+
if err := cm.configureAdvertisedNetworkIsolation(); err != nil {
484+
return fmt.Errorf("failed to initialize advertised network isolation: %w", err)
485+
}
486+
}
454487
if cm.networkManager != nil {
455488
if err = cm.networkManager.Start(); err != nil {
456489
return fmt.Errorf("failed to start NAD Controller :%v", err)
@@ -495,3 +528,9 @@ func (cm *ControllerManager) Stop() {
495528
func (cm *ControllerManager) Reconcile(_ string, _, _ util.NetInfo) error {
496529
return nil
497530
}
531+
532+
func (cm *ControllerManager) configureAdvertisedNetworkIsolation() error {
533+
addressSetFactory := addressset.NewOvnAddressSetFactory(cm.nbClient, config.IPv4Mode, config.IPv6Mode)
534+
_, err := addressSetFactory.EnsureAddressSet(ovn.GetAdvertisedNetworkSubnetsAddressSetDBIDs())
535+
return err
536+
}

go-controller/pkg/libovsdb/ops/db_object_types.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const (
3636
NetpolNamespaceOwnerType ownerType = "NetpolNamespace"
3737
VirtualMachineOwnerType ownerType = "VirtualMachine"
3838
UDNEnabledServiceOwnerType ownerType = "UDNEnabledService"
39+
AdvertisedNetworkOwnerType ownerType = "AdvertisedNetwork"
3940
// NetworkPolicyPortIndexOwnerType is the old version of NetworkPolicyOwnerType, kept for sync only
4041
NetworkPolicyPortIndexOwnerType ownerType = "NetworkPolicyPortIndexOwnerType"
4142
// ClusterOwnerType means the object is cluster-scoped and doesn't belong to any k8s objects
@@ -151,6 +152,19 @@ var AddressSetNetworkQoS = newObjectIDsType(addressSet, NetworkQoSOwnerType, []E
151152
IPFamilyKey,
152153
})
153154

155+
var AddressSetAdvertisedNetwork = newObjectIDsType(addressSet, AdvertisedNetworkOwnerType, []ExternalIDKey{
156+
// cluster-wide address set name
157+
ObjectNameKey,
158+
IPFamilyKey,
159+
})
160+
161+
var ACLAdvertisedNetwork = newObjectIDsType(acl, AdvertisedNetworkOwnerType, []ExternalIDKey{
162+
// ACL name
163+
ObjectNameKey,
164+
// NetworkID
165+
NetworkKey,
166+
})
167+
154168
var ACLAdminNetworkPolicy = newObjectIDsType(acl, AdminNetworkPolicyOwnerType, []ExternalIDKey{
155169
// anp name
156170
ObjectNameKey,

go-controller/pkg/ovn/default_network_controller.go

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,8 @@ import (
3131
svccontroller "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/controller/services"
3232
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/controller/unidling"
3333
dnsnameresolver "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/dns_name_resolver"
34-
aclsyncer "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/external_ids_syncer/acl"
35-
addrsetsyncer "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/external_ids_syncer/address_set"
3634
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/external_ids_syncer/logical_router_policy"
3735
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/external_ids_syncer/nat"
38-
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/external_ids_syncer/port_group"
3936
lsm "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/logical_switch_manager"
4037
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/routeimport"
4138
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/topology"
@@ -296,35 +293,7 @@ func (oc *DefaultNetworkController) newRetryFramework(
296293
}
297294

298295
func (oc *DefaultNetworkController) syncDb() error {
299-
// sync address sets and ACLs, only required for network controller, since any old objects in the db without
300-
// Owner set are owned by the default network controller.
301-
// The order of syncs is important, since the next syncer may rely on the data updated by the previous one.
302-
addrSetSyncer := addrsetsyncer.NewAddressSetSyncer(oc.nbClient, oc.controllerName)
303-
err := addrSetSyncer.SyncAddressSets()
304-
if err != nil {
305-
return fmt.Errorf("failed to sync address sets on controller init: %v", err)
306-
}
307-
308-
existingNodes, err := oc.kube.GetNodes()
309-
if err != nil {
310-
return fmt.Errorf("failed to get existing nodes: %w", err)
311-
}
312-
aclSyncer := aclsyncer.NewACLSyncer(oc.nbClient, oc.controllerName)
313-
err = aclSyncer.SyncACLs(existingNodes)
314-
if err != nil {
315-
return fmt.Errorf("failed to sync acls on controller init: %v", err)
316-
}
317-
318-
// port groups should be synced only once across all controllers (as port groups were used by secondary network
319-
// controllers before dbIDs, but SyncPortGroups knows how to get this info from the old ExternalIDs, that is also
320-
// why it doesn't have controllerName as an argument).
321-
// Do it here since DefaultNetworkController is always created, and this sync has dependencies with the other syncs
322-
// in this function. It uses acl.ExternalIDs[libovsdbops.ObjectNameKey.String()] to fetch namespace name for a
323-
// referenced port group (thus, SyncACLs should be called before).
324-
portGroupSyncer := port_group.NewPortGroupSyncer(oc.nbClient)
325-
if err = portGroupSyncer.SyncPortGroups(); err != nil {
326-
return fmt.Errorf("failed to sync port groups on controller init: %v", err)
327-
}
296+
var err error
328297
// sync shared resources
329298
// pod selector address sets
330299
err = oc.cleanupPodSelectorAddressSets()

go-controller/pkg/ovn/external_ids_syncer/acl/acl_suite_test.go

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)