Skip to content

Commit 720e6de

Browse files
authored
Merge pull request kubernetes#85168 from Jefftree/admission-wh-proxy
Use Network Proxy for Admission Webhooks
2 parents d3f976d + 1289bda commit 720e6de

File tree

6 files changed

+41
-9
lines changed

6 files changed

+41
-9
lines changed

cmd/kube-apiserver/app/server.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan
176176

177177
// If additional API servers are added, they should be gated.
178178
apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, kubeAPIServerConfig.ExtraConfig.VersionedInformers, pluginInitializer, completedOptions.ServerRunOptions, completedOptions.MasterCount,
179-
serviceResolver, webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, kubeAPIServerConfig.GenericConfig.LoopbackClientConfig))
179+
serviceResolver, webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, kubeAPIServerConfig.GenericConfig.EgressSelector, kubeAPIServerConfig.GenericConfig.LoopbackClientConfig))
180180
if err != nil {
181181
return nil, err
182182
}
@@ -491,7 +491,7 @@ func buildGenericConfig(
491491
}
492492
serviceResolver = buildServiceResolver(s.EnableAggregatorRouting, genericConfig.LoopbackClientConfig.Host, versionedInformers)
493493

494-
authInfoResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, genericConfig.LoopbackClientConfig)
494+
authInfoResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, genericConfig.EgressSelector, genericConfig.LoopbackClientConfig)
495495

496496
lastErr = s.Audit.ApplyTo(
497497
genericConfig,
@@ -507,7 +507,7 @@ func buildGenericConfig(
507507
return
508508
}
509509

510-
pluginInitializers, admissionPostStartHook, err = admissionConfig.New(proxyTransport, serviceResolver)
510+
pluginInitializers, admissionPostStartHook, err = admissionConfig.New(proxyTransport, genericConfig.EgressSelector, serviceResolver)
511511
if err != nil {
512512
lastErr = fmt.Errorf("failed to create admission plugin initializer: %v", err)
513513
return

pkg/kubeapiserver/admission/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ go_library(
1616
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
1717
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer:go_default_library",
1818
"//staging/src/k8s.io/apiserver/pkg/server:go_default_library",
19+
"//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library",
1920
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",
2021
"//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library",
2122
"//staging/src/k8s.io/client-go/informers:go_default_library",

pkg/kubeapiserver/admission/config.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"k8s.io/apiserver/pkg/admission"
2828
webhookinit "k8s.io/apiserver/pkg/admission/plugin/webhook/initializer"
2929
genericapiserver "k8s.io/apiserver/pkg/server"
30+
egressselector "k8s.io/apiserver/pkg/server/egressselector"
3031
"k8s.io/apiserver/pkg/util/webhook"
3132
cacheddiscovery "k8s.io/client-go/discovery/cached/memory"
3233
externalinformers "k8s.io/client-go/informers"
@@ -44,8 +45,8 @@ type Config struct {
4445
}
4546

4647
// New sets up the plugins and admission start hooks needed for admission
47-
func (c *Config) New(proxyTransport *http.Transport, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, genericapiserver.PostStartHookFunc, error) {
48-
webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, c.LoopbackClientConfig)
48+
func (c *Config) New(proxyTransport *http.Transport, egressSelector *egressselector.EgressSelector, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, genericapiserver.PostStartHookFunc, error) {
49+
webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, egressSelector, c.LoopbackClientConfig)
4950
webhookPluginInitializer := webhookinit.NewPluginInitializer(webhookAuthResolverWrapper, serviceResolver)
5051

5152
var cloudConfig []byte

staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/options.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err
104104
ExtraConfig: apiserver.ExtraConfig{
105105
CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd),
106106
ServiceResolver: &serviceResolver{serverConfig.SharedInformerFactory.Core().V1().Services().Lister()},
107-
AuthResolverWrapper: webhook.NewDefaultAuthenticationInfoResolverWrapper(nil, serverConfig.LoopbackClientConfig),
107+
AuthResolverWrapper: webhook.NewDefaultAuthenticationInfoResolverWrapper(nil, nil, serverConfig.LoopbackClientConfig),
108108
},
109109
}
110110
return config, nil

staging/src/k8s.io/apiserver/pkg/util/webhook/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ go_library(
2929
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
3030
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
3131
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
32+
"//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library",
3233
"//staging/src/k8s.io/client-go/rest:go_default_library",
3334
"//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library",
3435
"//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library",

staging/src/k8s.io/apiserver/pkg/util/webhook/authentication.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
"time"
2727

2828
corev1 "k8s.io/api/core/v1"
29+
utilnet "k8s.io/apimachinery/pkg/util/net"
30+
egressselector "k8s.io/apiserver/pkg/server/egressselector"
2931
"k8s.io/client-go/rest"
3032
"k8s.io/client-go/tools/clientcmd"
3133
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
@@ -38,6 +40,7 @@ type AuthenticationInfoResolverWrapper func(AuthenticationInfoResolver) Authenti
3840
// NewDefaultAuthenticationInfoResolverWrapper builds a default authn resolver wrapper
3941
func NewDefaultAuthenticationInfoResolverWrapper(
4042
proxyTransport *http.Transport,
43+
egressSelector *egressselector.EgressSelector,
4144
kubeapiserverClientConfig *rest.Config) AuthenticationInfoResolverWrapper {
4245

4346
webhookAuthResolverWrapper := func(delegate AuthenticationInfoResolver) AuthenticationInfoResolver {
@@ -46,7 +49,23 @@ func NewDefaultAuthenticationInfoResolverWrapper(
4649
if hostPort == "kubernetes.default.svc:443" {
4750
return kubeapiserverClientConfig, nil
4851
}
49-
return delegate.ClientConfigFor(hostPort)
52+
ret, err := delegate.ClientConfigFor(hostPort)
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
if egressSelector != nil {
58+
networkContext := egressselector.Master.AsNetworkContext()
59+
var egressDialer utilnet.DialFunc
60+
egressDialer, err = egressSelector.Lookup(networkContext)
61+
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
ret.Dial = egressDialer
67+
}
68+
return ret, nil
5069
},
5170
ClientConfigForServiceFunc: func(serviceName, serviceNamespace string, servicePort int) (*rest.Config, error) {
5271
if serviceName == "kubernetes" && serviceNamespace == corev1.NamespaceDefault && servicePort == 443 {
@@ -56,10 +75,20 @@ func NewDefaultAuthenticationInfoResolverWrapper(
5675
if err != nil {
5776
return nil, err
5877
}
59-
if proxyTransport != nil && proxyTransport.DialContext != nil {
78+
79+
if egressSelector != nil {
80+
networkContext := egressselector.Cluster.AsNetworkContext()
81+
var egressDialer utilnet.DialFunc
82+
egressDialer, err = egressSelector.Lookup(networkContext)
83+
if err != nil {
84+
return nil, err
85+
}
86+
87+
ret.Dial = egressDialer
88+
} else if proxyTransport != nil && proxyTransport.DialContext != nil {
6089
ret.Dial = proxyTransport.DialContext
6190
}
62-
return ret, err
91+
return ret, nil
6392
},
6493
}
6594
}

0 commit comments

Comments
 (0)