mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 10:18:13 +00:00 
			
		
		
		
	Merge pull request #85168 from Jefftree/admission-wh-proxy
Use Network Proxy for Admission Webhooks
This commit is contained in:
		| @@ -176,7 +176,7 @@ func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan | ||||
|  | ||||
| 	// If additional API servers are added, they should be gated. | ||||
| 	apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, kubeAPIServerConfig.ExtraConfig.VersionedInformers, pluginInitializer, completedOptions.ServerRunOptions, completedOptions.MasterCount, | ||||
| 		serviceResolver, webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, kubeAPIServerConfig.GenericConfig.LoopbackClientConfig)) | ||||
| 		serviceResolver, webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, kubeAPIServerConfig.GenericConfig.EgressSelector, kubeAPIServerConfig.GenericConfig.LoopbackClientConfig)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -491,7 +491,7 @@ func buildGenericConfig( | ||||
| 	} | ||||
| 	serviceResolver = buildServiceResolver(s.EnableAggregatorRouting, genericConfig.LoopbackClientConfig.Host, versionedInformers) | ||||
|  | ||||
| 	authInfoResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, genericConfig.LoopbackClientConfig) | ||||
| 	authInfoResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, genericConfig.EgressSelector, genericConfig.LoopbackClientConfig) | ||||
|  | ||||
| 	lastErr = s.Audit.ApplyTo( | ||||
| 		genericConfig, | ||||
| @@ -507,7 +507,7 @@ func buildGenericConfig( | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	pluginInitializers, admissionPostStartHook, err = admissionConfig.New(proxyTransport, serviceResolver) | ||||
| 	pluginInitializers, admissionPostStartHook, err = admissionConfig.New(proxyTransport, genericConfig.EgressSelector, serviceResolver) | ||||
| 	if err != nil { | ||||
| 		lastErr = fmt.Errorf("failed to create admission plugin initializer: %v", err) | ||||
| 		return | ||||
|   | ||||
| @@ -16,6 +16,7 @@ go_library( | ||||
|         "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", | ||||
|         "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer:go_default_library", | ||||
|         "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", | ||||
|         "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", | ||||
|         "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", | ||||
|         "//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library", | ||||
|         "//staging/src/k8s.io/client-go/informers:go_default_library", | ||||
|   | ||||
| @@ -27,6 +27,7 @@ import ( | ||||
| 	"k8s.io/apiserver/pkg/admission" | ||||
| 	webhookinit "k8s.io/apiserver/pkg/admission/plugin/webhook/initializer" | ||||
| 	genericapiserver "k8s.io/apiserver/pkg/server" | ||||
| 	egressselector "k8s.io/apiserver/pkg/server/egressselector" | ||||
| 	"k8s.io/apiserver/pkg/util/webhook" | ||||
| 	cacheddiscovery "k8s.io/client-go/discovery/cached/memory" | ||||
| 	externalinformers "k8s.io/client-go/informers" | ||||
| @@ -44,8 +45,8 @@ type Config struct { | ||||
| } | ||||
|  | ||||
| // New sets up the plugins and admission start hooks needed for admission | ||||
| func (c *Config) New(proxyTransport *http.Transport, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, genericapiserver.PostStartHookFunc, error) { | ||||
| 	webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, c.LoopbackClientConfig) | ||||
| func (c *Config) New(proxyTransport *http.Transport, egressSelector *egressselector.EgressSelector, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, genericapiserver.PostStartHookFunc, error) { | ||||
| 	webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, egressSelector, c.LoopbackClientConfig) | ||||
| 	webhookPluginInitializer := webhookinit.NewPluginInitializer(webhookAuthResolverWrapper, serviceResolver) | ||||
|  | ||||
| 	var cloudConfig []byte | ||||
|   | ||||
| @@ -104,7 +104,7 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err | ||||
| 		ExtraConfig: apiserver.ExtraConfig{ | ||||
| 			CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd), | ||||
| 			ServiceResolver:      &serviceResolver{serverConfig.SharedInformerFactory.Core().V1().Services().Lister()}, | ||||
| 			AuthResolverWrapper:  webhook.NewDefaultAuthenticationInfoResolverWrapper(nil, serverConfig.LoopbackClientConfig), | ||||
| 			AuthResolverWrapper:  webhook.NewDefaultAuthenticationInfoResolverWrapper(nil, nil, serverConfig.LoopbackClientConfig), | ||||
| 		}, | ||||
| 	} | ||||
| 	return config, nil | ||||
|   | ||||
| @@ -29,6 +29,7 @@ go_library( | ||||
|         "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", | ||||
|         "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", | ||||
|         "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", | ||||
|         "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", | ||||
|         "//staging/src/k8s.io/client-go/rest:go_default_library", | ||||
|         "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", | ||||
|         "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", | ||||
|   | ||||
| @@ -26,6 +26,8 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	utilnet "k8s.io/apimachinery/pkg/util/net" | ||||
| 	egressselector "k8s.io/apiserver/pkg/server/egressselector" | ||||
| 	"k8s.io/client-go/rest" | ||||
| 	"k8s.io/client-go/tools/clientcmd" | ||||
| 	clientcmdapi "k8s.io/client-go/tools/clientcmd/api" | ||||
| @@ -38,6 +40,7 @@ type AuthenticationInfoResolverWrapper func(AuthenticationInfoResolver) Authenti | ||||
| // NewDefaultAuthenticationInfoResolverWrapper builds a default authn resolver wrapper | ||||
| func NewDefaultAuthenticationInfoResolverWrapper( | ||||
| 	proxyTransport *http.Transport, | ||||
| 	egressSelector *egressselector.EgressSelector, | ||||
| 	kubeapiserverClientConfig *rest.Config) AuthenticationInfoResolverWrapper { | ||||
|  | ||||
| 	webhookAuthResolverWrapper := func(delegate AuthenticationInfoResolver) AuthenticationInfoResolver { | ||||
| @@ -46,7 +49,23 @@ func NewDefaultAuthenticationInfoResolverWrapper( | ||||
| 				if hostPort == "kubernetes.default.svc:443" { | ||||
| 					return kubeapiserverClientConfig, nil | ||||
| 				} | ||||
| 				return delegate.ClientConfigFor(hostPort) | ||||
| 				ret, err := delegate.ClientConfigFor(hostPort) | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
|  | ||||
| 				if egressSelector != nil { | ||||
| 					networkContext := egressselector.Master.AsNetworkContext() | ||||
| 					var egressDialer utilnet.DialFunc | ||||
| 					egressDialer, err = egressSelector.Lookup(networkContext) | ||||
|  | ||||
| 					if err != nil { | ||||
| 						return nil, err | ||||
| 					} | ||||
|  | ||||
| 					ret.Dial = egressDialer | ||||
| 				} | ||||
| 				return ret, nil | ||||
| 			}, | ||||
| 			ClientConfigForServiceFunc: func(serviceName, serviceNamespace string, servicePort int) (*rest.Config, error) { | ||||
| 				if serviceName == "kubernetes" && serviceNamespace == corev1.NamespaceDefault && servicePort == 443 { | ||||
| @@ -56,10 +75,20 @@ func NewDefaultAuthenticationInfoResolverWrapper( | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				if proxyTransport != nil && proxyTransport.DialContext != nil { | ||||
|  | ||||
| 				if egressSelector != nil { | ||||
| 					networkContext := egressselector.Cluster.AsNetworkContext() | ||||
| 					var egressDialer utilnet.DialFunc | ||||
| 					egressDialer, err = egressSelector.Lookup(networkContext) | ||||
| 					if err != nil { | ||||
| 						return nil, err | ||||
| 					} | ||||
|  | ||||
| 					ret.Dial = egressDialer | ||||
| 				} else if proxyTransport != nil && proxyTransport.DialContext != nil { | ||||
| 					ret.Dial = proxyTransport.DialContext | ||||
| 				} | ||||
| 				return ret, err | ||||
| 				return ret, nil | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Prow Robot
					Kubernetes Prow Robot