From e6f197a9916ccd04c57b25aba5b284b210ae5b01 Mon Sep 17 00:00:00 2001 From: Antonio Ojea Date: Sun, 12 Mar 2023 15:18:15 +0000 Subject: [PATCH] plumb new ipallocators in the apiserver plumb the new allocators from the control-plane instance to the registry_core Change-Id: I240cc91942260f725492597f1b599f7480560b1e --- pkg/controlplane/instance.go | 1 + pkg/controlplane/instance_test.go | 1 + pkg/registry/core/rest/storage_core.go | 74 ++++++++++++++++++-------- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/pkg/controlplane/instance.go b/pkg/controlplane/instance.go index bfe7a58b79f..540f416a5ca 100644 --- a/pkg/controlplane/instance.go +++ b/pkg/controlplane/instance.go @@ -590,6 +590,7 @@ func (m *Instance) InstallLegacyAPI(c *completedConfig, restOptionsGetter generi ExtendExpiration: c.ExtraConfig.ExtendExpiration, ServiceAccountMaxExpiration: c.ExtraConfig.ServiceAccountMaxExpiration, APIAudiences: c.GenericConfig.Authentication.APIAudiences, + Informers: c.ExtraConfig.VersionedInformers, } legacyRESTStorage, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(c.ExtraConfig.APIResourceConfigSource, restOptionsGetter) if err != nil { diff --git a/pkg/controlplane/instance_test.go b/pkg/controlplane/instance_test.go index 3f8c3438f47..6dde15934e5 100644 --- a/pkg/controlplane/instance_test.go +++ b/pkg/controlplane/instance_test.go @@ -154,6 +154,7 @@ func TestLegacyRestStorageStrategies(t *testing.T) { ServiceIPRange: apiserverCfg.ExtraConfig.ServiceIPRange, ServiceNodePortRange: apiserverCfg.ExtraConfig.ServiceNodePortRange, LoopbackClientConfig: apiserverCfg.GenericConfig.LoopbackClientConfig, + Informers: apiserverCfg.ExtraConfig.VersionedInformers, } _, apiGroupInfo, err := storageProvider.NewLegacyRESTStorage(serverstorage.NewResourceConfig(), apiserverCfg.GenericConfig.RESTOptionsGetter) diff --git a/pkg/registry/core/rest/storage_core.go b/pkg/registry/core/rest/storage_core.go index 36c73114a1e..dca42573995 100644 --- a/pkg/registry/core/rest/storage_core.go +++ b/pkg/registry/core/rest/storage_core.go @@ -36,11 +36,15 @@ import ( genericapiserver "k8s.io/apiserver/pkg/server" serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/etcd3" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/client-go/informers" + networkingv1alpha1client "k8s.io/client-go/kubernetes/typed/networking/v1alpha1" policyclient "k8s.io/client-go/kubernetes/typed/policy/v1" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/cluster/ports" + "k8s.io/kubernetes/pkg/features" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/registry/core/componentstatus" configmapstore "k8s.io/kubernetes/pkg/registry/core/configmap/storage" @@ -90,6 +94,7 @@ type LegacyRESTStorageProvider struct { APIAudiences authenticator.Audiences LoopbackClientConfig *restclient.Config + Informers informers.SharedInformerFactory } // LegacyRESTStorage returns stateful information about particular instances of REST storage to @@ -196,41 +201,64 @@ func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(apiResourceConfigSource if err != nil { return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, err } + var serviceClusterIPAllocator, secondaryServiceClusterIPAllocator ipallocator.Interface - serviceClusterIPAllocator, err := ipallocator.New(&serviceClusterIPRange, func(max int, rangeSpec string, offset int) (allocator.Interface, error) { - var mem allocator.Snapshottable - mem = allocator.NewAllocationMapWithOffset(max, rangeSpec, offset) - // TODO etcdallocator package to return a storage interface via the storageFactory - etcd, err := serviceallocator.NewEtcd(mem, "/ranges/serviceips", serviceStorageConfig.ForResource(api.Resource("serviceipallocations"))) + if !utilfeature.DefaultFeatureGate.Enabled(features.MultiCIDRServiceAllocator) { + serviceClusterIPAllocator, err = ipallocator.New(&serviceClusterIPRange, func(max int, rangeSpec string, offset int) (allocator.Interface, error) { + var mem allocator.Snapshottable + mem = allocator.NewAllocationMapWithOffset(max, rangeSpec, offset) + // TODO etcdallocator package to return a storage interface via the storageFactory + etcd, err := serviceallocator.NewEtcd(mem, "/ranges/serviceips", serviceStorageConfig.ForResource(api.Resource("serviceipallocations"))) + if err != nil { + return nil, err + } + serviceClusterIPRegistry = etcd + return etcd, nil + }) if err != nil { - return nil, err + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster IP allocator: %v", err) + } + } else { + networkingv1alphaClient, err := networkingv1alpha1client.NewForConfig(c.LoopbackClientConfig) + if err != nil { + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, err + } + serviceClusterIPAllocator, err = ipallocator.NewIPAllocator(&serviceClusterIPRange, networkingv1alphaClient, c.Informers.Networking().V1alpha1().IPAddresses()) + if err != nil { + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster IP allocator: %v", err) } - serviceClusterIPRegistry = etcd - return etcd, nil - }) - if err != nil { - return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster IP allocator: %v", err) } + serviceClusterIPAllocator.EnableMetrics() restStorage.ServiceClusterIPAllocator = serviceClusterIPRegistry // allocator for secondary service ip range - var secondaryServiceClusterIPAllocator ipallocator.Interface if c.SecondaryServiceIPRange.IP != nil { var secondaryServiceClusterIPRegistry rangeallocation.RangeRegistry - secondaryServiceClusterIPAllocator, err = ipallocator.New(&c.SecondaryServiceIPRange, func(max int, rangeSpec string, offset int) (allocator.Interface, error) { - var mem allocator.Snapshottable - mem = allocator.NewAllocationMapWithOffset(max, rangeSpec, offset) - // TODO etcdallocator package to return a storage interface via the storageFactory - etcd, err := serviceallocator.NewEtcd(mem, "/ranges/secondaryserviceips", serviceStorageConfig.ForResource(api.Resource("serviceipallocations"))) + if !utilfeature.DefaultFeatureGate.Enabled(features.MultiCIDRServiceAllocator) { + secondaryServiceClusterIPAllocator, err = ipallocator.New(&c.SecondaryServiceIPRange, func(max int, rangeSpec string, offset int) (allocator.Interface, error) { + var mem allocator.Snapshottable + mem = allocator.NewAllocationMapWithOffset(max, rangeSpec, offset) + // TODO etcdallocator package to return a storage interface via the storageFactory + etcd, err := serviceallocator.NewEtcd(mem, "/ranges/secondaryserviceips", serviceStorageConfig.ForResource(api.Resource("serviceipallocations"))) + if err != nil { + return nil, err + } + secondaryServiceClusterIPRegistry = etcd + return etcd, nil + }) if err != nil { - return nil, err + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err) + } + } else { + networkingv1alphaClient, err := networkingv1alpha1client.NewForConfig(c.LoopbackClientConfig) + if err != nil { + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, err + } + secondaryServiceClusterIPAllocator, err = ipallocator.NewIPAllocator(&c.SecondaryServiceIPRange, networkingv1alphaClient, c.Informers.Networking().V1alpha1().IPAddresses()) + if err != nil { + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err) } - secondaryServiceClusterIPRegistry = etcd - return etcd, nil - }) - if err != nil { - return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err) } secondaryServiceClusterIPAllocator.EnableMetrics() restStorage.SecondaryServiceClusterIPAllocator = secondaryServiceClusterIPRegistry