mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 02:08: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. | 	// If additional API servers are added, they should be gated. | ||||||
| 	apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, kubeAPIServerConfig.ExtraConfig.VersionedInformers, pluginInitializer, completedOptions.ServerRunOptions, completedOptions.MasterCount, | 	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 { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -491,7 +491,7 @@ func buildGenericConfig( | |||||||
| 	} | 	} | ||||||
| 	serviceResolver = buildServiceResolver(s.EnableAggregatorRouting, genericConfig.LoopbackClientConfig.Host, versionedInformers) | 	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( | 	lastErr = s.Audit.ApplyTo( | ||||||
| 		genericConfig, | 		genericConfig, | ||||||
| @@ -507,7 +507,7 @@ func buildGenericConfig( | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	pluginInitializers, admissionPostStartHook, err = admissionConfig.New(proxyTransport, serviceResolver) | 	pluginInitializers, admissionPostStartHook, err = admissionConfig.New(proxyTransport, genericConfig.EgressSelector, serviceResolver) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		lastErr = fmt.Errorf("failed to create admission plugin initializer: %v", err) | 		lastErr = fmt.Errorf("failed to create admission plugin initializer: %v", err) | ||||||
| 		return | 		return | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ go_library( | |||||||
|         "//staging/src/k8s.io/apiserver/pkg/admission:go_default_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/admission/plugin/webhook/initializer:go_default_library", | ||||||
|         "//staging/src/k8s.io/apiserver/pkg/server: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/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/discovery/cached/memory:go_default_library", | ||||||
|         "//staging/src/k8s.io/client-go/informers:go_default_library", |         "//staging/src/k8s.io/client-go/informers:go_default_library", | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ import ( | |||||||
| 	"k8s.io/apiserver/pkg/admission" | 	"k8s.io/apiserver/pkg/admission" | ||||||
| 	webhookinit "k8s.io/apiserver/pkg/admission/plugin/webhook/initializer" | 	webhookinit "k8s.io/apiserver/pkg/admission/plugin/webhook/initializer" | ||||||
| 	genericapiserver "k8s.io/apiserver/pkg/server" | 	genericapiserver "k8s.io/apiserver/pkg/server" | ||||||
|  | 	egressselector "k8s.io/apiserver/pkg/server/egressselector" | ||||||
| 	"k8s.io/apiserver/pkg/util/webhook" | 	"k8s.io/apiserver/pkg/util/webhook" | ||||||
| 	cacheddiscovery "k8s.io/client-go/discovery/cached/memory" | 	cacheddiscovery "k8s.io/client-go/discovery/cached/memory" | ||||||
| 	externalinformers "k8s.io/client-go/informers" | 	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 | // 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) { | func (c *Config) New(proxyTransport *http.Transport, egressSelector *egressselector.EgressSelector, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, genericapiserver.PostStartHookFunc, error) { | ||||||
| 	webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, c.LoopbackClientConfig) | 	webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, egressSelector, c.LoopbackClientConfig) | ||||||
| 	webhookPluginInitializer := webhookinit.NewPluginInitializer(webhookAuthResolverWrapper, serviceResolver) | 	webhookPluginInitializer := webhookinit.NewPluginInitializer(webhookAuthResolverWrapper, serviceResolver) | ||||||
|  |  | ||||||
| 	var cloudConfig []byte | 	var cloudConfig []byte | ||||||
|   | |||||||
| @@ -104,7 +104,7 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err | |||||||
| 		ExtraConfig: apiserver.ExtraConfig{ | 		ExtraConfig: apiserver.ExtraConfig{ | ||||||
| 			CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd), | 			CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd), | ||||||
| 			ServiceResolver:      &serviceResolver{serverConfig.SharedInformerFactory.Core().V1().Services().Lister()}, | 			ServiceResolver:      &serviceResolver{serverConfig.SharedInformerFactory.Core().V1().Services().Lister()}, | ||||||
| 			AuthResolverWrapper:  webhook.NewDefaultAuthenticationInfoResolverWrapper(nil, serverConfig.LoopbackClientConfig), | 			AuthResolverWrapper:  webhook.NewDefaultAuthenticationInfoResolverWrapper(nil, nil, serverConfig.LoopbackClientConfig), | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	return config, nil | 	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:go_default_library", | ||||||
|         "//staging/src/k8s.io/apimachinery/pkg/util/validation/field: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/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/rest:go_default_library", | ||||||
|         "//staging/src/k8s.io/client-go/tools/clientcmd: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", |         "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", | ||||||
|   | |||||||
| @@ -26,6 +26,8 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	corev1 "k8s.io/api/core/v1" | 	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/rest" | ||||||
| 	"k8s.io/client-go/tools/clientcmd" | 	"k8s.io/client-go/tools/clientcmd" | ||||||
| 	clientcmdapi "k8s.io/client-go/tools/clientcmd/api" | 	clientcmdapi "k8s.io/client-go/tools/clientcmd/api" | ||||||
| @@ -38,6 +40,7 @@ type AuthenticationInfoResolverWrapper func(AuthenticationInfoResolver) Authenti | |||||||
| // NewDefaultAuthenticationInfoResolverWrapper builds a default authn resolver wrapper | // NewDefaultAuthenticationInfoResolverWrapper builds a default authn resolver wrapper | ||||||
| func NewDefaultAuthenticationInfoResolverWrapper( | func NewDefaultAuthenticationInfoResolverWrapper( | ||||||
| 	proxyTransport *http.Transport, | 	proxyTransport *http.Transport, | ||||||
|  | 	egressSelector *egressselector.EgressSelector, | ||||||
| 	kubeapiserverClientConfig *rest.Config) AuthenticationInfoResolverWrapper { | 	kubeapiserverClientConfig *rest.Config) AuthenticationInfoResolverWrapper { | ||||||
|  |  | ||||||
| 	webhookAuthResolverWrapper := func(delegate AuthenticationInfoResolver) AuthenticationInfoResolver { | 	webhookAuthResolverWrapper := func(delegate AuthenticationInfoResolver) AuthenticationInfoResolver { | ||||||
| @@ -46,7 +49,23 @@ func NewDefaultAuthenticationInfoResolverWrapper( | |||||||
| 				if hostPort == "kubernetes.default.svc:443" { | 				if hostPort == "kubernetes.default.svc:443" { | ||||||
| 					return kubeapiserverClientConfig, nil | 					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) { | 			ClientConfigForServiceFunc: func(serviceName, serviceNamespace string, servicePort int) (*rest.Config, error) { | ||||||
| 				if serviceName == "kubernetes" && serviceNamespace == corev1.NamespaceDefault && servicePort == 443 { | 				if serviceName == "kubernetes" && serviceNamespace == corev1.NamespaceDefault && servicePort == 443 { | ||||||
| @@ -56,10 +75,20 @@ func NewDefaultAuthenticationInfoResolverWrapper( | |||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return nil, err | 					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 | 					ret.Dial = proxyTransport.DialContext | ||||||
| 				} | 				} | ||||||
| 				return ret, err | 				return ret, nil | ||||||
| 			}, | 			}, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Prow Robot
					Kubernetes Prow Robot