Merge pull request #4586 from aledbf/fix-reload

Fix reload when a configmap changes
This commit is contained in:
Kubernetes Prow Robot 2019-09-24 07:23:28 -07:00 committed by GitHub
commit cb2889b87b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 72 additions and 28 deletions

View file

@ -22,6 +22,7 @@ import (
"strings" "strings"
networking "k8s.io/api/networking/v1beta1" networking "k8s.io/api/networking/v1beta1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/ingress-nginx/internal/ingress/errors" "k8s.io/ingress-nginx/internal/ingress/errors"
) )
@ -130,3 +131,24 @@ func normalizeString(input string) string {
return strings.Join(trimmedContent, "\n") return strings.Join(trimmedContent, "\n")
} }
var configmapAnnotations = sets.NewString(
"auth-proxy-set-header",
"fastcgi-params-configmap",
)
// AnnotationsReferencesConfigmap checks if at least one annotation in the Ingress rule
// references a configmap.
func AnnotationsReferencesConfigmap(ing *networking.Ingress) bool {
if ing == nil || len(ing.GetAnnotations()) == 0 {
return false
}
for name := range ing.GetAnnotations() {
if configmapAnnotations.Has(name) {
return true
}
}
return false
}

View file

@ -525,29 +525,45 @@ func New(
}, },
} }
// TODO: add e2e test to verify that changes to one or more configmap trigger an update
changeTriggerUpdate := func(name string) bool {
return name == configmap || name == tcp || name == udp
}
cmEventHandler := cache.ResourceEventHandlerFuncs{ cmEventHandler := cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
cm := obj.(*corev1.ConfigMap) cm := obj.(*corev1.ConfigMap)
key := k8s.MetaNamespaceKey(cm) key := k8s.MetaNamespaceKey(cm)
// updates to configuration configmaps can trigger an update // updates to configuration configmaps can trigger an update
if key == configmap || key == tcp || key == udp { if changeTriggerUpdate(key) {
recorder.Eventf(cm, corev1.EventTypeNormal, "CREATE", fmt.Sprintf("ConfigMap %v", key)) recorder.Eventf(cm, corev1.EventTypeNormal, "CREATE", fmt.Sprintf("ConfigMap %v", key))
if key == configmap { if key == configmap {
store.setConfig(cm) store.setConfig(cm)
} }
}
updateCh.In() <- Event{ updateCh.In() <- Event{
Type: ConfigurationEvent, Type: ConfigurationEvent,
Obj: obj, Obj: obj,
} }
}
}, },
UpdateFunc: func(old, cur interface{}) { UpdateFunc: func(old, cur interface{}) {
if !reflect.DeepEqual(old, cur) { if reflect.DeepEqual(old, cur) {
return
}
// used to limit the number of events
triggerUpdate := false
cm := cur.(*corev1.ConfigMap) cm := cur.(*corev1.ConfigMap)
key := k8s.MetaNamespaceKey(cm) key := k8s.MetaNamespaceKey(cm)
// updates to configuration configmaps can trigger an update // updates to configuration configmaps can trigger an update
if key == configmap || key == tcp || key == udp { if changeTriggerUpdate(key) {
recorder.Eventf(cm, corev1.EventTypeNormal, "UPDATE", fmt.Sprintf("ConfigMap %v", key)) recorder.Eventf(cm, corev1.EventTypeNormal, "UPDATE", fmt.Sprintf("ConfigMap %v", key))
triggerUpdate = true
}
if key == configmap { if key == configmap {
store.setConfig(cm) store.setConfig(cm)
} }
@ -560,15 +576,20 @@ func New(
klog.Errorf("could not find Ingress %v in local store: %v", key, err) klog.Errorf("could not find Ingress %v in local store: %v", key, err)
continue continue
} }
if parser.AnnotationsReferencesConfigmap(ing) {
recorder.Eventf(cm, corev1.EventTypeNormal, "UPDATE", fmt.Sprintf("ConfigMap %v", key))
store.syncIngress(ing) store.syncIngress(ing)
triggerUpdate = true
}
} }
if triggerUpdate {
updateCh.In() <- Event{ updateCh.In() <- Event{
Type: ConfigurationEvent, Type: ConfigurationEvent,
Obj: cur, Obj: cur,
} }
} }
}
}, },
} }
@ -683,6 +704,7 @@ func (s *k8sStore) updateSecretIngressMap(ing *networkingv1beta1.Ingress) {
"auth-secret", "auth-secret",
"auth-tls-secret", "auth-tls-secret",
"proxy-ssl-secret", "proxy-ssl-secret",
"secure-verify-ca-secret",
} }
for _, ann := range secretAnnotations { for _, ann := range secretAnnotations {
secrKey, err := objectRefAnnotationNsKey(ann, ing) secrKey, err := objectRefAnnotationNsKey(ann, ing)