github.com/cilium/cilium@v1.16.2/pkg/ipam/allocator/clusterpool/clusterpool.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package clusterpool 5 6 import ( 7 "context" 8 "fmt" 9 10 "github.com/sirupsen/logrus" 11 12 operatorOption "github.com/cilium/cilium/operator/option" 13 "github.com/cilium/cilium/pkg/ipam" 14 "github.com/cilium/cilium/pkg/ipam/allocator" 15 "github.com/cilium/cilium/pkg/ipam/allocator/clusterpool/cidralloc" 16 "github.com/cilium/cilium/pkg/ipam/allocator/podcidr" 17 ipamMetrics "github.com/cilium/cilium/pkg/ipam/metrics" 18 "github.com/cilium/cilium/pkg/logging" 19 "github.com/cilium/cilium/pkg/logging/logfields" 20 "github.com/cilium/cilium/pkg/metrics" 21 "github.com/cilium/cilium/pkg/option" 22 "github.com/cilium/cilium/pkg/trigger" 23 ) 24 25 var log = logging.DefaultLogger.WithField(logfields.LogSubsys, "ipam-allocator-clusterpool") 26 27 // AllocatorOperator is an implementation of IPAM allocator interface for Cilium 28 // IPAM. 29 type AllocatorOperator struct { 30 v4CIDRSet, v6CIDRSet []cidralloc.CIDRAllocator 31 } 32 33 // Init sets up Cilium allocator based on given options 34 func (a *AllocatorOperator) Init(ctx context.Context) error { 35 if option.Config.EnableIPv4 { 36 if len(operatorOption.Config.ClusterPoolIPv4CIDR) == 0 { 37 return fmt.Errorf("%s must be provided when using ClusterPool", operatorOption.ClusterPoolIPv4CIDR) 38 } 39 40 v4Allocators, err := cidralloc.NewCIDRSets(false, operatorOption.Config.ClusterPoolIPv4CIDR, operatorOption.Config.NodeCIDRMaskSizeIPv4) 41 if err != nil { 42 return fmt.Errorf("unable to initialize IPv4 allocator: %w", err) 43 } 44 a.v4CIDRSet = v4Allocators 45 } else if len(operatorOption.Config.ClusterPoolIPv4CIDR) != 0 { 46 return fmt.Errorf("%s must not be set if IPv4 is disabled", operatorOption.ClusterPoolIPv4CIDR) 47 } 48 49 if option.Config.EnableIPv6 { 50 if len(operatorOption.Config.ClusterPoolIPv6CIDR) == 0 { 51 return fmt.Errorf("%s must be provided when using ClusterPool", operatorOption.ClusterPoolIPv6CIDR) 52 } 53 54 v6Allocators, err := cidralloc.NewCIDRSets(true, operatorOption.Config.ClusterPoolIPv6CIDR, operatorOption.Config.NodeCIDRMaskSizeIPv6) 55 if err != nil { 56 return fmt.Errorf("unable to initialize IPv6 allocator: %w", err) 57 } 58 a.v6CIDRSet = v6Allocators 59 } else if len(operatorOption.Config.ClusterPoolIPv6CIDR) != 0 { 60 return fmt.Errorf("%s must not be set if IPv6 is disabled", operatorOption.ClusterPoolIPv6CIDR) 61 } 62 63 return nil 64 } 65 66 // Start kicks of Operator allocation. 67 func (a *AllocatorOperator) Start(ctx context.Context, updater ipam.CiliumNodeGetterUpdater) (allocator.NodeEventHandler, error) { 68 log.WithFields(logrus.Fields{ 69 logfields.IPv4CIDRs: operatorOption.Config.ClusterPoolIPv4CIDR, 70 logfields.IPv6CIDRs: operatorOption.Config.ClusterPoolIPv6CIDR, 71 }).Info("Starting ClusterPool IP allocator") 72 73 var ( 74 iMetrics trigger.MetricsObserver 75 ) 76 77 if operatorOption.Config.EnableMetrics { 78 iMetrics = ipamMetrics.NewTriggerMetrics(metrics.Namespace, "k8s_sync") 79 } else { 80 iMetrics = &ipamMetrics.NoOpMetricsObserver{} 81 } 82 83 nodeManager := podcidr.NewNodesPodCIDRManager(a.v4CIDRSet, a.v6CIDRSet, updater, iMetrics) 84 85 return nodeManager, nil 86 }