@@ -41,6 +41,8 @@ import (
41
41
"k8s.io/kubernetes/pkg/serviceaccount"
42
42
)
43
43
44
+ const ServiceServingCASecretKey = "service-ca.crt"
45
+
44
46
// RemoveTokenBackoff is the recommended (empirical) retry interval for removing
45
47
// a secret reference from a service account when the secret is deleted. It is
46
48
// exported for use by custom secret controllers.
@@ -66,6 +68,9 @@ type TokensControllerOptions struct {
66
68
// MaxRetries controls the maximum number of times a particular key is retried before giving up
67
69
// If zero, a default max is used
68
70
MaxRetries int
71
+
72
+ // This CA will be added in the secrets of service accounts
73
+ ServiceServingCA []byte
69
74
}
70
75
71
76
// NewTokensController returns a new *TokensController.
@@ -76,9 +81,10 @@ func NewTokensController(logger klog.Logger, serviceAccounts informers.ServiceAc
76
81
}
77
82
78
83
e := & TokensController {
79
- client : cl ,
80
- token : options .TokenGenerator ,
81
- rootCA : options .RootCA ,
84
+ client : cl ,
85
+ token : options .TokenGenerator ,
86
+ rootCA : options .RootCA ,
87
+ serviceServingCA : options .ServiceServingCA ,
82
88
83
89
syncServiceAccountQueue : workqueue .NewTypedRateLimitingQueueWithConfig (
84
90
workqueue .DefaultTypedControllerRateLimiter [serviceAccountQueueKey ](),
@@ -137,7 +143,8 @@ type TokensController struct {
137
143
client clientset.Interface
138
144
token serviceaccount.TokenGenerator
139
145
140
- rootCA []byte
146
+ rootCA []byte
147
+ serviceServingCA []byte
141
148
142
149
serviceAccounts listersv1.ServiceAccountLister
143
150
// updatedSecrets is a wrapper around the shared cache which allows us to record
@@ -355,22 +362,23 @@ func (e *TokensController) deleteToken(ns, name string, uid types.UID) ( /*retry
355
362
return true , err
356
363
}
357
364
358
- func (e * TokensController ) secretUpdateNeeded (secret * v1.Secret ) (bool , bool , bool ) {
365
+ func (e * TokensController ) secretUpdateNeeded (secret * v1.Secret ) (bool , bool , bool , bool ) {
359
366
caData := secret .Data [v1 .ServiceAccountRootCAKey ]
360
367
needsCA := len (e .rootCA ) > 0 && ! bytes .Equal (caData , e .rootCA )
368
+ needsServiceServingCA := len (e .serviceServingCA ) > 0 && bytes .Compare (secret .Data [ServiceServingCASecretKey ], e .serviceServingCA ) != 0
361
369
362
370
needsNamespace := len (secret .Data [v1 .ServiceAccountNamespaceKey ]) == 0
363
371
364
372
tokenData := secret .Data [v1 .ServiceAccountTokenKey ]
365
373
needsToken := len (tokenData ) == 0
366
374
367
- return needsCA , needsNamespace , needsToken
375
+ return needsCA , needsServiceServingCA , needsNamespace , needsToken
368
376
}
369
377
370
378
// generateTokenIfNeeded populates the token data for the given Secret if not already set
371
379
func (e * TokensController ) generateTokenIfNeeded (logger klog.Logger , serviceAccount * v1.ServiceAccount , cachedSecret * v1.Secret ) ( /* retry */ bool , error ) {
372
380
// Check the cached secret to see if changes are needed
373
- if needsCA , needsNamespace , needsToken := e .secretUpdateNeeded (cachedSecret ); ! needsCA && ! needsToken && ! needsNamespace {
381
+ if needsCA , needsServiceServingCA , needsNamespace , needsToken := e .secretUpdateNeeded (cachedSecret ); ! needsCA && ! needsServiceServingCA && ! needsToken && ! needsNamespace {
374
382
return false , nil
375
383
}
376
384
@@ -389,8 +397,8 @@ func (e *TokensController) generateTokenIfNeeded(logger klog.Logger, serviceAcco
389
397
return false , nil
390
398
}
391
399
392
- needsCA , needsNamespace , needsToken := e .secretUpdateNeeded (liveSecret )
393
- if ! needsCA && ! needsToken && ! needsNamespace {
400
+ needsCA , needsServiceServingCA , needsNamespace , needsToken := e .secretUpdateNeeded (liveSecret )
401
+ if ! needsCA && ! needsServiceServingCA && ! needsToken && ! needsNamespace {
394
402
return false , nil
395
403
}
396
404
@@ -405,6 +413,9 @@ func (e *TokensController) generateTokenIfNeeded(logger klog.Logger, serviceAcco
405
413
if needsCA {
406
414
liveSecret .Data [v1 .ServiceAccountRootCAKey ] = e .rootCA
407
415
}
416
+ if needsServiceServingCA {
417
+ liveSecret .Data [ServiceServingCASecretKey ] = e .serviceServingCA
418
+ }
408
419
// Set the namespace
409
420
if needsNamespace {
410
421
liveSecret .Data [v1 .ServiceAccountNamespaceKey ] = []byte (liveSecret .Namespace )
0 commit comments