Skip to content

Commit e59ac13

Browse files
authored
Merge pull request #991 from aledbf/ssl-refactoring
Remove secret sync loop
2 parents bc6e584 + 5a1f845 commit e59ac13

File tree

3 files changed

+64
-63
lines changed

3 files changed

+64
-63
lines changed

core/pkg/ingress/controller/backend_ssl.go

+45-33
Original file line numberDiff line numberDiff line change
@@ -24,47 +24,46 @@ import (
2424
"github.com/golang/glog"
2525

2626
api "k8s.io/client-go/pkg/api/v1"
27+
extensions "k8s.io/client-go/pkg/apis/extensions/v1beta1"
2728
"k8s.io/client-go/tools/cache"
2829

2930
"k8s.io/ingress/core/pkg/ingress"
31+
"k8s.io/ingress/core/pkg/ingress/annotations/parser"
3032
"k8s.io/ingress/core/pkg/net/ssl"
3133
)
3234

3335
// syncSecret keeps in sync Secrets used by Ingress rules with the files on
3436
// disk to allow copy of the content of the secret to disk to be used
3537
// by external processes.
36-
func (ic *GenericController) syncSecret() {
37-
glog.V(3).Infof("starting syncing of secrets")
38+
func (ic *GenericController) syncSecret(key string) {
39+
glog.V(3).Infof("starting syncing of secret %v", key)
3840

3941
var cert *ingress.SSLCert
4042
var err error
4143

42-
for _, k := range ic.secretTracker.List() {
43-
key := k.(string)
44-
cert, err = ic.getPemCertificate(key)
45-
if err != nil {
46-
glog.Warningf("error obtaining PEM from secret %v: %v", key, err)
47-
continue
48-
}
44+
cert, err = ic.getPemCertificate(key)
45+
if err != nil {
46+
glog.Warningf("error obtaining PEM from secret %v: %v", key, err)
47+
return
48+
}
4949

50-
// create certificates and add or update the item in the store
51-
cur, exists := ic.sslCertTracker.Get(key)
52-
if exists {
53-
s := cur.(*ingress.SSLCert)
54-
if reflect.DeepEqual(s, cert) {
55-
// no need to update
56-
continue
57-
}
58-
glog.Infof("updating secret %v in the local store", key)
59-
ic.sslCertTracker.Update(key, cert)
60-
ic.reloadRequired = true
61-
continue
50+
// create certificates and add or update the item in the store
51+
cur, exists := ic.sslCertTracker.Get(key)
52+
if exists {
53+
s := cur.(*ingress.SSLCert)
54+
if reflect.DeepEqual(s, cert) {
55+
// no need to update
56+
return
6257
}
63-
64-
glog.Infof("adding secret %v to the local store", key)
65-
ic.sslCertTracker.Add(key, cert)
58+
glog.Infof("updating secret %v in the local store", key)
59+
ic.sslCertTracker.Update(key, cert)
6660
ic.reloadRequired = true
61+
return
6762
}
63+
64+
glog.Infof("adding secret %v to the local store", key)
65+
ic.sslCertTracker.Add(key, cert)
66+
ic.reloadRequired = true
6867
}
6968

7069
// getPemCertificate receives a secret, and creates a ingress.SSLCert as return.
@@ -112,6 +111,26 @@ func (ic *GenericController) getPemCertificate(secretName string) (*ingress.SSLC
112111
return s, nil
113112
}
114113

114+
// secrReferenced checks if a secret is referenced or not by one or more Ingress rules
115+
func (ic *GenericController) secrReferenced(name, namespace string) bool {
116+
for _, ingIf := range ic.ingLister.Store.List() {
117+
ing := ingIf.(*extensions.Ingress)
118+
str, err := parser.GetStringAnnotation("ingress.kubernetes.io/auth-tls-secret", ing)
119+
if err == nil && str == fmt.Sprintf("%v/%v", namespace, name) {
120+
return true
121+
}
122+
if ing.Namespace != namespace {
123+
continue
124+
}
125+
for _, tls := range ing.Spec.TLS {
126+
if tls.SecretName == name {
127+
return true
128+
}
129+
}
130+
}
131+
return false
132+
}
133+
115134
// sslCertTracker holds a store of referenced Secrets in Ingress rules
116135
type sslCertTracker struct {
117136
cache.ThreadSafeStore
@@ -123,13 +142,6 @@ func newSSLCertTracker() *sslCertTracker {
123142
}
124143
}
125144

126-
// secretTracker holds a store of Secrets
127-
type secretTracker struct {
128-
cache.ThreadSafeStore
129-
}
130-
131-
func newSecretTracker() *secretTracker {
132-
return &secretTracker{
133-
cache.NewThreadSafeStore(cache.Indexers{}, cache.Indices{}),
134-
}
145+
func (s *sslCertTracker) DeleteAll(key string) {
146+
s.Delete(key)
135147
}

core/pkg/ingress/controller/backend_ssl_test.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ func buildGenericControllerForBackendSSL() *GenericController {
110110
mapController: buildControllerForBackendSSL(),
111111

112112
sslCertTracker: newSSLCertTracker(),
113-
secretTracker: newSecretTracker(),
114113
}
115114
}
116115

@@ -157,7 +156,6 @@ func TestSyncSecret(t *testing.T) {
157156
for _, foo := range foos {
158157
t.Run(foo.tn, func(t *testing.T) {
159158
ic := buildGenericControllerForBackendSSL()
160-
ic.secretTracker.Add(foo.secretName, foo.secretName)
161159

162160
// init secret for getPemCertificate
163161
secret := buildSecretForBackendSSL()
@@ -166,16 +164,17 @@ func TestSyncSecret(t *testing.T) {
166164
secret.Data = foo.Data
167165
ic.secrLister.Add(secret)
168166

167+
key := "default/foo_secret"
169168
// for add
170-
ic.syncSecret()
169+
ic.syncSecret(key)
171170
if foo.expectSuccess {
172171
// validate
173-
_, exist := ic.sslCertTracker.Get(foo.secretName)
172+
_, exist := ic.sslCertTracker.Get(key)
174173
if !exist {
175174
t.Errorf("Failed to sync secret: %s", foo.secretName)
176175
} else {
177176
// for update
178-
ic.syncSecret()
177+
ic.syncSecret(key)
179178
}
180179
}
181180
})

core/pkg/ingress/controller/controller.go

+15-25
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
"k8s.io/apimachinery/pkg/fields"
3333
"k8s.io/apimachinery/pkg/util/intstr"
3434
"k8s.io/apimachinery/pkg/util/runtime"
35-
"k8s.io/apimachinery/pkg/util/wait"
3635
clientset "k8s.io/client-go/kubernetes"
3736
"k8s.io/client-go/kubernetes/scheme"
3837
unversionedcore "k8s.io/client-go/kubernetes/typed/core/v1"
@@ -51,7 +50,6 @@ import (
5150
"k8s.io/ingress/core/pkg/ingress/defaults"
5251
"k8s.io/ingress/core/pkg/ingress/resolver"
5352
"k8s.io/ingress/core/pkg/ingress/status"
54-
"k8s.io/ingress/core/pkg/ingress/status/leaderelection/resourcelock"
5553
"k8s.io/ingress/core/pkg/ingress/store"
5654
"k8s.io/ingress/core/pkg/k8s"
5755
"k8s.io/ingress/core/pkg/net/ssl"
@@ -99,8 +97,6 @@ type GenericController struct {
9997
// local store of SSL certificates
10098
// (only certificates used in ingress)
10199
sslCertTracker *sslCertTracker
102-
// store of secret names referenced from Ingress
103-
secretTracker *secretTracker
104100

105101
syncRateLimiter flowcontrol.RateLimiter
106102

@@ -167,7 +163,6 @@ func newIngressController(config *Configuration) *GenericController {
167163
Component: "ingress-controller",
168164
}),
169165
sslCertTracker: newSSLCertTracker(),
170-
secretTracker: newSecretTracker(),
171166
}
172167

173168
ic.syncQueue = task.NewTaskQueue(ic.syncIngress)
@@ -219,39 +214,36 @@ func newIngressController(config *Configuration) *GenericController {
219214
}
220215

221216
secrEventHandler := cache.ResourceEventHandlerFuncs{
217+
AddFunc: func(obj interface{}) {
218+
sec := obj.(*api.Secret)
219+
key := fmt.Sprintf("%v/%v", sec.Namespace, sec.Name)
220+
if ic.secrReferenced(sec.Namespace, sec.Name) {
221+
ic.syncSecret(key)
222+
}
223+
},
222224
UpdateFunc: func(old, cur interface{}) {
223225
if !reflect.DeepEqual(old, cur) {
224-
ic.syncSecret()
226+
sec := cur.(*api.Secret)
227+
key := fmt.Sprintf("%v/%v", sec.Namespace, sec.Name)
228+
ic.syncSecret(key)
225229
}
226230
},
227231
DeleteFunc: func(obj interface{}) {
228232
sec := obj.(*api.Secret)
229233
key := fmt.Sprintf("%v/%v", sec.Namespace, sec.Name)
230-
ic.sslCertTracker.Delete(key)
231-
ic.secretTracker.Delete(key)
234+
ic.sslCertTracker.DeleteAll(key)
232235
},
233236
}
234237

235238
eventHandler := cache.ResourceEventHandlerFuncs{
236239
AddFunc: func(obj interface{}) {
237-
ep := obj.(*api.Endpoints)
238-
_, found := ep.Annotations[resourcelock.LeaderElectionRecordAnnotationKey]
239-
if found {
240-
return
241-
}
242240
ic.syncQueue.Enqueue(obj)
243241
},
244242
DeleteFunc: func(obj interface{}) {
245243
ic.syncQueue.Enqueue(obj)
246244
},
247245
UpdateFunc: func(old, cur interface{}) {
248246
if !reflect.DeepEqual(old, cur) {
249-
ep := cur.(*api.Endpoints)
250-
_, found := ep.Annotations[resourcelock.LeaderElectionRecordAnnotationKey]
251-
if found {
252-
return
253-
}
254-
255247
ic.syncQueue.Enqueue(cur)
256248
}
257249
},
@@ -754,8 +746,8 @@ func (ic *GenericController) getBackendServers() ([]*ingress.Backend, []*ingress
754746

755747
// GetAuthCertificate ...
756748
func (ic GenericController) GetAuthCertificate(secretName string) (*resolver.AuthSSLCert, error) {
757-
if _, exists := ic.secretTracker.Get(secretName); !exists {
758-
ic.secretTracker.Add(secretName, secretName)
749+
if _, exists := ic.sslCertTracker.Get(secretName); !exists {
750+
ic.syncSecret(secretName)
759751
}
760752

761753
_, err := ic.GetSecret(secretName)
@@ -1168,9 +1160,9 @@ func (ic GenericController) extractSecretNames(ing *extensions.Ingress) {
11681160
}
11691161

11701162
key := fmt.Sprintf("%v/%v", ing.Namespace, tls.SecretName)
1171-
_, exists := ic.secretTracker.Get(key)
1163+
_, exists := ic.sslCertTracker.Get(key)
11721164
if !exists {
1173-
ic.secretTracker.Add(key, key)
1165+
ic.syncSecret(key)
11741166
}
11751167
}
11761168
}
@@ -1219,8 +1211,6 @@ func (ic GenericController) Start() {
12191211

12201212
go ic.syncQueue.Run(10*time.Second, ic.stopCh)
12211213

1222-
go wait.Forever(ic.syncSecret, 10*time.Second)
1223-
12241214
if ic.syncStatus != nil {
12251215
go ic.syncStatus.Run(ic.stopCh)
12261216
}

0 commit comments

Comments
 (0)