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  }