@@ -71,8 +71,9 @@ const (
71
71
svcSchedFlagsAnnotation = "kube-router.io/service.schedflags"
72
72
73
73
// All IPSET names need to be less than 31 characters in order for the Kernel to accept them. Keep in mind that the
74
- // actual formulation for this may be inet6:<setNameBase> depending on ip family so that means that these base names
75
- // actually need to be less than 25 characters
74
+ // actual formulation for this may be inet6:<setNameBase> depending on ip family, plus when we change ipsets we use
75
+ // a swap operation that adds a hyphen to the end, so that means that these base names actually need to be less than
76
+ // 24 characters
76
77
localIPsIPSetName = "kube-router-local-ips"
77
78
serviceIPPortsSetName = "kube-router-svip-prt"
78
79
serviceIPsIPSetName = "kube-router-svip"
@@ -120,11 +121,6 @@ type NetworkServicesController struct {
120
121
ipsetMutex * sync.Mutex
121
122
fwMarkMap map [uint32 ]string
122
123
123
- // Map of ipsets that we use.
124
- localIPsIPSets map [v1.IPFamily ]* utils.Set
125
- serviceIPPortsIPSet map [v1.IPFamily ]* utils.Set
126
- serviceIPsIPSet map [v1.IPFamily ]* utils.Set
127
-
128
124
svcLister cache.Indexer
129
125
epSliceLister cache.Indexer
130
126
podLister cache.Indexer
@@ -399,34 +395,27 @@ func (nsc *NetworkServicesController) setupIpvsFirewall() error {
399
395
- create ipsets
400
396
- create firewall rules
401
397
*/
402
-
403
398
var err error
404
- var ipset * utils.Set
405
399
406
- // Remember ipsets for use in syncIpvsFirewall
407
- nsc .localIPsIPSets = make (map [v1.IPFamily ]* utils.Set )
408
- nsc .serviceIPPortsIPSet = make (map [v1.IPFamily ]* utils.Set )
409
- nsc .serviceIPsIPSet = make (map [v1.IPFamily ]* utils.Set )
410
- for family , ipSetHandler := range nsc .ipSetHandlers {
400
+ // Initialize some blank ipsets with the correct names in order to use them in the iptables below. We don't need
401
+ // to retain references to them, because we'll use the handler to refresh them later in syncIpvsFirewall
402
+ for _ , ipSetHandler := range nsc .ipSetHandlers {
411
403
// Create ipset for local addresses.
412
- ipset , err = ipSetHandler .Create (localIPsIPSetName , utils .TypeHashIP , utils .OptionTimeout , "0" )
404
+ _ , err = ipSetHandler .Create (localIPsIPSetName , utils .TypeHashIP , utils .OptionTimeout , "0" )
413
405
if err != nil {
414
406
return fmt .Errorf ("failed to create ipset: %s - %v" , localIPsIPSetName , err )
415
407
}
416
- nsc .localIPsIPSets [family ] = ipset
417
408
418
409
// Create 2 ipsets for services. One for 'ip' and one for 'ip,port'
419
- ipset , err = ipSetHandler .Create (serviceIPsIPSetName , utils .TypeHashIP , utils .OptionTimeout , "0" )
410
+ _ , err = ipSetHandler .Create (serviceIPsIPSetName , utils .TypeHashIP , utils .OptionTimeout , "0" )
420
411
if err != nil {
421
412
return fmt .Errorf ("failed to create ipset: %s - %v" , serviceIPsIPSetName , err )
422
413
}
423
- nsc .serviceIPsIPSet [family ] = ipset
424
414
425
- ipset , err = ipSetHandler .Create (serviceIPPortsSetName , utils .TypeHashIPPort , utils .OptionTimeout , "0" )
415
+ _ , err = ipSetHandler .Create (serviceIPPortsSetName , utils .TypeHashIPPort , utils .OptionTimeout , "0" )
426
416
if err != nil {
427
417
return fmt .Errorf ("failed to create ipset: %s - %v" , serviceIPPortsSetName , err )
428
418
}
429
- nsc .serviceIPPortsIPSet [family ] = ipset
430
419
}
431
420
432
421
// Setup a custom iptables chain to explicitly allow input traffic to ipvs services only.
@@ -612,16 +601,13 @@ func (nsc *NetworkServicesController) syncIpvsFirewall() error {
612
601
613
602
for family , addrs := range addrsMap {
614
603
// Convert addrs from a slice of net.IP to a slice of string
615
- localIPsSets := make ([]string , 0 , len (addrs ))
604
+ localIPsSets := make ([][] string , 0 , len (addrs ))
616
605
for _ , addr := range addrs {
617
- localIPsSets = append (localIPsSets , addr .String ())
606
+ localIPsSets = append (localIPsSets , [] string { addr .String (), utils . OptionTimeout , "0" } )
618
607
}
619
608
620
609
// Refresh the family specific IPSet with the slice of strings
621
- err = nsc .localIPsIPSets [family ].Refresh (localIPsSets )
622
- if err != nil {
623
- return fmt .Errorf ("failed to sync ipset: %s" , err .Error ())
624
- }
610
+ nsc .ipSetHandlers [family ].RefreshSet (localIPsIPSetName , localIPsSets , utils .TypeHashIP )
625
611
}
626
612
627
613
// Populate service ipsets.
@@ -630,8 +616,8 @@ func (nsc *NetworkServicesController) syncIpvsFirewall() error {
630
616
return errors .New ("Failed to list IPVS services: " + err .Error ())
631
617
}
632
618
633
- serviceIPsSets := make (map [v1.IPFamily ][]string )
634
- serviceIPPortsIPSets := make (map [v1.IPFamily ][]string )
619
+ serviceIPsSets := make (map [v1.IPFamily ][][] string )
620
+ serviceIPPortsIPSets := make (map [v1.IPFamily ][][] string )
635
621
636
622
for _ , ipvsService := range ipvsServices {
637
623
var address net.IP
@@ -667,24 +653,22 @@ func (nsc *NetworkServicesController) syncIpvsFirewall() error {
667
653
family = v1 .IPv6Protocol
668
654
}
669
655
670
- serviceIPsSets [family ] = append (serviceIPsSets [family ], address .String ())
656
+ serviceIPsSets [family ] = append (serviceIPsSets [family ], [] string { address .String (), utils . OptionTimeout , "0" } )
671
657
672
658
ipvsAddressWithPort := fmt .Sprintf ("%s,%s:%d" , address , protocol , port )
673
- serviceIPPortsIPSets [family ] = append (serviceIPPortsIPSets [family ], ipvsAddressWithPort )
659
+ serviceIPPortsIPSets [family ] = append (serviceIPPortsIPSets [family ],
660
+ []string {ipvsAddressWithPort , utils .OptionTimeout , "0" })
674
661
675
662
}
676
663
677
- for family := range nsc .ipSetHandlers {
678
- serviceIPsIPSet := nsc .serviceIPsIPSet [family ]
679
- err = serviceIPsIPSet .Refresh (serviceIPsSets [family ])
680
- if err != nil {
681
- return fmt .Errorf ("failed to sync ipset: %v" , err )
682
- }
664
+ for family , setHandler := range nsc .ipSetHandlers {
665
+ setHandler .RefreshSet (serviceIPsIPSetName , serviceIPsSets [family ], utils .TypeHashIP )
666
+
667
+ setHandler .RefreshSet (serviceIPPortsSetName , serviceIPPortsIPSets [family ], utils .TypeHashIPPort )
683
668
684
- serviceIPPortsIPSet := nsc .serviceIPPortsIPSet [family ]
685
- err = serviceIPPortsIPSet .Refresh (serviceIPPortsIPSets [family ])
669
+ err := setHandler .Restore ()
686
670
if err != nil {
687
- return fmt .Errorf ("failed to sync ipset: %v" , err )
671
+ return fmt .Errorf ("could not save ipset for service firewall : %v" , err )
688
672
}
689
673
}
690
674
0 commit comments