From 594a326af1aad16c984d0c2a4cd821b23e9a9193 Mon Sep 17 00:00:00 2001 From: gujing <925973396@qq.com> Date: Fri, 27 Nov 2020 15:22:05 +0800 Subject: [PATCH] do not sync non-LoadBalancer type svc --- .../controller/service/context.go | 32 +++++++++++++++++++ .../controller/service/controller.go | 26 +++++++-------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/cloud-controller-manager/controller/service/context.go b/cloud-controller-manager/controller/service/context.go index be984799a..c31450044 100644 --- a/cloud-controller-manager/controller/service/context.go +++ b/cloud-controller-manager/controller/service/context.go @@ -3,6 +3,7 @@ package service import ( "k8s.io/api/core/v1" "k8s.io/client-go/tools/record" + "k8s.io/cloud-provider-alibaba-cloud/cloud-controller-manager/utils" "k8s.io/klog" "reflect" "sort" @@ -36,6 +37,21 @@ func (c *Context) Range(f func(key string, value *v1.Service) bool) { } func (c *Context) Remove(name string) { c.ctx.Delete(name) } +func NeedAdd(newService *v1.Service) bool { + if NeedLoadBalancer(newService) { + return true + } + + // was LoadBalancer + _, ok := newService.Labels[utils.LabelServiceHash] + if ok { + klog.Infof("service %s/%s has hash label, which may was LoadBalancer", + newService.Namespace, newService.Name) + return true + } + return false +} + // NeedUpdate compare old and new service for possible changes func NeedUpdate(old, newm *v1.Service, record record.EventRecorder) bool { if !NeedLoadBalancer(old) && @@ -83,6 +99,22 @@ func NeedUpdate(old, newm *v1.Service, record record.EventRecorder) bool { return false } +//NeedDelete +func NeedDelete(service *v1.Service) bool { + if NeedLoadBalancer(service) { + return true + } + + // was LoadBalancer + _, ok := service.Labels[utils.LabelServiceHash] + if ok { + klog.Infof("service %s/%s has hash label, which may was LoadBalancer", + service.Namespace, service.Name) + return true + } + return false +} + func NeedLoadBalancer(service *v1.Service) bool { return service.Spec.Type == v1.ServiceTypeLoadBalancer } diff --git a/cloud-controller-manager/controller/service/controller.go b/cloud-controller-manager/controller/service/controller.go index 167b91d87..e50f71958 100644 --- a/cloud-controller-manager/controller/service/controller.go +++ b/cloud-controller-manager/controller/service/controller.go @@ -206,7 +206,7 @@ func (con *Controller) HandlerForNodesChange( utils.Logf(svc, "node change: class not empty, skip process ") return true } - utils.Logf(svc, "node change: enque service") + utils.Logf(svc, "node change: enqueue service") Enqueue(que, key(svc)) return true }, @@ -241,7 +241,7 @@ func (con *Controller) HandlerForEndpointChange( syncEndpoints := func(epd interface{}) { ep, ok := epd.(*v1.Endpoints) if !ok || ep == nil { - klog.Info("endpoints change: endpoint object is nil, skip") + klog.Info("endpoint change: endpoint object is nil, skip") return } svc := ctx.Get(fmt.Sprintf("%s/%s", ep.Namespace, ep.Name)) @@ -314,32 +314,28 @@ func (con *Controller) HandlerForServiceChange( cache.ResourceEventHandlerFuncs{ AddFunc: func(add interface{}) { svc, ok := add.(*v1.Service) - if !ok { - utils.Logf(svc, "add: not type service %s, skip", reflect.TypeOf(add)) - return + if ok && NeedAdd(svc) { + utils.Logf(svc, "controller: service addition event") + syncService(svc) } - utils.Logf(svc, "service addition event received %s", reflect.TypeOf(svc)) - syncService(svc) }, UpdateFunc: func(old, cur interface{}) { oldd, ok1 := old.(*v1.Service) curr, ok2 := cur.(*v1.Service) if ok1 && ok2 && NeedUpdate(oldd, curr, record) { - utils.Logf(curr, "service update event") + utils.Logf(curr, "controller: service update event") syncService(curr) } }, DeleteFunc: func(cur interface{}) { svc, ok := cur.(*v1.Service) - if !ok { - utils.Logf(svc, "delete: not type service %s, skip", reflect.TypeOf(cur)) - return + if ok && NeedDelete(svc) { + utils.Logf(svc, "controller: service deletion received, %s", utils.PrettyJson(svc)) + // recorder service in local context + context.Set(key(svc), svc) + syncService(svc) } - utils.Logf(svc, "controller: service deletion received, %s", utils.PrettyJson(svc)) - // recorder service in local context - context.Set(key(svc), svc) - syncService(svc) }, }, SERVICE_SYNC_PERIOD,