@@ -37,6 +37,7 @@ import (
3737 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/controllers/egressip"
3838 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/controllers/egressservice"
3939 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/linkmanager"
40+ "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/managementport"
4041 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/ovspinning"
4142 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/node/routemanager"
4243 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/controller/apbroute"
@@ -101,7 +102,9 @@ func NewCommonNodeNetworkControllerInfo(kubeClient clientset.Interface, apbExter
101102type DefaultNodeNetworkController struct {
102103 BaseNodeNetworkController
103104
104- Gateway Gateway
105+ mgmtPortController managementport.Controller
106+ Gateway Gateway
107+
105108 // Node healthcheck server for cloud load balancers
106109 healthzServer * proxierHealthUpdater
107110 routeManager * routemanager.Controller
@@ -118,16 +121,10 @@ type DefaultNodeNetworkController struct {
118121
119122 cniServer * cni.Server
120123
121- gatewaySetup * preStartSetup
122-
123124 udnHostIsolationManager * UDNHostIsolationManager
124- }
125125
126- type preStartSetup struct {
127- mgmtPorts []* managementPortEntry
128- mgmtPortConfig * managementPortConfig
129- nodeAddress net.IP
130- sbZone string
126+ nodeAddress net.IP
127+ sbZone string
131128}
132129
133130func newDefaultNodeNetworkController (cnnci * CommonNodeNetworkControllerInfo , stopChan chan struct {},
@@ -207,9 +204,9 @@ func (oc *DefaultNodeNetworkController) Reconcile(netInfo util.NetInfo) error {
207204 return fmt .Errorf ("failed to reconcile gateway: %v" , err )
208205 }
209206 }
210- for _ , mgmtPort := range oc . gatewaySetup . mgmtPorts {
211- mgmtPort . SetDefaultPodNetworkAdvertised ( isPodNetworkAdvertisedAtNode )
212- mgmtPort .Reconcile ()
207+
208+ if oc . mgmtPortController != nil {
209+ oc . mgmtPortController .Reconcile ()
213210 }
214211 }
215212
@@ -223,10 +220,6 @@ func (oc *DefaultNodeNetworkController) Reconcile(netInfo util.NetInfo) error {
223220 return nil
224221}
225222
226- func (oc * DefaultNodeNetworkController ) isPodNetworkAdvertisedAtNode () bool {
227- return util .IsPodNetworkAdvertisedAtNode (oc , oc .name )
228- }
229-
230223func clearOVSFlowTargets () error {
231224 _ , _ , err := util .RunOVSVsctl (
232225 "--" ,
@@ -694,43 +687,25 @@ func getMgmtPortAndRepName(node *corev1.Node) (string, string, error) {
694687 }
695688}
696689
697- func createNodeManagementPorts (
690+ func createNodeManagementPortController (
698691 node * corev1.Node ,
699- nodeAnnotator kube.Annotator ,
700692 subnets []* net.IPNet ,
693+ nodeAnnotator kube.Annotator ,
701694 routeManager * routemanager.Controller ,
702- isRoutingAdvertised bool ,
703- ) ([] * managementPortEntry , * managementPortConfig , error ) {
695+ netInfo util. NetInfo ,
696+ ) (managementport. Controller , error ) {
704697 netdevName , rep , err := getMgmtPortAndRepName (node )
705698 if err != nil {
706- return nil , nil , err
699+ return nil , err
707700 }
708701
709702 if config .OvnKubeNode .Mode == types .NodeModeDPUHost {
710703 err := exportManagementPortAnnotation (netdevName , nodeAnnotator )
711704 if err != nil {
712- return nil , nil , err
705+ return nil , err
713706 }
714707 }
715- ports := NewManagementPorts (node .Name , subnets , netdevName , rep )
716-
717- var mgmtPortConfig * managementPortConfig
718- mgmtPorts := make ([]* managementPortEntry , 0 )
719- for _ , port := range ports {
720- config , err := port .Create (isRoutingAdvertised , routeManager , node )
721- if err != nil {
722- return nil , nil , err
723- }
724- mgmtPorts = append (mgmtPorts , NewManagementPortEntry (port , config , routeManager ))
725-
726- // Save this management port config for later usage.
727- // Since only one OVS internal port / Representor config may exist it is fine just to overwrite it
728- if _ , ok := port .(* managementPortNetdev ); ! ok {
729- mgmtPortConfig = config
730- }
731- }
732-
733- return mgmtPorts , mgmtPortConfig , nil
708+ return managementport .NewManagementPortController (node , subnets , netdevName , rep , routeManager , netInfo )
734709}
735710
736711// getOVNSBZone returns the zone name stored in the Southbound db.
@@ -813,8 +788,6 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
813788 var subnets []* net.IPNet
814789 var cniServer * cni.Server
815790
816- gatewaySetup := & preStartSetup {}
817-
818791 // Setting debug log level during node bring up to expose bring up process.
819792 // Log level is returned to configured value when bring up is complete.
820793 var level klog.Level
@@ -932,18 +905,17 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
932905 nodeAnnotator := kube .NewNodeAnnotator (nc .Kube , node .Name )
933906
934907 // Setup management ports
935- mgmtPorts , mgmtPortConfig , err := createNodeManagementPorts (
908+ nc . mgmtPortController , err = createNodeManagementPortController (
936909 node ,
937- nodeAnnotator ,
938910 subnets ,
911+ nodeAnnotator ,
939912 nc .routeManager ,
940- nc .isPodNetworkAdvertisedAtNode ())
913+ nc .GetNetInfo (),
914+ )
941915 if err != nil {
942916 return err
943917 }
944- gatewaySetup .mgmtPorts = mgmtPorts
945- gatewaySetup .mgmtPortConfig = mgmtPortConfig
946- gatewaySetup .nodeAddress = nodeAddr
918+ nc .nodeAddress = nodeAddr
947919
948920 if err := util .SetNodeZone (nodeAnnotator , sbZone ); err != nil {
949921 return fmt .Errorf ("failed to set node zone annotation for node %s: %w" , nc .name , err )
@@ -964,7 +936,7 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
964936 // First part of gateway initialization. It will be completed by (nc *DefaultNodeNetworkController) Start()
965937 if config .OvnKubeNode .Mode != types .NodeModeDPUHost {
966938 // Initialize gateway for OVS internal port or representor management port
967- gw , err := nc .initGatewayPreStart (subnets , nodeAnnotator , mgmtPortConfig , nodeAddr )
939+ gw , err := nc .initGatewayPreStart (subnets , nodeAnnotator , nc . mgmtPortController , nodeAddr )
968940 if err != nil {
969941 return err
970942 }
@@ -974,11 +946,9 @@ func (nc *DefaultNodeNetworkController) Init(ctx context.Context) error {
974946 if err := level .Set (strconv .Itoa (config .Logging .Level )); err != nil {
975947 klog .Errorf ("Reset of initial klog \" loglevel\" failed, err: %v" , err )
976948 }
977- gatewaySetup .sbZone = sbZone
978- nc .gatewaySetup = gatewaySetup
949+ nc .sbZone = sbZone
979950
980951 return nil
981-
982952}
983953
984954// Start learns the subnets assigned to it by the master controller
@@ -989,7 +959,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
989959 var err error
990960 var node * corev1.Node
991961
992- if nc .gatewaySetup == nil {
962+ if nc .mgmtPortController == nil {
993963 return fmt .Errorf ("default node network controller hasn't been pre-started" )
994964 }
995965
@@ -1029,7 +999,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
1029999
10301000 // Complete gateway initialization
10311001 if config .OvnKubeNode .Mode == types .NodeModeDPUHost {
1032- err = nc .initGatewayDPUHost (nc .gatewaySetup . nodeAddress )
1002+ err = nc .initGatewayDPUHost (nc .nodeAddress )
10331003 if err != nil {
10341004 return err
10351005 }
@@ -1073,7 +1043,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
10731043 // plumbing (takes 80ms based on what we saw in CI runs so we might still have that small window of disruption).
10741044 // NOTE: ovnkube-node in DPU host mode doesn't go through upgrades for OVN-IC and has no SBDB to connect to. Thus this part shall be skipped.
10751045 var syncNodes , syncServices , syncPods bool
1076- if config .OvnKubeNode .Mode != types .NodeModeDPUHost && config .OVNKubernetesFeature .EnableInterconnect && nc .gatewaySetup . sbZone != types .OvnDefaultZone && ! util .HasNodeMigratedZone (node ) {
1046+ if config .OvnKubeNode .Mode != types .NodeModeDPUHost && config .OVNKubernetesFeature .EnableInterconnect && nc .sbZone != types .OvnDefaultZone && ! util .HasNodeMigratedZone (node ) {
10771047 klog .Info ("Upgrade Hack: Interconnect is enabled" )
10781048 var err1 error
10791049 start := time .Now ()
@@ -1155,7 +1125,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
11551125 if err != nil {
11561126 return fmt .Errorf ("upgrade hack: failed while waiting for the remote ovnkube-controller to be ready: %v, %v" , err , err1 )
11571127 }
1158- if err := util .SetNodeZoneMigrated (nodeAnnotator , nc .gatewaySetup . sbZone ); err != nil {
1128+ if err := util .SetNodeZoneMigrated (nodeAnnotator , nc .sbZone ); err != nil {
11591129 return fmt .Errorf ("upgrade hack: failed to set node zone annotation for node %s: %w" , nc .name , err )
11601130 }
11611131 if err := nodeAnnotator .Run (); err != nil {
@@ -1231,14 +1201,15 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
12311201 klog .Errorf ("Reset of initial klog \" loglevel\" failed, err: %v" , err )
12321202 }
12331203
1234- // start management ports health check
1235- for _ , mgmtPort := range nc .gatewaySetup .mgmtPorts {
1236- mgmtPort .Start (nc .stopChan )
1237- if config .OVNKubernetesFeature .EnableEgressIP {
1238- // Start the health checking server used by egressip, if EgressIPNodeHealthCheckPort is specified
1239- if err := nc .startEgressIPHealthCheckingServer (mgmtPort ); err != nil {
1240- return err
1241- }
1204+ // start management port controller
1205+ err = nc .mgmtPortController .Start (nc .stopChan )
1206+ if err != nil {
1207+ return fmt .Errorf ("failed to start management port controller: %w" , err )
1208+ }
1209+ if config .OVNKubernetesFeature .EnableEgressIP {
1210+ // Start the health checking server used by egressip, if EgressIPNodeHealthCheckPort is specified
1211+ if err := nc .startEgressIPHealthCheckingServer (nc .mgmtPortController ); err != nil {
1212+ return err
12421213 }
12431214 }
12441215
@@ -1248,7 +1219,7 @@ func (nc *DefaultNodeNetworkController) Start(ctx context.Context) error {
12481219 // "k8s.ovn.org/external-gw-pod-ips". In that case, we need ovnkube-node to flush
12491220 // conntrack on every node. In multi-zone-interconnect case, we will handle the flushing
12501221 // directly on the ovnkube-controller code to avoid an extra namespace annotation
1251- if ! config .OVNKubernetesFeature .EnableInterconnect || nc .gatewaySetup . sbZone == types .OvnDefaultZone {
1222+ if ! config .OVNKubernetesFeature .EnableInterconnect || nc .sbZone == types .OvnDefaultZone {
12521223 err := nc .WatchNamespaces ()
12531224 if err != nil {
12541225 return fmt .Errorf ("failed to watch namespaces: %w" , err )
@@ -1336,34 +1307,25 @@ func (nc *DefaultNodeNetworkController) Stop() {
13361307 nc .wg .Wait ()
13371308}
13381309
1339- func (nc * DefaultNodeNetworkController ) startEgressIPHealthCheckingServer (mgmtPortEntry * managementPortEntry ) error {
1310+ func (nc * DefaultNodeNetworkController ) startEgressIPHealthCheckingServer (mgmtPort managementport. Interface ) error {
13401311 healthCheckPort := config .OVNKubernetesFeature .EgressIPNodeHealthCheckPort
13411312 if healthCheckPort == 0 {
13421313 klog .Infof ("Egress IP health check server skipped: no port specified" )
13431314 return nil
13441315 }
13451316
1346- var nodeMgmtIP net.IP
1347- var mgmtPortConfig * managementPortConfig = mgmtPortEntry .config
1348- // Not all management port interfaces can have IP addresses assignable to them.
1349- if mgmtPortEntry .port .HasIpAddr () {
1350- if mgmtPortConfig .ipv4 != nil {
1351- nodeMgmtIP = mgmtPortConfig .ipv4 .ifAddr .IP
1352- } else if mgmtPortConfig .ipv6 != nil {
1353- nodeMgmtIP = mgmtPortConfig .ipv6 .ifAddr .IP
1354- // Wait for IPv6 address to become usable.
1355- if err := ip .SettleAddresses (mgmtPortConfig .ifName , 10 ); err != nil {
1356- return fmt .Errorf ("failed to start Egress IP health checking server due to unsettled IPv6: %w on interface %s" , err , mgmtPortConfig .ifName )
1357- }
1358- } else {
1359- return fmt .Errorf ("unable to start Egress IP health checking server on interface %s: no mgmt ip" , mgmtPortConfig .ifName )
1360- }
1361- } else {
1362- klog .Infof ("Skipping interface %s as it does not have an IP address" , mgmtPortConfig .ifName )
1363- return nil
1317+ ifName := mgmtPort .GetInterfaceName ()
1318+ mgmtAddresses := mgmtPort .GetAddresses ()
1319+ if len (mgmtAddresses ) == 0 {
1320+ return fmt .Errorf ("unable to start Egress IP health checking server on interface %s: no mgmt ip" , ifName )
1321+ }
1322+
1323+ mgmtAddress := mgmtAddresses [0 ]
1324+ if err := ip .SettleAddresses (ifName , 10 ); err != nil {
1325+ return fmt .Errorf ("failed to start Egress IP health checking server due to unsettled IPv6: %w on interface %s" , err , ifName )
13641326 }
13651327
1366- healthServer , err := healthcheck .NewEgressIPHealthServer (nodeMgmtIP , healthCheckPort )
1328+ healthServer , err := healthcheck .NewEgressIPHealthServer (mgmtAddress . IP , healthCheckPort )
13671329 if err != nil {
13681330 return fmt .Errorf ("unable to allocate health checking server: %v" , err )
13691331 }
0 commit comments