From d79d4e85259eca065a153367940706a55a510c7b Mon Sep 17 00:00:00 2001 From: Pavithra Ramesh Date: Mon, 15 Jul 2019 00:01:33 -0700 Subject: [PATCH] Handle ImplementedElsewhere error in service_controller This is used when the cloudprovider layer is not implementing loadBalancer service. Implementation will be in a different controller running on master. --- pkg/controller/service/service_controller.go | 11 ++++++++++- .../gce/gce_loadbalancer_internal.go | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/controller/service/service_controller.go b/pkg/controller/service/service_controller.go index a3da8b6554a..ffba3de7873 100644 --- a/pkg/controller/service/service_controller.go +++ b/pkg/controller/service/service_controller.go @@ -339,6 +339,10 @@ func (s *ServiceController) syncLoadBalancerIfNeeded(service *v1.Service, key st } newStatus, err = s.ensureLoadBalancer(service) if err != nil { + if err == cloudprovider.ImplementedElsewhere { + klog.Infof("LoadBalancer for service %s not implemented by alternate controller %s, Ignoring error", key, s.cloud.ProviderName()) + return op, nil + } return op, fmt.Errorf("failed to ensure load balancer: %v", err) } s.eventRecorder.Event(service, v1.EventTypeNormal, "EnsuredLoadBalancer", "Ensured load balancer") @@ -703,7 +707,12 @@ func (s *ServiceController) lockedUpdateLoadBalancerHosts(service *v1.Service, h } return nil } - + if err == cloudprovider.ImplementedElsewhere { + // Skip error since LoadBalancer implementation is in some other controller. In this case, the loadBalancer will likely not + // exist and will be handled in the if block below. Adding this check in case the alternate loadBalancer implementation + // uses the same naming scheme. + return nil + } // It's only an actual error if the load balancer still exists. if _, exists, err := s.balancer.GetLoadBalancer(context.TODO(), s.clusterName, service); err != nil { runtime.HandleError(fmt.Errorf("failed to check if load balancer exists for service %s/%s: %v", service.Namespace, service.Name, err)) diff --git a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go index 881cf9ab21a..89182a1716c 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go +++ b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go @@ -27,6 +27,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + cloudprovider "k8s.io/cloud-provider" servicehelpers "k8s.io/cloud-provider/service/helpers" "k8s.io/klog" ) @@ -36,6 +37,10 @@ const ( ) func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, existingFwdRule *compute.ForwardingRule, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) { + if g.AlphaFeatureGate.Enabled("ILBSubsets") { + return nil, cloudprovider.NotImplemented + } + nm := types.NamespacedName{Name: svc.Name, Namespace: svc.Namespace} ports, protocol := getPortsAndProtocol(svc.Spec.Ports) if protocol != v1.ProtocolTCP && protocol != v1.ProtocolUDP { @@ -201,6 +206,9 @@ func (g *Cloud) clearPreviousInternalResources(svc *v1.Service, loadBalancerName // updateInternalLoadBalancer is called when the list of nodes has changed. Therefore, only the instance groups // and possibly the backend service need to be updated. func (g *Cloud) updateInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, nodes []*v1.Node) error { + if g.AlphaFeatureGate.Enabled("ILBSubsets") { + return cloudprovider.NotImplemented + } g.sharedResourceLock.Lock() defer g.sharedResourceLock.Unlock()