mirror of https://github.com/kubernetes/kops.git
				
				
				
			Merge pull request #13363 from heybronson/fix-nlb-drain
wait for all targetGroups to drain
This commit is contained in:
		
						commit
						34b83dbbd2
					
				|  | @ -662,12 +662,44 @@ func deregisterInstanceFromClassicLoadBalancer(c AWSCloud, loadBalancerNames []s | |||
| // deregisterInstanceFromTargetGroups ensures that instances are fully unused in the corresponding targetGroups before instance termination.
 | ||||
| // this ensures that connections are fully drained from the instance before terminating.
 | ||||
| func deregisterInstanceFromTargetGroups(c AWSCloud, targetGroupArns []string, instanceId string) error { | ||||
| 	klog.Infof("Deregistering instance from targetGroups: %v", targetGroupArns) | ||||
| 	eg, _ := errgroup.WithContext(context.Background()) | ||||
| 
 | ||||
| 	for _, targetGroupArn := range targetGroupArns { | ||||
| 		arn := targetGroupArn | ||||
| 		eg.Go(func() error { | ||||
| 			return deregisterInstanceFromTargetGroup(c, arn, instanceId) | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := eg.Wait(); err != nil { | ||||
| 		return fmt.Errorf("failed to register instance from targetGroups: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func deregisterInstanceFromTargetGroup(c AWSCloud, targetGroupArn string, instanceId string) error { | ||||
| 	klog.Infof("Deregistering instance from targetGroup: %s", targetGroupArn) | ||||
| 
 | ||||
| 	for { | ||||
| 		instanceDraining := false | ||||
| 		for _, targetGroupArn := range targetGroupArns { | ||||
| 			response, err := c.ELBV2().DescribeTargetHealth(&elbv2.DescribeTargetHealthInput{ | ||||
| 
 | ||||
| 		response, err := c.ELBV2().DescribeTargetHealth(&elbv2.DescribeTargetHealthInput{ | ||||
| 			TargetGroupArn: aws.String(targetGroupArn), | ||||
| 			Targets: []*elbv2.TargetDescription{{ | ||||
| 				Id: aws.String(instanceId), | ||||
| 			}}, | ||||
| 		}) | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("error describing target health: %w", err) | ||||
| 		} | ||||
| 
 | ||||
| 		// there will be only one target in the DescribeTargetHealth response.
 | ||||
| 		// DescribeTargetHealth response will contain a target even if the targetId doesn't exist.
 | ||||
| 		// all other states besides TargetHealthStateUnused means that the instance may still be serving traffic.
 | ||||
| 		if aws.StringValue(response.TargetHealthDescriptions[0].TargetHealth.State) != elbv2.TargetHealthStateEnumUnused { | ||||
| 			_, err = c.ELBV2().DeregisterTargets(&elbv2.DeregisterTargetsInput{ | ||||
| 				TargetGroupArn: aws.String(targetGroupArn), | ||||
| 				Targets: []*elbv2.TargetDescription{{ | ||||
| 					Id: aws.String(instanceId), | ||||
|  | @ -675,21 +707,10 @@ func deregisterInstanceFromTargetGroups(c AWSCloud, targetGroupArns []string, in | |||
| 			}) | ||||
| 
 | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("error describing target health: %v", err) | ||||
| 				return fmt.Errorf("error deregistering target: %w", err) | ||||
| 			} | ||||
| 
 | ||||
| 			// there will be only one target in the DescribeTargetHealth response.
 | ||||
| 			// DescribeTargetHealth response will contain a target even if the targetId doesn't exist.
 | ||||
| 			// all other states besides TargetHealthStateUnused means that the instance may still be serving traffic.
 | ||||
| 			if aws.StringValue(response.TargetHealthDescriptions[0].TargetHealth.State) != elbv2.TargetHealthStateEnumUnused { | ||||
| 				c.ELBV2().DeregisterTargets(&elbv2.DeregisterTargetsInput{ | ||||
| 					TargetGroupArn: aws.String(targetGroupArn), | ||||
| 					Targets: []*elbv2.TargetDescription{{ | ||||
| 						Id: aws.String(instanceId), | ||||
| 					}}, | ||||
| 				}) | ||||
| 				instanceDraining = true | ||||
| 			} | ||||
| 			instanceDraining = true | ||||
| 		} | ||||
| 
 | ||||
| 		if !instanceDraining { | ||||
|  | @ -698,6 +719,9 @@ func deregisterInstanceFromTargetGroups(c AWSCloud, targetGroupArns []string, in | |||
| 
 | ||||
| 		time.Sleep(5 * time.Second) | ||||
| 	} | ||||
| 
 | ||||
| 	klog.Infof("Successfully drained instance from targetGroup: %s", targetGroupArn) | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue