Skip to content

Commit 1b38199

Browse files
committed
pass Dialer instead of egressselector to webhooks
1 parent d318e52 commit 1b38199

File tree

15 files changed

+85
-50
lines changed

15 files changed

+85
-50
lines changed

cmd/kube-apiserver/app/server.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -498,13 +498,13 @@ func buildGenericConfig(
498498
}
499499
versionedInformers = clientgoinformers.NewSharedInformerFactory(clientgoExternalClient, 10*time.Minute)
500500

501-
genericConfig.Authentication.Authenticator, genericConfig.OpenAPIConfig.SecurityDefinitions, err = BuildAuthenticator(s, genericConfig, clientgoExternalClient, versionedInformers)
501+
genericConfig.Authentication.Authenticator, genericConfig.OpenAPIConfig.SecurityDefinitions, err = BuildAuthenticator(s, genericConfig.EgressSelector, clientgoExternalClient, versionedInformers)
502502
if err != nil {
503503
lastErr = fmt.Errorf("invalid authentication config: %v", err)
504504
return
505505
}
506506

507-
genericConfig.Authorization.Authorizer, genericConfig.RuleResolver, err = BuildAuthorizer(s, versionedInformers)
507+
genericConfig.Authorization.Authorizer, genericConfig.RuleResolver, err = BuildAuthorizer(s, genericConfig.EgressSelector, versionedInformers)
508508
if err != nil {
509509
lastErr = fmt.Errorf("invalid authorization config: %v", err)
510510
return
@@ -560,7 +560,7 @@ func buildGenericConfig(
560560
}
561561

562562
// BuildAuthenticator constructs the authenticator
563-
func BuildAuthenticator(s *options.ServerRunOptions, c *genericapiserver.Config, extclient clientgoclientset.Interface, versionedInformer clientgoinformers.SharedInformerFactory) (authenticator.Request, *spec.SecurityDefinitions, error) {
563+
func BuildAuthenticator(s *options.ServerRunOptions, EgressSelector *egressselector.EgressSelector, extclient clientgoclientset.Interface, versionedInformer clientgoinformers.SharedInformerFactory) (authenticator.Request, *spec.SecurityDefinitions, error) {
564564
authenticatorConfig, err := s.Authentication.ToAuthenticationConfig()
565565
if err != nil {
566566
return nil, nil, err
@@ -577,16 +577,29 @@ func BuildAuthenticator(s *options.ServerRunOptions, c *genericapiserver.Config,
577577
versionedInformer.Core().V1().Secrets().Lister().Secrets(v1.NamespaceSystem),
578578
)
579579

580-
if c.EgressSelector != nil {
581-
authenticatorConfig.EgressLookup = c.EgressSelector.Lookup
580+
if EgressSelector != nil {
581+
egressDialer, err := EgressSelector.Lookup(egressselector.Master.AsNetworkContext())
582+
if err != nil {
583+
return nil, nil, err
584+
}
585+
authenticatorConfig.CustomDial = egressDialer
582586
}
583587

584588
return authenticatorConfig.New()
585589
}
586590

587591
// BuildAuthorizer constructs the authorizer
588-
func BuildAuthorizer(s *options.ServerRunOptions, versionedInformers clientgoinformers.SharedInformerFactory) (authorizer.Authorizer, authorizer.RuleResolver, error) {
592+
func BuildAuthorizer(s *options.ServerRunOptions, EgressSelector *egressselector.EgressSelector, versionedInformers clientgoinformers.SharedInformerFactory) (authorizer.Authorizer, authorizer.RuleResolver, error) {
589593
authorizationConfig := s.Authorization.ToAuthorizationConfig(versionedInformers)
594+
595+
if EgressSelector != nil {
596+
egressDialer, err := EgressSelector.Lookup(egressselector.Master.AsNetworkContext())
597+
if err != nil {
598+
return nil, nil, err
599+
}
600+
authorizationConfig.CustomDial = egressDialer
601+
}
602+
590603
return authorizationConfig.New()
591604
}
592605

pkg/kubeapiserver/authenticator/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ go_library(
1212
deps = [
1313
"//pkg/features:go_default_library",
1414
"//pkg/serviceaccount:go_default_library",
15+
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
1516
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library",
1617
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library",
1718
"//staging/src/k8s.io/apiserver/pkg/authentication/group:go_default_library",
@@ -25,7 +26,6 @@ go_library(
2526
"//staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile:go_default_library",
2627
"//staging/src/k8s.io/apiserver/pkg/authentication/token/union:go_default_library",
2728
"//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library",
28-
"//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library",
2929
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
3030
"//staging/src/k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile:go_default_library",
3131
"//staging/src/k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth:go_default_library",

pkg/kubeapiserver/authenticator/config.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/go-openapi/spec"
2323

24+
utilnet "k8s.io/apimachinery/pkg/util/net"
2425
"k8s.io/apiserver/pkg/authentication/authenticator"
2526
"k8s.io/apiserver/pkg/authentication/authenticatorfactory"
2627
"k8s.io/apiserver/pkg/authentication/group"
@@ -34,7 +35,6 @@ import (
3435
"k8s.io/apiserver/pkg/authentication/token/tokenfile"
3536
tokenunion "k8s.io/apiserver/pkg/authentication/token/union"
3637
"k8s.io/apiserver/pkg/server/dynamiccertificates"
37-
"k8s.io/apiserver/pkg/server/egressselector"
3838
utilfeature "k8s.io/apiserver/pkg/util/feature"
3939
"k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile"
4040
"k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth"
@@ -85,8 +85,8 @@ type Config struct {
8585
// If this value is nil, then mutual TLS is disabled.
8686
ClientCAContentProvider dynamiccertificates.CAContentProvider
8787

88-
// Lookup will give us a dialer if the egress selector is configured for it
89-
EgressLookup egressselector.Lookup
88+
// Optional field, custom dial function used to connect to webhook
89+
CustomDial utilnet.DialFunc
9090
}
9191

9292
// New returns an authenticator.Request or an error that supports the standard
@@ -311,15 +311,10 @@ func newServiceAccountAuthenticator(iss string, keyfiles []string, apiAudiences
311311
}
312312

313313
func newWebhookTokenAuthenticator(config Config) (authenticator.Token, error) {
314-
webhookConfigFile := config.WebhookTokenAuthnConfigFile
315-
version := config.WebhookTokenAuthnVersion
316-
ttl := config.WebhookTokenAuthnCacheTTL
317-
implicitAuds := config.APIAudiences
318-
319-
webhookTokenAuthenticator, err := webhook.New(webhookConfigFile, version, implicitAuds, config.EgressLookup)
314+
webhookTokenAuthenticator, err := webhook.New(config.WebhookTokenAuthnConfigFile, config.WebhookTokenAuthnVersion, config.APIAudiences, config.CustomDial)
320315
if err != nil {
321316
return nil, err
322317
}
323318

324-
return tokencache.New(webhookTokenAuthenticator, false, ttl, ttl), nil
319+
return tokencache.New(webhookTokenAuthenticator, false, config.WebhookTokenAuthnCacheTTL, config.WebhookTokenAuthnCacheTTL), nil
325320
}

pkg/kubeapiserver/authorizer/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ go_library(
1616
"//plugin/pkg/auth/authorizer/node:go_default_library",
1717
"//plugin/pkg/auth/authorizer/rbac:go_default_library",
1818
"//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library",
19+
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
1920
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
2021
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library",
2122
"//staging/src/k8s.io/apiserver/pkg/authorization/union:go_default_library",

pkg/kubeapiserver/authorizer/config.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"time"
2222

23+
utilnet "k8s.io/apimachinery/pkg/util/net"
2324
"k8s.io/apiserver/pkg/authorization/authorizer"
2425
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
2526
"k8s.io/apiserver/pkg/authorization/union"
@@ -54,6 +55,9 @@ type Config struct {
5455
WebhookCacheUnauthorizedTTL time.Duration
5556

5657
VersionedInformerFactory versionedinformers.SharedInformerFactory
58+
59+
// Optional field, custom dial function used to connect to webhook
60+
CustomDial utilnet.DialFunc
5761
}
5862

5963
// New returns the right sort of union of multiple authorizer.Authorizer objects
@@ -102,7 +106,8 @@ func (config Config) New() (authorizer.Authorizer, authorizer.RuleResolver, erro
102106
webhookAuthorizer, err := webhook.New(config.WebhookConfigFile,
103107
config.WebhookVersion,
104108
config.WebhookCacheAuthorizedTTL,
105-
config.WebhookCacheUnauthorizedTTL)
109+
config.WebhookCacheUnauthorizedTTL,
110+
config.CustomDial)
106111
if err != nil {
107112
return nil, nil, err
108113
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ 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",
3332
"//staging/src/k8s.io/client-go/rest:go_default_library",
3433
"//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library",
3534
"//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library",

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"k8s.io/apimachinery/pkg/util/net"
3030
utilnet "k8s.io/apimachinery/pkg/util/net"
3131
"k8s.io/apimachinery/pkg/util/wait"
32-
"k8s.io/apiserver/pkg/server/egressselector"
3332
"k8s.io/client-go/rest"
3433
"k8s.io/client-go/tools/clientcmd"
3534
)
@@ -63,11 +62,11 @@ func DefaultShouldRetry(err error) bool {
6362
}
6463

6564
// NewGenericWebhook creates a new GenericWebhook from the provided kubeconfig file.
66-
func NewGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFactory, kubeConfigFile string, groupVersions []schema.GroupVersion, initialBackoff time.Duration, egressLookup egressselector.Lookup) (*GenericWebhook, error) {
67-
return newGenericWebhook(scheme, codecFactory, kubeConfigFile, groupVersions, initialBackoff, defaultRequestTimeout, egressLookup)
65+
func NewGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFactory, kubeConfigFile string, groupVersions []schema.GroupVersion, initialBackoff time.Duration, customDial utilnet.DialFunc) (*GenericWebhook, error) {
66+
return newGenericWebhook(scheme, codecFactory, kubeConfigFile, groupVersions, initialBackoff, defaultRequestTimeout, customDial)
6867
}
6968

70-
func newGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFactory, kubeConfigFile string, groupVersions []schema.GroupVersion, initialBackoff, requestTimeout time.Duration, egressLookup egressselector.Lookup) (*GenericWebhook, error) {
69+
func newGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFactory, kubeConfigFile string, groupVersions []schema.GroupVersion, initialBackoff, requestTimeout time.Duration, customDial utilnet.DialFunc) (*GenericWebhook, error) {
7170
for _, groupVersion := range groupVersions {
7271
if !scheme.IsVersionRegistered(groupVersion) {
7372
return nil, fmt.Errorf("webhook plugin requires enabling extension resource: %s", groupVersion)
@@ -96,14 +95,9 @@ func newGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFact
9695

9796
codec := codecFactory.LegacyCodec(groupVersions...)
9897
clientConfig.ContentConfig.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec})
99-
if egressLookup != nil {
100-
networkContext := egressselector.Master.AsNetworkContext()
101-
var egressDialer utilnet.DialFunc
102-
egressDialer, err = egressLookup(networkContext)
103-
if err != nil {
104-
return nil, err
105-
}
106-
clientConfig.Dial = egressDialer
98+
99+
if customDial != nil {
100+
clientConfig.Dial = customDial
107101
}
108102

109103
restClient, err := rest.UnversionedRESTClientFor(clientConfig)

staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ go_library(
3939
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
4040
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
4141
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
42+
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
4243
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library",
4344
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
44-
"//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library",
4545
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",
4646
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
4747
"//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library",

staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ import (
2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929
"k8s.io/apimachinery/pkg/runtime"
3030
"k8s.io/apimachinery/pkg/runtime/schema"
31+
utilnet "k8s.io/apimachinery/pkg/util/net"
3132
"k8s.io/apiserver/pkg/authentication/authenticator"
3233
"k8s.io/apiserver/pkg/authentication/user"
33-
"k8s.io/apiserver/pkg/server/egressselector"
3434
"k8s.io/apiserver/pkg/util/webhook"
3535
"k8s.io/client-go/kubernetes/scheme"
3636
authenticationv1client "k8s.io/client-go/kubernetes/typed/authentication/v1"
@@ -64,8 +64,8 @@ func NewFromInterface(tokenReview authenticationv1client.TokenReviewInterface, i
6464
// file. It is recommend to wrap this authenticator with the token cache
6565
// authenticator implemented in
6666
// k8s.io/apiserver/pkg/authentication/token/cache.
67-
func New(kubeConfigFile string, version string, implicitAuds authenticator.Audiences, egressLookup egressselector.Lookup) (*WebhookTokenAuthenticator, error) {
68-
tokenReview, err := tokenReviewInterfaceFromKubeconfig(kubeConfigFile, version, egressLookup)
67+
func New(kubeConfigFile string, version string, implicitAuds authenticator.Audiences, customDial utilnet.DialFunc) (*WebhookTokenAuthenticator, error) {
68+
tokenReview, err := tokenReviewInterfaceFromKubeconfig(kubeConfigFile, version, customDial)
6969
if err != nil {
7070
return nil, err
7171
}
@@ -154,7 +154,7 @@ func (w *WebhookTokenAuthenticator) AuthenticateToken(ctx context.Context, token
154154
// tokenReviewInterfaceFromKubeconfig builds a client from the specified kubeconfig file,
155155
// and returns a TokenReviewInterface that uses that client. Note that the client submits TokenReview
156156
// requests to the exact path specified in the kubeconfig file, so arbitrary non-API servers can be targeted.
157-
func tokenReviewInterfaceFromKubeconfig(kubeConfigFile string, version string, egressLookup egressselector.Lookup) (tokenReviewer, error) {
157+
func tokenReviewInterfaceFromKubeconfig(kubeConfigFile string, version string, customDial utilnet.DialFunc) (tokenReviewer, error) {
158158
localScheme := runtime.NewScheme()
159159
if err := scheme.AddToScheme(localScheme); err != nil {
160160
return nil, err
@@ -166,7 +166,7 @@ func tokenReviewInterfaceFromKubeconfig(kubeConfigFile string, version string, e
166166
if err := localScheme.SetVersionPriority(groupVersions...); err != nil {
167167
return nil, err
168168
}
169-
gw, err := webhook.NewGenericWebhook(localScheme, scheme.Codecs, kubeConfigFile, groupVersions, 0, egressLookup)
169+
gw, err := webhook.NewGenericWebhook(localScheme, scheme.Codecs, kubeConfigFile, groupVersions, 0, customDial)
170170
if err != nil {
171171
return nil, err
172172
}
@@ -177,7 +177,7 @@ func tokenReviewInterfaceFromKubeconfig(kubeConfigFile string, version string, e
177177
if err := localScheme.SetVersionPriority(groupVersions...); err != nil {
178178
return nil, err
179179
}
180-
gw, err := webhook.NewGenericWebhook(localScheme, scheme.Codecs, kubeConfigFile, groupVersions, 0, egressLookup)
180+
gw, err := webhook.NewGenericWebhook(localScheme, scheme.Codecs, kubeConfigFile, groupVersions, 0, customDial)
181181
if err != nil {
182182
return nil, err
183183
}

staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ go_library(
3939
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
4040
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
4141
"//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library",
42+
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
4243
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
4344
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
4445
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",

0 commit comments

Comments
 (0)