mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-07 11:13:48 +00:00
SPLIT: kube-apiserver/corerest: split out service IP setup logic
This commit is contained in:
parent
dad3e4d211
commit
68aee61d4f
@ -591,7 +591,7 @@ func (m *Instance) InstallLegacyAPI(c *completedConfig, restOptionsGetter generi
|
|||||||
SecondaryServiceIPRange: c.ExtraConfig.SecondaryServiceIPRange,
|
SecondaryServiceIPRange: c.ExtraConfig.SecondaryServiceIPRange,
|
||||||
ServiceNodePortRange: c.ExtraConfig.ServiceNodePortRange,
|
ServiceNodePortRange: c.ExtraConfig.ServiceNodePortRange,
|
||||||
}
|
}
|
||||||
legacyRESTStorage, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(c.ExtraConfig.APIResourceConfigSource, restOptionsGetter)
|
rangeRegistries, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(c.ExtraConfig.APIResourceConfigSource, restOptionsGetter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error building core storage: %v", err)
|
return fmt.Errorf("error building core storage: %v", err)
|
||||||
}
|
}
|
||||||
@ -612,7 +612,7 @@ func (m *Instance) InstallLegacyAPI(c *completedConfig, restOptionsGetter generi
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
bootstrapController, err := kubernetesservice.New(*kubenetesserviceConfig, legacyRESTStorage)
|
bootstrapController, err := kubernetesservice.New(*kubenetesserviceConfig, rangeRegistries)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating bootstrap controller: %v", err)
|
return fmt.Errorf("error creating bootstrap controller: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,6 @@ import (
|
|||||||
pvcstore "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage"
|
pvcstore "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage"
|
||||||
podstore "k8s.io/kubernetes/pkg/registry/core/pod/storage"
|
podstore "k8s.io/kubernetes/pkg/registry/core/pod/storage"
|
||||||
podtemplatestore "k8s.io/kubernetes/pkg/registry/core/podtemplate/storage"
|
podtemplatestore "k8s.io/kubernetes/pkg/registry/core/podtemplate/storage"
|
||||||
"k8s.io/kubernetes/pkg/registry/core/rangeallocation"
|
|
||||||
controllerstore "k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage"
|
controllerstore "k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage"
|
||||||
resourcequotastore "k8s.io/kubernetes/pkg/registry/core/resourcequota/storage"
|
resourcequotastore "k8s.io/kubernetes/pkg/registry/core/resourcequota/storage"
|
||||||
secretstore "k8s.io/kubernetes/pkg/registry/core/secret/storage"
|
secretstore "k8s.io/kubernetes/pkg/registry/core/secret/storage"
|
||||||
@ -231,109 +230,14 @@ func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(apiResourceConfigSource
|
|||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, err
|
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var rangeRegistries kubernetesservice.RangeRegistries
|
rangeRegistries, primaryServiceClusterIPAllocator, serviceClusterIPAllocators, serviceNodePortAllocator, err := c.newServiceIPAllocators()
|
||||||
|
|
||||||
var serviceClusterIPRegistry rangeallocation.RangeRegistry
|
|
||||||
serviceClusterIPRange := c.ServiceIPRange
|
|
||||||
if serviceClusterIPRange.IP == nil {
|
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("service clusterIPRange is missing")
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceStorageConfig, err := c.StorageFactory.NewConfig(api.Resource("services"))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, err
|
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, err
|
||||||
}
|
}
|
||||||
var serviceClusterIPAllocator, secondaryServiceClusterIPAllocator ipallocator.Interface
|
|
||||||
|
|
||||||
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 kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster IP allocator: %v", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
networkingv1alphaClient, err := networkingv1alpha1client.NewForConfig(c.LoopbackClientConfig)
|
|
||||||
if err != nil {
|
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, err
|
|
||||||
}
|
|
||||||
serviceClusterIPAllocator, err = ipallocator.NewIPAllocator(&serviceClusterIPRange, networkingv1alphaClient, c.Informers.Networking().V1alpha1().IPAddresses())
|
|
||||||
if err != nil {
|
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster IP allocator: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceClusterIPAllocator.EnableMetrics()
|
|
||||||
rangeRegistries.ServiceClusterIPRegistry = serviceClusterIPRegistry
|
|
||||||
|
|
||||||
// allocator for secondary service ip range
|
|
||||||
if c.SecondaryServiceIPRange.IP != nil {
|
|
||||||
var secondaryServiceClusterIPRegistry rangeallocation.RangeRegistry
|
|
||||||
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 kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
networkingv1alphaClient, err := networkingv1alpha1client.NewForConfig(c.LoopbackClientConfig)
|
|
||||||
if err != nil {
|
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, err
|
|
||||||
}
|
|
||||||
secondaryServiceClusterIPAllocator, err = ipallocator.NewIPAllocator(&c.SecondaryServiceIPRange, networkingv1alphaClient, c.Informers.Networking().V1alpha1().IPAddresses())
|
|
||||||
if err != nil {
|
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
secondaryServiceClusterIPAllocator.EnableMetrics()
|
|
||||||
rangeRegistries.SecondaryServiceClusterIPRegistry = secondaryServiceClusterIPRegistry
|
|
||||||
}
|
|
||||||
|
|
||||||
var serviceNodePortRegistry rangeallocation.RangeRegistry
|
|
||||||
serviceNodePortAllocator, err := portallocator.New(c.ServiceNodePortRange, func(max int, rangeSpec string, offset int) (allocator.Interface, error) {
|
|
||||||
mem := allocator.NewAllocationMapWithOffset(max, rangeSpec, offset)
|
|
||||||
// TODO etcdallocator package to return a storage interface via the storageFactory
|
|
||||||
etcd, err := serviceallocator.NewEtcd(mem, "/ranges/servicenodeports", serviceStorageConfig.ForResource(api.Resource("servicenodeportallocations")))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
serviceNodePortRegistry = etcd
|
|
||||||
return etcd, nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return kubernetesservice.RangeRegistries{}, genericapiserver.APIGroupInfo{}, fmt.Errorf("cannot create cluster port allocator: %v", err)
|
|
||||||
}
|
|
||||||
serviceNodePortAllocator.EnableMetrics()
|
|
||||||
rangeRegistries.ServiceNodePortRegistry = serviceNodePortRegistry
|
|
||||||
|
|
||||||
serviceIPAllocators := map[api.IPFamily]ipallocator.Interface{
|
|
||||||
serviceClusterIPAllocator.IPFamily(): serviceClusterIPAllocator,
|
|
||||||
}
|
|
||||||
if secondaryServiceClusterIPAllocator != nil {
|
|
||||||
serviceIPAllocators[secondaryServiceClusterIPAllocator.IPFamily()] = secondaryServiceClusterIPAllocator
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceRESTStorage, serviceStatusStorage, serviceRESTProxy, err := servicestore.NewREST(
|
serviceRESTStorage, serviceStatusStorage, serviceRESTProxy, err := servicestore.NewREST(
|
||||||
restOptionsGetter,
|
restOptionsGetter,
|
||||||
serviceClusterIPAllocator.IPFamily(),
|
primaryServiceClusterIPAllocator.IPFamily(),
|
||||||
serviceIPAllocators,
|
serviceClusterIPAllocators,
|
||||||
serviceNodePortAllocator,
|
serviceNodePortAllocator,
|
||||||
endpointsStorage,
|
endpointsStorage,
|
||||||
podStorage.Pod,
|
podStorage.Pod,
|
||||||
@ -446,6 +350,97 @@ func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(apiResourceConfigSource
|
|||||||
return rangeRegistries, apiGroupInfo, nil
|
return rangeRegistries, apiGroupInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c LegacyRESTStorageProvider) newServiceIPAllocators() (registries kubernetesservice.RangeRegistries, primaryClusterIPAllocator ipallocator.Interface, clusterIPAllocators map[api.IPFamily]ipallocator.Interface, nodePortAllocator *portallocator.PortAllocator, err error) {
|
||||||
|
clusterIPAllocators = map[api.IPFamily]ipallocator.Interface{}
|
||||||
|
|
||||||
|
serviceStorageConfig, err := c.StorageFactory.NewConfig(api.Resource("services"))
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
serviceClusterIPRange := c.ServiceIPRange
|
||||||
|
if serviceClusterIPRange.IP == nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, fmt.Errorf("service clusterIPRange is missing")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !utilfeature.DefaultFeatureGate.Enabled(features.MultiCIDRServiceAllocator) {
|
||||||
|
primaryClusterIPAllocator, 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
|
||||||
|
}
|
||||||
|
registries.ServiceClusterIPRegistry = etcd
|
||||||
|
return etcd, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, fmt.Errorf("cannot create cluster IP allocator: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
networkingv1alphaClient, err := networkingv1alpha1client.NewForConfig(c.LoopbackClientConfig)
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, err
|
||||||
|
}
|
||||||
|
primaryClusterIPAllocator, err = ipallocator.NewIPAllocator(&serviceClusterIPRange, networkingv1alphaClient, c.Informers.Networking().V1alpha1().IPAddresses())
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, fmt.Errorf("cannot create cluster IP allocator: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
primaryClusterIPAllocator.EnableMetrics()
|
||||||
|
clusterIPAllocators[primaryClusterIPAllocator.IPFamily()] = primaryClusterIPAllocator
|
||||||
|
|
||||||
|
var secondaryClusterIPAllocator ipallocator.Interface
|
||||||
|
if c.SecondaryServiceIPRange.IP != nil {
|
||||||
|
if !utilfeature.DefaultFeatureGate.Enabled(features.MultiCIDRServiceAllocator) {
|
||||||
|
var err error
|
||||||
|
secondaryClusterIPAllocator, 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
|
||||||
|
}
|
||||||
|
registries.SecondaryServiceClusterIPRegistry = etcd
|
||||||
|
return etcd, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
networkingv1alphaClient, err := networkingv1alpha1client.NewForConfig(c.LoopbackClientConfig)
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, err
|
||||||
|
}
|
||||||
|
secondaryClusterIPAllocator, err = ipallocator.NewIPAllocator(&c.SecondaryServiceIPRange, networkingv1alphaClient, c.Informers.Networking().V1alpha1().IPAddresses())
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, fmt.Errorf("cannot create cluster secondary IP allocator: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
secondaryClusterIPAllocator.EnableMetrics()
|
||||||
|
clusterIPAllocators[secondaryClusterIPAllocator.IPFamily()] = secondaryClusterIPAllocator
|
||||||
|
}
|
||||||
|
|
||||||
|
nodePortAllocator, err = portallocator.New(c.ServiceNodePortRange, func(max int, rangeSpec string, offset int) (allocator.Interface, error) {
|
||||||
|
mem := allocator.NewAllocationMapWithOffset(max, rangeSpec, offset)
|
||||||
|
// TODO etcdallocator package to return a storage interface via the storageFactory
|
||||||
|
etcd, err := serviceallocator.NewEtcd(mem, "/ranges/servicenodeports", serviceStorageConfig.ForResource(api.Resource("servicenodeportallocations")))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
registries.ServiceNodePortRegistry = etcd
|
||||||
|
return etcd, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return kubernetesservice.RangeRegistries{}, nil, nil, nil, fmt.Errorf("cannot create cluster port allocator: %v", err)
|
||||||
|
}
|
||||||
|
nodePortAllocator.EnableMetrics()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (p LegacyRESTStorageProvider) GroupName() string {
|
func (p LegacyRESTStorageProvider) GroupName() string {
|
||||||
return api.GroupName
|
return api.GroupName
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user