From f4ff26679f5d6d60fd449dba7e4e2b505c49c944 Mon Sep 17 00:00:00 2001 From: Mike Danese Date: Fri, 2 Nov 2018 13:22:55 -0700 Subject: [PATCH] add BoundServiceAccountTokenVolume feature * require TokenRequest to be enabled and configured * bind ca.crt publisher to this feature rather than to TokenRequest --- cmd/kube-controller-manager/app/certificates.go | 2 +- pkg/features/kube_features.go | 9 +++++++++ pkg/kubeapiserver/options/authentication.go | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/cmd/kube-controller-manager/app/certificates.go b/cmd/kube-controller-manager/app/certificates.go index bb9ca7afe2..cccca465b7 100644 --- a/cmd/kube-controller-manager/app/certificates.go +++ b/cmd/kube-controller-manager/app/certificates.go @@ -125,7 +125,7 @@ func startCSRCleanerController(ctx ControllerContext) (http.Handler, bool, error } func startRootCACertPublisher(ctx ControllerContext) (http.Handler, bool, error) { - if !utilfeature.DefaultFeatureGate.Enabled(features.TokenRequest) { + if !utilfeature.DefaultFeatureGate.Enabled(features.BoundServiceAccountTokenVolume) { return nil, false, nil } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 66770c1757..48922af0d1 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -269,6 +269,14 @@ const ( // Enable ServiceAccountTokenVolumeProjection support in ProjectedVolumes. TokenRequestProjection utilfeature.Feature = "TokenRequestProjection" + // owner: @mikedanese + // alpha: v1.13 + // + // Migrate ServiceAccount volumes to use a projected volume consisting of a + // ServiceAccountTokenVolumeProjection. This feature adds new required flags + // to the API server. + BoundServiceAccountTokenVolume utilfeature.Feature = "BoundServiceAccountTokenVolume" + // owner: @Random-Liu // beta: v1.11 // @@ -428,6 +436,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS ScheduleDaemonSetPods: {Default: true, PreRelease: utilfeature.Beta}, TokenRequest: {Default: true, PreRelease: utilfeature.Beta}, TokenRequestProjection: {Default: true, PreRelease: utilfeature.Beta}, + BoundServiceAccountTokenVolume: {Default: false, PreRelease: utilfeature.Alpha}, CRIContainerLogRotation: {Default: true, PreRelease: utilfeature.Beta}, GCERegionalPersistentDisk: {Default: true, PreRelease: utilfeature.GA}, RunAsGroup: {Default: false, PreRelease: utilfeature.Alpha}, diff --git a/pkg/kubeapiserver/options/authentication.go b/pkg/kubeapiserver/options/authentication.go index 2c149cbf32..6fe6ca029c 100644 --- a/pkg/kubeapiserver/options/authentication.go +++ b/pkg/kubeapiserver/options/authentication.go @@ -17,6 +17,7 @@ limitations under the License. package options import ( + "errors" "fmt" "net/url" "strings" @@ -29,7 +30,9 @@ import ( "k8s.io/apiserver/pkg/authentication/authenticator" genericapiserver "k8s.io/apiserver/pkg/server" genericoptions "k8s.io/apiserver/pkg/server/options" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/flag" + "k8s.io/kubernetes/pkg/features" kubeauthenticator "k8s.io/kubernetes/pkg/kubeapiserver/authenticator" authzmodes "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes" ) @@ -170,6 +173,18 @@ func (s *BuiltInAuthenticationOptions) Validate() []error { allErrors = append(allErrors, fmt.Errorf("service-account-issuer contained a ':' but was not a valid URL: %v", err)) } } + if s.ServiceAccounts != nil && utilfeature.DefaultFeatureGate.Enabled(features.BoundServiceAccountTokenVolume) { + if !utilfeature.DefaultFeatureGate.Enabled(features.TokenRequest) || !utilfeature.DefaultFeatureGate.Enabled(features.TokenRequestProjection) { + allErrors = append(allErrors, errors.New("If the BoundServiceAccountTokenVolume feature is enabled,"+ + " the TokenRequest and TokenRequestProjection features must also be enabled")) + } + if len(s.ServiceAccounts.Issuer) == 0 { + allErrors = append(allErrors, errors.New("service-account-issuer is a required flag when BoundServiceAccountTokenVolume is enabled")) + } + if len(s.ServiceAccounts.KeyFiles) == 0 { + allErrors = append(allErrors, errors.New("service-account-key-file is a required flag when BoundServiceAccountTokenVolume is enabled")) + } + } return allErrors }