diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 7c5cac8d352..947409c24ee 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -2804,9 +2804,28 @@ func (c *Cloud) EnsureLoadBalancer(clusterName string, apiService *v1.Service, n return nil, err } - err = c.ensureLoadBalancerHealthCheck(loadBalancer, listeners) - if err != nil { - return nil, err + if path, healthCheckNodePort := service.GetServiceHealthCheckPathPort(apiService); path != "" { + glog.V(4).Infof("service %v (%v) needs health checks on :%d%s)", apiService.Name, loadBalancerName, healthCheckNodePort, path) + err = c.ensureLoadBalancerHealthCheck(loadBalancer, "HTTP", healthCheckNodePort, path) + if err != nil { + return nil, fmt.Errorf("Failed to ensure health check for localized service %v on node port %v: %v", loadBalancerName, healthCheckNodePort, err) + } + } else { + glog.V(4).Infof("service %v does not need custom health checks", apiService.Name) + // We only configure a TCP health-check on the first port + var tcpHealthCheckPort int32 + for _, listener := range listeners { + if listener.InstancePort == nil { + continue + } + tcpHealthCheckPort = int32(*listener.InstancePort) + break + } + // there must be no path on TCP health check + err = c.ensureLoadBalancerHealthCheck(loadBalancer, "TCP", tcpHealthCheckPort, "") + if err != nil { + return nil, err + } } err = c.updateInstanceSecurityGroupsForLoadBalancer(loadBalancer, instances) diff --git a/pkg/cloudprovider/providers/aws/aws_loadbalancer.go b/pkg/cloudprovider/providers/aws/aws_loadbalancer.go index df0eb7bb632..c4409740f82 100644 --- a/pkg/cloudprovider/providers/aws/aws_loadbalancer.go +++ b/pkg/cloudprovider/providers/aws/aws_loadbalancer.go @@ -355,8 +355,8 @@ func (c *Cloud) ensureLoadBalancer(namespacedName types.NamespacedName, loadBala return loadBalancer, nil } -// Makes sure that the health check for an ELB matches the configured listeners -func (c *Cloud) ensureLoadBalancerHealthCheck(loadBalancer *elb.LoadBalancerDescription, listeners []*elb.Listener) error { +// Makes sure that the health check for an ELB matches the configured health check node port +func (c *Cloud) ensureLoadBalancerHealthCheck(loadBalancer *elb.LoadBalancerDescription, protocol string, port int32, path string) error { name := aws.StringValue(loadBalancer.LoadBalancerName) actual := loadBalancer.HealthCheck @@ -367,19 +367,7 @@ func (c *Cloud) ensureLoadBalancerHealthCheck(loadBalancer *elb.LoadBalancerDesc expectedTimeout := int64(5) expectedInterval := int64(10) - // We only configure a TCP health-check on the first port - expectedTarget := "" - for _, listener := range listeners { - if listener.InstancePort == nil { - continue - } - expectedTarget = "TCP:" + strconv.FormatInt(*listener.InstancePort, 10) - break - } - - if expectedTarget == "" { - return fmt.Errorf("unable to determine health check port for %q (no valid listeners)", name) - } + expectedTarget := protocol + ":" + strconv.FormatInt(int64(port), 10) + path if expectedTarget == orEmpty(actual.Target) && expectedHealthyThreshold == orZero(actual.HealthyThreshold) &&