mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 06:27:05 +00:00
GCE provider: Create TargetPool with 200 instances, then update with rest
Tested with 2000 nodes, this actually meets the GCE API specifications (which is nutty). Previous PR (#25178) was based on a mistaken understanding of a poorly documented set of limitations, and even poorer testing, for which I am embarassed.
This commit is contained in:
parent
ebc65f1dd3
commit
f63ac1962c
@ -69,6 +69,9 @@ const (
|
|||||||
// are iterated through to prevent infinite loops if the API
|
// are iterated through to prevent infinite loops if the API
|
||||||
// were to continuously return a nextPageToken.
|
// were to continuously return a nextPageToken.
|
||||||
maxPages = 25
|
maxPages = 25
|
||||||
|
|
||||||
|
// Target Pool creation is limited to 200 instances.
|
||||||
|
maxTargetPoolCreateInstances = 200
|
||||||
)
|
)
|
||||||
|
|
||||||
// GCECloud is an implementation of Interface, LoadBalancer and Instances for Google Compute Engine.
|
// GCECloud is an implementation of Interface, LoadBalancer and Instances for Google Compute Engine.
|
||||||
@ -537,7 +540,7 @@ func (gce *GCECloud) EnsureLoadBalancer(apiService *api.Service, hostNames []str
|
|||||||
affinityType := apiService.Spec.SessionAffinity
|
affinityType := apiService.Spec.SessionAffinity
|
||||||
|
|
||||||
serviceName := types.NamespacedName{Namespace: apiService.Namespace, Name: apiService.Name}
|
serviceName := types.NamespacedName{Namespace: apiService.Namespace, Name: apiService.Name}
|
||||||
glog.V(2).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", loadBalancerName, gce.region, loadBalancerIP, portStr, hosts, serviceName, apiService.Annotations)
|
glog.V(2).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", loadBalancerName, gce.region, loadBalancerIP, portStr, hostNames, serviceName, apiService.Annotations)
|
||||||
|
|
||||||
// Check if the forwarding rule exists, and if so, what its IP is.
|
// Check if the forwarding rule exists, and if so, what its IP is.
|
||||||
fwdRuleExists, fwdRuleNeedsUpdate, fwdRuleIP, err := gce.forwardingRuleNeedsUpdate(loadBalancerName, gce.region, loadBalancerIP, ports)
|
fwdRuleExists, fwdRuleNeedsUpdate, fwdRuleIP, err := gce.forwardingRuleNeedsUpdate(loadBalancerName, gce.region, loadBalancerIP, ports)
|
||||||
@ -706,10 +709,27 @@ func (gce *GCECloud) EnsureLoadBalancer(apiService *api.Service, hostNames []str
|
|||||||
// Once we've deleted the resources (if necessary), build them back up (or for
|
// Once we've deleted the resources (if necessary), build them back up (or for
|
||||||
// the first time if they're new).
|
// the first time if they're new).
|
||||||
if tpNeedsUpdate {
|
if tpNeedsUpdate {
|
||||||
if err := gce.createTargetPool(loadBalancerName, serviceName.String(), gce.region, hosts, affinityType); err != nil {
|
createInstances := hosts
|
||||||
|
if len(hosts) > maxTargetPoolCreateInstances {
|
||||||
|
createInstances = createInstances[:maxTargetPoolCreateInstances]
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := gce.createTargetPool(loadBalancerName, serviceName.String(), gce.region, createInstances, affinityType); err != nil {
|
||||||
return nil, fmt.Errorf("failed to create target pool %s: %v", loadBalancerName, err)
|
return nil, fmt.Errorf("failed to create target pool %s: %v", loadBalancerName, err)
|
||||||
}
|
}
|
||||||
glog.V(4).Infof("EnsureLoadBalancer(%v(%v)): created target pool", loadBalancerName, serviceName)
|
if len(hosts) <= maxTargetPoolCreateInstances {
|
||||||
|
glog.V(4).Infof("EnsureLoadBalancer(%v(%v)): created target pool", loadBalancerName, serviceName)
|
||||||
|
} else {
|
||||||
|
glog.V(4).Infof("EnsureLoadBalancer(%v(%v)): created initial target pool (now updating with %d hosts)", loadBalancerName, serviceName, len(hosts)-maxTargetPoolCreateInstances)
|
||||||
|
|
||||||
|
created := sets.NewString()
|
||||||
|
for _, host := range createInstances {
|
||||||
|
created.Insert(host.makeComparableHostPath())
|
||||||
|
}
|
||||||
|
if err := gce.updateTargetPool(loadBalancerName, created, hosts); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to update target pool %s: %v", loadBalancerName, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if tpNeedsUpdate || fwdRuleNeedsUpdate {
|
if tpNeedsUpdate || fwdRuleNeedsUpdate {
|
||||||
if err := gce.createForwardingRule(loadBalancerName, serviceName.String(), gce.region, ipAddress, ports); err != nil {
|
if err := gce.createForwardingRule(loadBalancerName, serviceName.String(), gce.region, ipAddress, ports); err != nil {
|
||||||
@ -1155,6 +1175,10 @@ func (gce *GCECloud) UpdateLoadBalancer(service *api.Service, hostNames []string
|
|||||||
existing.Insert(hostURLToComparablePath(instance))
|
existing.Insert(hostURLToComparablePath(instance))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return gce.updateTargetPool(loadBalancerName, existing, hosts)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gce *GCECloud) updateTargetPool(loadBalancerName string, existing sets.String, hosts []*gceInstance) error {
|
||||||
var toAdd []*compute.InstanceReference
|
var toAdd []*compute.InstanceReference
|
||||||
var toRemove []*compute.InstanceReference
|
var toRemove []*compute.InstanceReference
|
||||||
for _, host := range hosts {
|
for _, host := range hosts {
|
||||||
|
Loading…
Reference in New Issue
Block a user