mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
refactors kubeapiserver webhook utility to be generic
This commit is contained in:
parent
7e102de723
commit
1081fffdd5
@ -23,7 +23,6 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
|
||||||
utilwait "k8s.io/apimachinery/pkg/util/wait"
|
utilwait "k8s.io/apimachinery/pkg/util/wait"
|
||||||
"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"
|
||||||
@ -38,41 +37,15 @@ import (
|
|||||||
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
|
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// AdmissionConfig holds the configuration for initializing the admission plugins
|
||||||
type AdmissionConfig struct {
|
type AdmissionConfig struct {
|
||||||
CloudConfigFile string
|
CloudConfigFile string
|
||||||
LoopbackClientConfig *rest.Config
|
LoopbackClientConfig *rest.Config
|
||||||
ExternalInformers externalinformers.SharedInformerFactory
|
ExternalInformers externalinformers.SharedInformerFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *AdmissionConfig) buildAuthnInfoResolver(proxyTransport *http.Transport) webhook.AuthenticationInfoResolverWrapper {
|
|
||||||
webhookAuthResolverWrapper := func(delegate webhook.AuthenticationInfoResolver) webhook.AuthenticationInfoResolver {
|
|
||||||
return &webhook.AuthenticationInfoResolverDelegator{
|
|
||||||
ClientConfigForFunc: func(server string) (*rest.Config, error) {
|
|
||||||
if server == "kubernetes.default.svc" {
|
|
||||||
return c.LoopbackClientConfig, nil
|
|
||||||
}
|
|
||||||
return delegate.ClientConfigFor(server)
|
|
||||||
},
|
|
||||||
ClientConfigForServiceFunc: func(serviceName, serviceNamespace string) (*rest.Config, error) {
|
|
||||||
if serviceName == "kubernetes" && serviceNamespace == v1.NamespaceDefault {
|
|
||||||
return c.LoopbackClientConfig, nil
|
|
||||||
}
|
|
||||||
ret, err := delegate.ClientConfigForService(serviceName, serviceNamespace)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if proxyTransport != nil && proxyTransport.DialContext != nil {
|
|
||||||
ret.Dial = proxyTransport.DialContext
|
|
||||||
}
|
|
||||||
return ret, err
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return webhookAuthResolverWrapper
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *AdmissionConfig) New(proxyTransport *http.Transport, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, server.PostStartHookFunc, error) {
|
func (c *AdmissionConfig) New(proxyTransport *http.Transport, serviceResolver webhook.ServiceResolver) ([]admission.PluginInitializer, server.PostStartHookFunc, error) {
|
||||||
webhookAuthResolverWrapper := c.buildAuthnInfoResolver(proxyTransport)
|
webhookAuthResolverWrapper := webhook.NewDefaultAuthenticationInfoResolverWrapper(proxyTransport, c.LoopbackClientConfig)
|
||||||
webhookPluginInitializer := webhookinit.NewPluginInitializer(webhookAuthResolverWrapper, serviceResolver)
|
webhookPluginInitializer := webhookinit.NewPluginInitializer(webhookAuthResolverWrapper, serviceResolver)
|
||||||
|
|
||||||
var cloudConfig []byte
|
var cloudConfig []byte
|
||||||
|
@ -19,9 +19,11 @@ package webhook
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
"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"
|
||||||
@ -31,6 +33,37 @@ import (
|
|||||||
// rest.Config generated by the resolver.
|
// rest.Config generated by the resolver.
|
||||||
type AuthenticationInfoResolverWrapper func(AuthenticationInfoResolver) AuthenticationInfoResolver
|
type AuthenticationInfoResolverWrapper func(AuthenticationInfoResolver) AuthenticationInfoResolver
|
||||||
|
|
||||||
|
// NewDefaultAuthenticationInfoResolverWrapper builds a default authn resolver wrapper
|
||||||
|
func NewDefaultAuthenticationInfoResolverWrapper(
|
||||||
|
proxyTransport *http.Transport,
|
||||||
|
kubeapiserverClientConfig *rest.Config) AuthenticationInfoResolverWrapper {
|
||||||
|
|
||||||
|
webhookAuthResolverWrapper := func(delegate AuthenticationInfoResolver) AuthenticationInfoResolver {
|
||||||
|
return &AuthenticationInfoResolverDelegator{
|
||||||
|
ClientConfigForFunc: func(server string) (*rest.Config, error) {
|
||||||
|
if server == "kubernetes.default.svc" {
|
||||||
|
return kubeapiserverClientConfig, nil
|
||||||
|
}
|
||||||
|
return delegate.ClientConfigFor(server)
|
||||||
|
},
|
||||||
|
ClientConfigForServiceFunc: func(serviceName, serviceNamespace string) (*rest.Config, error) {
|
||||||
|
if serviceName == "kubernetes" && serviceNamespace == corev1.NamespaceDefault {
|
||||||
|
return kubeapiserverClientConfig, nil
|
||||||
|
}
|
||||||
|
ret, err := delegate.ClientConfigForService(serviceName, serviceNamespace)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if proxyTransport != nil && proxyTransport.DialContext != nil {
|
||||||
|
ret.Dial = proxyTransport.DialContext
|
||||||
|
}
|
||||||
|
return ret, err
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return webhookAuthResolverWrapper
|
||||||
|
}
|
||||||
|
|
||||||
// AuthenticationInfoResolver builds rest.Config base on the server or service
|
// AuthenticationInfoResolver builds rest.Config base on the server or service
|
||||||
// name and service namespace.
|
// name and service namespace.
|
||||||
type AuthenticationInfoResolver interface {
|
type AuthenticationInfoResolver interface {
|
||||||
|
Loading…
Reference in New Issue
Block a user