Merge pull request #68188 from esevan/fix_bug_openstack_lb

Automatic merge from submit-queue (batch tested with PRs 68135, 68188). If you want to cherry-pick this change to another branch, please follow the instructions here: https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md.

Fixup openstack cloud provider loadbalancer deletion error

This change enables ```getLoadBalancer``` to return the loadbalancer even if no floating ip is associated to the VIP port of the loadbalancer.

Signed-off-by: Eunsoo Park <esevan.park@gmail.com>



**What this PR does / why we need it**:
This PR fixes the bug like below.
```
Warning  CreatingLoadBalancerFailed  17m (x3445 over 12d)  service-controller  Error creating load balancer (will retry): error getting LB for service default/influxdb: error getting floating ip for port 81253cae-acd6-4bed-8006-814c8729be8c: failed to find object
```
**Special notes for your reviewer**:
Refer to following bug description for better understanding of this PR.
When k8s service type is changed from LoadBalancer to others, there's a deleting loadbalancer process in kubernetes cloud provider as below.

https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/service/service_controller.go#L284 
```
if !wantsLoadBalancer(service) {
	_, exists, err := s.balancer.GetLoadBalancer(context.TODO(), s.clusterName, service)
	if err != nil {
		return fmt.Errorf("error getting LB for service %s: %v", key, err)
	}
	if exists {
		glog.Infof("Deleting existing load balancer for service %s that no longer needs a loadbalancer.", key)
		s.eventRecorder.Event(service, v1.EventTypeNormal, "DeletingLoadBalancer", "Deleting loadbalancer")
		if err := s.balancer.EnsureLoadBalancerDeleted(context.TODO(), s.clusterName, service); err != nil {
			return err
		}
		s.eventRecorder.Event(service, v1.EventTypeNormal, "DeletedLoadBalancer", "Deleted loadbalancer")
	}
```

Openstack cloud provider returns error even though LB exists since there's no associated floating IP with VIP port. 
https://github.com/kubernetes/kubernetes/blob/master/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go#L476

```
floatIP, err := getFloatingIPByPortID(lbaas.network, portID)
if err != nil {
	return nil, false, fmt.Errorf("error getting floating ip for port %s: %v", portID, err)
}
```

This caused ```GetLoadBalancer()``` failed and retrying over and over in ```processServiceUpdate``` of ```k8sServiceController```.


**Release note**:

```release-note
NONE
```
pull/8/head
Kubernetes Submit Queue 2018-09-03 18:46:29 -07:00 committed by GitHub
commit e5b30e05fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 5 additions and 2 deletions

View File

@ -474,10 +474,13 @@ func (lbaas *LbaasV2) GetLoadBalancer(ctx context.Context, clusterName string, s
portID := loadbalancer.VipPortID
if portID != "" {
floatIP, err := getFloatingIPByPortID(lbaas.network, portID)
if err != nil {
if err != nil && err != ErrNotFound {
return nil, false, fmt.Errorf("error getting floating ip for port %s: %v", portID, err)
}
status.Ingress = []v1.LoadBalancerIngress{{IP: floatIP.FloatingIP}}
if floatIP != nil {
status.Ingress = []v1.LoadBalancerIngress{{IP: floatIP.FloatingIP}}
}
} else {
status.Ingress = []v1.LoadBalancerIngress{{IP: loadbalancer.VipAddress}}
}