mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-07 11:13:48 +00:00
Drop AvailableResources from controller context
This commit is contained in:
parent
99190634ab
commit
b6ae858e01
@ -22,7 +22,6 @@ package app
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
"k8s.io/apiserver/pkg/util/feature"
|
"k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
"k8s.io/client-go/scale"
|
"k8s.io/client-go/scale"
|
||||||
@ -37,10 +36,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func startHPAController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
|
func startHPAController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
|
||||||
if !controllerContext.AvailableResources[schema.GroupVersionResource{Group: "autoscaling", Version: "v1", Resource: "horizontalpodautoscalers"}] {
|
|
||||||
return nil, false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return startHPAControllerWithRESTClient(ctx, controllerContext)
|
return startHPAControllerWithRESTClient(ctx, controllerContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,6 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/uuid"
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
@ -355,9 +354,6 @@ type ControllerContext struct {
|
|||||||
// requested.
|
// requested.
|
||||||
RESTMapper *restmapper.DeferredDiscoveryRESTMapper
|
RESTMapper *restmapper.DeferredDiscoveryRESTMapper
|
||||||
|
|
||||||
// AvailableResources is a map listing currently available resources
|
|
||||||
AvailableResources map[schema.GroupVersionResource]bool
|
|
||||||
|
|
||||||
// Cloud is the cloud provider interface for the controllers to use.
|
// Cloud is the cloud provider interface for the controllers to use.
|
||||||
// It must be initialized and ready to use.
|
// It must be initialized and ready to use.
|
||||||
Cloud cloudprovider.Interface
|
Cloud cloudprovider.Interface
|
||||||
@ -491,35 +487,6 @@ func NewControllerInitializers(loopMode ControllerLoopMode) map[string]InitFunc
|
|||||||
return controllers
|
return controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAvailableResources gets the map which contains all available resources of the apiserver
|
|
||||||
// TODO: In general, any controller checking this needs to be dynamic so
|
|
||||||
// users don't have to restart their controller manager if they change the apiserver.
|
|
||||||
// Until we get there, the structure here needs to be exposed for the construction of a proper ControllerContext.
|
|
||||||
func GetAvailableResources(clientBuilder clientbuilder.ControllerClientBuilder) (map[schema.GroupVersionResource]bool, error) {
|
|
||||||
client := clientBuilder.ClientOrDie("controller-discovery")
|
|
||||||
discoveryClient := client.Discovery()
|
|
||||||
_, resourceMap, err := discoveryClient.ServerGroupsAndResources()
|
|
||||||
if err != nil {
|
|
||||||
utilruntime.HandleError(fmt.Errorf("unable to get all supported resources from server: %v", err))
|
|
||||||
}
|
|
||||||
if len(resourceMap) == 0 {
|
|
||||||
return nil, fmt.Errorf("unable to get any supported resources from server")
|
|
||||||
}
|
|
||||||
|
|
||||||
allResources := map[schema.GroupVersionResource]bool{}
|
|
||||||
for _, apiResourceList := range resourceMap {
|
|
||||||
version, err := schema.ParseGroupVersion(apiResourceList.GroupVersion)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, apiResource := range apiResourceList.APIResources {
|
|
||||||
allResources[version.WithResource(apiResource.Name)] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return allResources, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateControllerContext creates a context struct containing references to resources needed by the
|
// CreateControllerContext creates a context struct containing references to resources needed by the
|
||||||
// controllers such as the cloud provider and clientBuilder. rootClientBuilder is only used for
|
// controllers such as the cloud provider and clientBuilder. rootClientBuilder is only used for
|
||||||
// the shared-informers client and token controller.
|
// the shared-informers client and token controller.
|
||||||
@ -544,11 +511,6 @@ func CreateControllerContext(logger klog.Logger, s *config.CompletedConfig, root
|
|||||||
restMapper.Reset()
|
restMapper.Reset()
|
||||||
}, 30*time.Second, stop)
|
}, 30*time.Second, stop)
|
||||||
|
|
||||||
availableResources, err := GetAvailableResources(rootClientBuilder)
|
|
||||||
if err != nil {
|
|
||||||
return ControllerContext{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
cloud, loopMode, err := createCloudProvider(logger, s.ComponentConfig.KubeCloudShared.CloudProvider.Name, s.ComponentConfig.KubeCloudShared.ExternalCloudVolumePlugin,
|
cloud, loopMode, err := createCloudProvider(logger, s.ComponentConfig.KubeCloudShared.CloudProvider.Name, s.ComponentConfig.KubeCloudShared.ExternalCloudVolumePlugin,
|
||||||
s.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile, s.ComponentConfig.KubeCloudShared.AllowUntaggedCloud, sharedInformers)
|
s.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile, s.ComponentConfig.KubeCloudShared.AllowUntaggedCloud, sharedInformers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -561,7 +523,6 @@ func CreateControllerContext(logger klog.Logger, s *config.CompletedConfig, root
|
|||||||
ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers),
|
ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers),
|
||||||
ComponentConfig: s.ComponentConfig,
|
ComponentConfig: s.ComponentConfig,
|
||||||
RESTMapper: restMapper,
|
RESTMapper: restMapper,
|
||||||
AvailableResources: availableResources,
|
|
||||||
Cloud: cloud,
|
Cloud: cloud,
|
||||||
LoopMode: loopMode,
|
LoopMode: loopMode,
|
||||||
InformersStarted: make(chan struct{}),
|
InformersStarted: make(chan struct{}),
|
||||||
|
@ -19,15 +19,11 @@ package app
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
"k8s.io/controller-manager/controller"
|
"k8s.io/controller-manager/controller"
|
||||||
"k8s.io/kubernetes/pkg/controller/clusterroleaggregation"
|
"k8s.io/kubernetes/pkg/controller/clusterroleaggregation"
|
||||||
)
|
)
|
||||||
|
|
||||||
func startClusterRoleAggregrationController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
|
func startClusterRoleAggregrationController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
|
||||||
if !controllerContext.AvailableResources[schema.GroupVersionResource{Group: "rbac.authorization.k8s.io", Version: "v1", Resource: "clusterroles"}] {
|
|
||||||
return nil, false, nil
|
|
||||||
}
|
|
||||||
go clusterroleaggregation.NewClusterRoleAggregation(
|
go clusterroleaggregation.NewClusterRoleAggregation(
|
||||||
controllerContext.InformerFactory.Rbac().V1().ClusterRoles(),
|
controllerContext.InformerFactory.Rbac().V1().ClusterRoles(),
|
||||||
controllerContext.ClientBuilder.ClientOrDie("clusterrole-aggregation-controller").RbacV1(),
|
controllerContext.ClientBuilder.ClientOrDie("clusterrole-aggregation-controller").RbacV1(),
|
||||||
|
@ -19,7 +19,6 @@ package app
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
|
|
||||||
pluginvalidatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy"
|
pluginvalidatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy"
|
||||||
"k8s.io/apiserver/pkg/cel/openapi/resolver"
|
"k8s.io/apiserver/pkg/cel/openapi/resolver"
|
||||||
"k8s.io/client-go/kubernetes/scheme"
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
@ -28,14 +27,8 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/generated/openapi"
|
"k8s.io/kubernetes/pkg/generated/openapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
var validatingAdmissionPolicyResource = admissionregistrationv1beta1.SchemeGroupVersion.WithResource("validatingadmissionpolicies")
|
|
||||||
|
|
||||||
func startValidatingAdmissionPolicyStatusController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
|
func startValidatingAdmissionPolicyStatusController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
|
||||||
// intended check against served resource but not feature gate.
|
|
||||||
// KCM won't start the controller without the feature gate set.
|
// KCM won't start the controller without the feature gate set.
|
||||||
if !controllerContext.AvailableResources[validatingAdmissionPolicyResource] {
|
|
||||||
return nil, false, nil
|
|
||||||
}
|
|
||||||
typeChecker := &pluginvalidatingadmissionpolicy.TypeChecker{
|
typeChecker := &pluginvalidatingadmissionpolicy.TypeChecker{
|
||||||
SchemaResolver: resolver.NewDefinitionsSchemaResolver(scheme.Scheme, openapi.GetOpenAPIDefinitions),
|
SchemaResolver: resolver.NewDefinitionsSchemaResolver(scheme.Scheme, openapi.GetOpenAPIDefinitions),
|
||||||
RestMapper: controllerContext.RESTMapper,
|
RestMapper: controllerContext.RESTMapper,
|
||||||
|
@ -26,7 +26,6 @@ import (
|
|||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/uuid"
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
@ -492,17 +491,11 @@ func CreateControllerContext(s *cloudcontrollerconfig.CompletedConfig, clientBui
|
|||||||
restMapper.Reset()
|
restMapper.Reset()
|
||||||
}, 30*time.Second, stop)
|
}, 30*time.Second, stop)
|
||||||
|
|
||||||
availableResources, err := GetAvailableResources(clientBuilder)
|
|
||||||
if err != nil {
|
|
||||||
return genericcontrollermanager.ControllerContext{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := genericcontrollermanager.ControllerContext{
|
ctx := genericcontrollermanager.ControllerContext{
|
||||||
ClientBuilder: clientBuilder,
|
ClientBuilder: clientBuilder,
|
||||||
InformerFactory: sharedInformers,
|
InformerFactory: sharedInformers,
|
||||||
ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers),
|
ObjectOrMetadataInformerFactory: informerfactory.NewInformerFactory(sharedInformers, metadataInformers),
|
||||||
RESTMapper: restMapper,
|
RESTMapper: restMapper,
|
||||||
AvailableResources: availableResources,
|
|
||||||
Stop: stop,
|
Stop: stop,
|
||||||
InformersStarted: make(chan struct{}),
|
InformersStarted: make(chan struct{}),
|
||||||
ResyncPeriod: ResyncPeriod(s),
|
ResyncPeriod: ResyncPeriod(s),
|
||||||
@ -512,35 +505,6 @@ func CreateControllerContext(s *cloudcontrollerconfig.CompletedConfig, clientBui
|
|||||||
return ctx, nil
|
return ctx, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAvailableResources gets the map which contains all available resources of the apiserver
|
|
||||||
// TODO: In general, any controller checking this needs to be dynamic so
|
|
||||||
// users don't have to restart their controller manager if they change the apiserver.
|
|
||||||
// Until we get there, the structure here needs to be exposed for the construction of a proper ControllerContext.
|
|
||||||
func GetAvailableResources(clientBuilder clientbuilder.ControllerClientBuilder) (map[schema.GroupVersionResource]bool, error) {
|
|
||||||
client := clientBuilder.ClientOrDie("controller-discovery")
|
|
||||||
discoveryClient := client.Discovery()
|
|
||||||
_, resourceMap, err := discoveryClient.ServerGroupsAndResources()
|
|
||||||
if err != nil {
|
|
||||||
utilruntime.HandleError(fmt.Errorf("unable to get all supported resources from server: %v", err))
|
|
||||||
}
|
|
||||||
if len(resourceMap) == 0 {
|
|
||||||
return nil, fmt.Errorf("unable to get any supported resources from server")
|
|
||||||
}
|
|
||||||
|
|
||||||
allResources := map[schema.GroupVersionResource]bool{}
|
|
||||||
for _, apiResourceList := range resourceMap {
|
|
||||||
version, err := schema.ParseGroupVersion(apiResourceList.GroupVersion)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, apiResource := range apiResourceList.APIResources {
|
|
||||||
allResources[version.WithResource(apiResource.Name)] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return allResources, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResyncPeriod returns a function which generates a duration each time it is
|
// ResyncPeriod returns a function which generates a duration each time it is
|
||||||
// invoked; this is so that multiple controllers don't get into lock-step and all
|
// invoked; this is so that multiple controllers don't get into lock-step and all
|
||||||
// hammer the apiserver with list requests simultaneously.
|
// hammer the apiserver with list requests simultaneously.
|
||||||
|
@ -19,7 +19,6 @@ package app
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/restmapper"
|
"k8s.io/client-go/restmapper"
|
||||||
controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers"
|
controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers"
|
||||||
@ -46,9 +45,6 @@ type ControllerContext struct {
|
|||||||
// requested.
|
// requested.
|
||||||
RESTMapper *restmapper.DeferredDiscoveryRESTMapper
|
RESTMapper *restmapper.DeferredDiscoveryRESTMapper
|
||||||
|
|
||||||
// AvailableResources is a map listing currently available resources
|
|
||||||
AvailableResources map[schema.GroupVersionResource]bool
|
|
||||||
|
|
||||||
// Stop is the stop channel
|
// Stop is the stop channel
|
||||||
Stop <-chan struct{}
|
Stop <-chan struct{}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user