mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 04:33:26 +00:00
Merge pull request #43813 from liggitt/conditional-post-start-hook
Automatic merge from submit-queue Make RBAC post-start hook conditional on RBAC authorizer being used Makes the RBAC post-start hook (and reconciliation) conditional on the RBAC authorizer being used Ensures we don't set up unnecessary objects. ```release-note RBAC role and rolebinding auto-reconciliation is now performed only when the RBAC authorization mode is enabled. ```
This commit is contained in:
commit
91c03b0e8f
@ -32,12 +32,14 @@ go_library(
|
|||||||
"//pkg/kubeapiserver:go_default_library",
|
"//pkg/kubeapiserver:go_default_library",
|
||||||
"//pkg/kubeapiserver/admission:go_default_library",
|
"//pkg/kubeapiserver/admission:go_default_library",
|
||||||
"//pkg/kubeapiserver/authenticator:go_default_library",
|
"//pkg/kubeapiserver/authenticator:go_default_library",
|
||||||
|
"//pkg/kubeapiserver/authorizer/modes:go_default_library",
|
||||||
"//pkg/kubeapiserver/options:go_default_library",
|
"//pkg/kubeapiserver/options:go_default_library",
|
||||||
"//pkg/kubeapiserver/server:go_default_library",
|
"//pkg/kubeapiserver/server:go_default_library",
|
||||||
"//pkg/master:go_default_library",
|
"//pkg/master:go_default_library",
|
||||||
"//pkg/master/thirdparty:go_default_library",
|
"//pkg/master/thirdparty:go_default_library",
|
||||||
"//pkg/master/tunneler:go_default_library",
|
"//pkg/master/tunneler:go_default_library",
|
||||||
"//pkg/registry/cachesize:go_default_library",
|
"//pkg/registry/cachesize:go_default_library",
|
||||||
|
"//pkg/registry/rbac/rest:go_default_library",
|
||||||
"//pkg/version:go_default_library",
|
"//pkg/version:go_default_library",
|
||||||
"//plugin/pkg/admission/admit:go_default_library",
|
"//plugin/pkg/admission/admit:go_default_library",
|
||||||
"//plugin/pkg/admission/alwayspullimages:go_default_library",
|
"//plugin/pkg/admission/alwayspullimages:go_default_library",
|
||||||
|
@ -66,11 +66,13 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubeapiserver"
|
"k8s.io/kubernetes/pkg/kubeapiserver"
|
||||||
kubeadmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
|
kubeadmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
|
||||||
kubeauthenticator "k8s.io/kubernetes/pkg/kubeapiserver/authenticator"
|
kubeauthenticator "k8s.io/kubernetes/pkg/kubeapiserver/authenticator"
|
||||||
|
"k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes"
|
||||||
kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options"
|
kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options"
|
||||||
kubeserver "k8s.io/kubernetes/pkg/kubeapiserver/server"
|
kubeserver "k8s.io/kubernetes/pkg/kubeapiserver/server"
|
||||||
"k8s.io/kubernetes/pkg/master"
|
"k8s.io/kubernetes/pkg/master"
|
||||||
"k8s.io/kubernetes/pkg/master/tunneler"
|
"k8s.io/kubernetes/pkg/master/tunneler"
|
||||||
"k8s.io/kubernetes/pkg/registry/cachesize"
|
"k8s.io/kubernetes/pkg/registry/cachesize"
|
||||||
|
rbacrest "k8s.io/kubernetes/pkg/registry/rbac/rest"
|
||||||
"k8s.io/kubernetes/pkg/version"
|
"k8s.io/kubernetes/pkg/version"
|
||||||
"k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap"
|
"k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap"
|
||||||
)
|
)
|
||||||
@ -353,6 +355,9 @@ func BuildGenericConfig(s *options.ServerRunOptions) (*genericapiserver.Config,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, fmt.Errorf("invalid authorization config: %v", err)
|
return nil, nil, nil, fmt.Errorf("invalid authorization config: %v", err)
|
||||||
}
|
}
|
||||||
|
if !sets.NewString(s.Authorization.Modes()...).Has(modes.ModeRBAC) {
|
||||||
|
genericConfig.DisabledPostStartHooks.Insert(rbacrest.PostStartHookName)
|
||||||
|
}
|
||||||
|
|
||||||
genericConfig.AdmissionControl, err = BuildAdmission(s, client, sharedInformers, genericConfig.Authorizer)
|
genericConfig.AdmissionControl, err = BuildAdmission(s, client, sharedInformers, genericConfig.Authorizer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -36,10 +36,14 @@ function run_kube_apiserver() {
|
|||||||
# Admission Controllers to invoke prior to persisting objects in cluster
|
# Admission Controllers to invoke prior to persisting objects in cluster
|
||||||
ADMISSION_CONTROL="NamespaceLifecycle,LimitRanger,ResourceQuota"
|
ADMISSION_CONTROL="NamespaceLifecycle,LimitRanger,ResourceQuota"
|
||||||
|
|
||||||
|
# Include RBAC (to exercise bootstrapping), and AlwaysAllow to allow all actions
|
||||||
|
AUTHORIZATION_MODE="RBAC,AlwaysAllow"
|
||||||
|
|
||||||
"${KUBE_OUTPUT_HOSTBIN}/kube-apiserver" \
|
"${KUBE_OUTPUT_HOSTBIN}/kube-apiserver" \
|
||||||
--address="127.0.0.1" \
|
--address="127.0.0.1" \
|
||||||
--public-address-override="127.0.0.1" \
|
--public-address-override="127.0.0.1" \
|
||||||
--port="${API_PORT}" \
|
--port="${API_PORT}" \
|
||||||
|
--authorization-mode="${AUTHORIZATION_MODE}" \
|
||||||
--admission-control="${ADMISSION_CONTROL}" \
|
--admission-control="${ADMISSION_CONTROL}" \
|
||||||
--etcd-servers="http://${ETCD_HOST}:${ETCD_PORT}" \
|
--etcd-servers="http://${ETCD_HOST}:${ETCD_PORT}" \
|
||||||
--public-address-override="127.0.0.1" \
|
--public-address-override="127.0.0.1" \
|
||||||
|
@ -75,14 +75,17 @@ func (s *BuiltInAuthorizationOptions) AddFlags(fs *pflag.FlagSet) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *BuiltInAuthorizationOptions) ToAuthorizationConfig(informerFactory informers.SharedInformerFactory) authorizer.AuthorizationConfig {
|
func (s *BuiltInAuthorizationOptions) Modes() []string {
|
||||||
modes := []string{}
|
modes := []string{}
|
||||||
if len(s.Mode) > 0 {
|
if len(s.Mode) > 0 {
|
||||||
modes = strings.Split(s.Mode, ",")
|
modes = strings.Split(s.Mode, ",")
|
||||||
}
|
}
|
||||||
|
return modes
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *BuiltInAuthorizationOptions) ToAuthorizationConfig(informerFactory informers.SharedInformerFactory) authorizer.AuthorizationConfig {
|
||||||
return authorizer.AuthorizationConfig{
|
return authorizer.AuthorizationConfig{
|
||||||
AuthorizationModes: modes,
|
AuthorizationModes: s.Modes(),
|
||||||
PolicyFile: s.PolicyFile,
|
PolicyFile: s.PolicyFile,
|
||||||
WebhookConfigFile: s.WebhookConfigFile,
|
WebhookConfigFile: s.WebhookConfigFile,
|
||||||
WebhookCacheAuthorizedTTL: s.WebhookCacheAuthorizedTTL,
|
WebhookCacheAuthorizedTTL: s.WebhookCacheAuthorizedTTL,
|
||||||
|
@ -55,6 +55,8 @@ import (
|
|||||||
"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy"
|
"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const PostStartHookName = "rbac/bootstrap-roles"
|
||||||
|
|
||||||
type RESTStorageProvider struct {
|
type RESTStorageProvider struct {
|
||||||
Authorizer authorizer.Authorizer
|
Authorizer authorizer.Authorizer
|
||||||
}
|
}
|
||||||
@ -123,7 +125,7 @@ func (p RESTStorageProvider) storage(version schema.GroupVersion, apiResourceCon
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p RESTStorageProvider) PostStartHook() (string, genericapiserver.PostStartHookFunc, error) {
|
func (p RESTStorageProvider) PostStartHook() (string, genericapiserver.PostStartHookFunc, error) {
|
||||||
return "rbac/bootstrap-roles", PostStartHook, nil
|
return PostStartHookName, PostStartHook, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func PostStartHook(hookContext genericapiserver.PostStartHookContext) error {
|
func PostStartHook(hookContext genericapiserver.PostStartHookContext) error {
|
||||||
|
@ -96,6 +96,8 @@ type Config struct {
|
|||||||
EnableContentionProfiling bool
|
EnableContentionProfiling bool
|
||||||
EnableMetrics bool
|
EnableMetrics bool
|
||||||
|
|
||||||
|
DisabledPostStartHooks sets.String
|
||||||
|
|
||||||
// Version will enable the /version endpoint if non-nil
|
// Version will enable the /version endpoint if non-nil
|
||||||
Version *version.Info
|
Version *version.Info
|
||||||
// AuditWriter is the destination for audit logs. If nil, they will not be written.
|
// AuditWriter is the destination for audit logs. If nil, they will not be written.
|
||||||
@ -203,6 +205,7 @@ func NewConfig(codecs serializer.CodecFactory) *Config {
|
|||||||
RequestContextMapper: apirequest.NewRequestContextMapper(),
|
RequestContextMapper: apirequest.NewRequestContextMapper(),
|
||||||
BuildHandlerChainFunc: DefaultBuildHandlerChain,
|
BuildHandlerChainFunc: DefaultBuildHandlerChain,
|
||||||
LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix),
|
LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix),
|
||||||
|
DisabledPostStartHooks: sets.NewString(),
|
||||||
HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz},
|
HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz},
|
||||||
EnableIndex: true,
|
EnableIndex: true,
|
||||||
EnableDiscovery: true,
|
EnableDiscovery: true,
|
||||||
@ -415,8 +418,10 @@ func (c completedConfig) constructServer() (*GenericAPIServer, error) {
|
|||||||
swaggerConfig: c.SwaggerConfig,
|
swaggerConfig: c.SwaggerConfig,
|
||||||
openAPIConfig: c.OpenAPIConfig,
|
openAPIConfig: c.OpenAPIConfig,
|
||||||
|
|
||||||
postStartHooks: map[string]postStartHookEntry{},
|
postStartHooks: map[string]postStartHookEntry{},
|
||||||
healthzChecks: c.HealthzChecks,
|
disabledPostStartHooks: c.DisabledPostStartHooks,
|
||||||
|
|
||||||
|
healthzChecks: c.HealthzChecks,
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
|
@ -143,10 +143,11 @@ type GenericAPIServer struct {
|
|||||||
|
|
||||||
// PostStartHooks are each called after the server has started listening, in a separate go func for each
|
// PostStartHooks are each called after the server has started listening, in a separate go func for each
|
||||||
// with no guarantee of ordering between them. The map key is a name used for error reporting.
|
// with no guarantee of ordering between them. The map key is a name used for error reporting.
|
||||||
// It may kill the process with a panic if it wishes to by returning an error
|
// It may kill the process with a panic if it wishes to by returning an error.
|
||||||
postStartHookLock sync.Mutex
|
postStartHookLock sync.Mutex
|
||||||
postStartHooks map[string]postStartHookEntry
|
postStartHooks map[string]postStartHookEntry
|
||||||
postStartHooksCalled bool
|
postStartHooksCalled bool
|
||||||
|
disabledPostStartHooks sets.String
|
||||||
|
|
||||||
// healthz checks
|
// healthz checks
|
||||||
healthzLock sync.Mutex
|
healthzLock sync.Mutex
|
||||||
|
@ -65,6 +65,9 @@ func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc)
|
|||||||
if hook == nil {
|
if hook == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if s.disabledPostStartHooks.Has(name) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
s.postStartHookLock.Lock()
|
s.postStartHookLock.Lock()
|
||||||
defer s.postStartHookLock.Unlock()
|
defer s.postStartHookLock.Unlock()
|
||||||
|
Loading…
Reference in New Issue
Block a user