If you are an existing user of the classic Application Load Balancer, make sure you review this page if you are planning to migrate to the global external Application Load Balancer or if you are planning a new deployment with the global external Application Load Balancer.
Feature differences
The following features are not supported with the global external Application Load Balancer. They are only available with the classic Application Load Balancer:
- Standard Network Tier
-
To deploy global external Application Load Balancers for GKE clusters, use the GKE Gateway controller instead. For setup instructions, see Deploying Gateways.
Data plane differences
The following table highlights differences in the data plane between the classic Application Load Balancer and the global external Application Load Balancer. These differences affect how the load balancers respond to some common events.
Event | Classic Application Load Balancer response | Global external Application Load Balancer response |
Status/error codes | ||
All backends are unhealthy | Returns HTTP 502 | Returns HTTP 503 |
Request uses a banned SSL cipher | Returns HTTP 502 | Returns HTTP 503 |
Early upstream connection reset by the backend | Returns HTTP 502 | Returns HTTP 503 |
Failed connection upgrade (for example, while upgrading to Websockets) | Returns HTTP 400 | Returns HTTP 403 |
Header is too large | Returns HTTP 413 | Returns HTTP 431 |
Quotas and limits | ||
URL map configuration | There are significant differences in the URL map configuration limits between the two load balancers. For details, see the Quotas: URL maps documentation. | |
Header handling | ||
Request uses a custom HTTP method with no body | Adds the Transfer Encoding: Chunked header to request sent
to backend |
Adds the Content-Length: 0 header to request sent to
backend |
Format of the X-Forwarded-For header added to requests
sent to backend |
Uses ', ' delimiter between IPs |
Uses ', ' delimiter between IPs (no space after the comma) |
Header case preservation | Header case is preserved | All header keys are transformed to lowercase |
Repeated headers with the same name | Allowed | Repeated headers may be combined into a single header, with the values appended in order and comma separated, as allowed by RFC 7230. |
(HTTP/1.1 only) Invalid header name (for example, unsupported characters in header) | Allowed (for HTTP/1.1) | Returns HTTP 502 (for HTTP/1.1) |
(HTTP/1.1 only) Repeated (but same)
Content-Length header in request |
Allowed (for HTTP/1.1) | Returns HTTP 502 (for HTTP/1.1) |
(HTTP/1.1 only) Multiple hosts in header | When 2 or more hosts are added, and the first one is valid, the header is accepted | When 2 or more hosts are added, and any are invalid, the load balancer returns HTTP 502 |
(HTTP/1.1 only) Connection: Keep-Alive
header |
Adds the Keep-Alive header in requests sent to backend by
default |
Does not add this header by default |
Request handling | ||
Backwards slashes in request | URL left unchanged | Converts to forward slash |
Merge duplicate slashes in request | Leaves slashes unmerged | Merges slashes |
`#` in request path | Allowed | Returns HTTP 400 |
(HTTP/1.1 only) Illegal characters in request path (for example, `\\x7f\\x7f`) | Allowed (for HTTP/1.1) | Returns HTTP 502 (for HTTP/1.1) |
Traffic distribution (URL map configuration) | ||
Client request includes a port number | The port number is ignored even if you have configured hosts with ports
in the URL map. Only the host name is considered. For example, requests for example.com:5000 are matched to
the backend service for example.com .
|
Both the host name and the port number are considered. For example, requests for example.com:5000 are matched to
the backend service for example.com:5000 . If there isn't
a match, the default backend service is used.
|