Migration overview Stay organized with collections Save and categorize content based on your preferences.
This page gives you an overview of the differences between theglobal external Application Load Balancer and classic Application Load Balancer, and a detailed overview of howyou can migrate your existing classic Application Load Balancer resources to theglobal external Application Load Balancer.
To take advantage of theadvanced trafficmanagement features ofthe global external Application Load Balancer, we recommend that you migrate yourclassic Application Load Balancer resources to the global external Application Load Balancer infrastructure.
Compare classic Application Load Balancers and global external Application Load Balancers
Before you migrate resources, understand the differences betweenclassic Application Load Balancers and global external Application Load Balancers.
Feature differences
The following features are not supported with the global external Application Load Balancer. Theyare only available with the classic Application Load Balancer:
- Standard Network Tier
To deploy global external Application Load Balancers for GKE clusters, use theGKE Gatewaycontroller instead. For setupinstructions, seeDeployingGateways.
Data plane differences
The following table highlights differences in the data plane between theclassic Application Load Balancer and the global external Application Load Balancer. These differencesaffect 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 theQuotas: URL maps documentation. | |
| Header handling | ||
| Request uses a custom HTTP method with no body | Adds theTransfer Encoding: Chunked header to request sent to backend | Adds theContent-Length: 0 header to request sent to backend |
Format of theX-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 byRFC 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 theKeep-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 hostname is considered. For example, requests forexample.com:5000 are matched to the backend service forexample.com. | Both the hostname and the port number are considered. For example, requests forexample.com:5000 are matched to the backend service forexample.com:5000. If there isn't a match, the default backend service is used. |
Due to architectural differences, when migrating to the global external Application Load Balancer, you might see anincrease in the number of connections to your backends, especially when using the HTTP/1.1 protocol.This can lead to increased memory consumption on the backend instances. Monitor your backendresource usage during and after migration.
To learn more about the differences and supported features, seeLoad balancer feature comparison andApplication Load Balancer overview.
Migrate from classic to global external Application Load Balancer
To migrate to the global external Application Load Balancer, you change the load balancingscheme of your load balancing resources—specifically, the backend servicesand forwarding rules—fromEXTERNAL toEXTERNAL_MANAGED. To do this,you perform a series of migration steps where you can test partsof your network traffic with the new load balancing schemebefore actually finalizing the migration. During resource migration, youcontrol what percentage of requests is sent to either the classic Application Load Balancerinfrastructure or the global external Application Load Balancer infrastructure.
The following diagram shows the load balancing schemes of your load balancingresources before and after the migration.
In the previous diagram, note the following:
- Before resources are migrated, all requests use the classic Application Load Balancerinfrastructure.
- While the resources are migrated, some requests are sent to theglobal external Application Load Balancer infrastructure and the remaining requests are sent tothe classic Application Load Balancer infrastructure.
- After resources are migrated, all requests use the global external Application Load Balancerinfrastructure.
To help ensure a smooth transition, migrate the following classic Application Load Balancerresources in the specified order:
Migrate all backend services attached to the load balancer's forwardingrules.
Migrate all backend buckets attached to the load balancer's forwardingrules. You do this at the forwarding rule level because backendbuckets don't have load balancing schemes.
Migrate the load balancer's forwarding rules.
You can only migrate a forwarding rule after all the backend services andbackend buckets attached to the forwarding rule have already been migrated.
Migration states
You migrate resources by setting them to different states before changing theirload balancing scheme toEXTERNAL_MANAGED.
PREPARE: set a resource to this state to prepare it for migration.TEST_BY_PERCENTAGE: to test a prepared resource, set the resource to thisstate to send a percentage of the network traffic. This stage isoptional.TEST_ALL_TRAFFIC: set a resource to this state to send allnetwork traffic to the resource through the global external Application Load Balancerinfrastructure instead of the classic Application Load Balancer infrastructure.
PREPARE toTEST_BY_PERCENTAGEorTEST_ALL_TRAFFIC, wait for some time (approximately six minutes) for theresource to be ready to accept traffic. The resource must be in theTEST_ALL_TRAFFIC state before you change the load balancing scheme.Migration process
To help ensure no downtime, you migrate resources in a specific orderfrom the classic Application Load Balancer infrastructure to the global external Application Load Balancerinfrastructure, and then change the load balancing scheme fromEXTERNAL toEXTERNAL_MANAGED to finalize the migration.
Migrate the load balancer's backend services.
Repeat the following steps for each backend service.
Prepare the backend service for migration.
Before any traffic can be sent through the global external Application Load Balancerinfrastructure, set the state of the backend service to
PREPARE. Thisprepares the backend service to handle global external Application Load Balancer infrastructurenetwork traffic. A backend service takes some time (approximately six minutes)to be ready to send traffic through the global external Application Load Balancerinfrastructure.Optional: Test the prepared backend service.
After the backend service is in the
PREPAREstate, set its state toTEST_BY_PERCENTAGEand set a percentage of the classic Application Load Balancernetwork traffic to the global external Application Load Balancer infrastructure.Though this stage is optional, we recommend that you test the traffic beforemigrating a backend service. Start with a small percentage value andmonitor logs of the resources. If the backend service behaves asexpected, gradually increase the percentage to 100%.
In the
TEST_BY_PERCENTAGEstate, you can't use the additional capabilitiesof the global external Application Load Balancer infrastructure.Send all classic Application Load Balancer network traffic to the prepared backendservice.
After the testing of the backend service is successful, set its state to
TEST_ALL_TRAFFICand send all classic Application Load Balancer network trafficto the prepared backend service. A backend service takes some time(approximately six minutes) to be ready to handle the network traffic.In the
TEST_ALL_TRAFFICstate, you can't use the additional capabilitiesof the global external Application Load Balancer infrastructure.Change the load balancing scheme of migrated backend service to
EXTERNAL_MANAGED.After testing your prepared backend service on theglobal external Application Load Balancer infrastructure, change its load balancing schemeto
EXTERNAL_MANAGED. A backend service takes some time (approximatelysix minutes) to be fully migrated. After the load balancing scheme of thebackend service changes toEXTERNAL_MANAGED, you can use the advancedfeatures of the global external Application Load Balancer infrastructure.
Migrate the load balancer's backend buckets. You do this at the forwardingrule level because backend buckets don't have load balancing schemes.
Repeat the following steps for each bucket.
Prepare the backend bucket for migration.
Before any traffic can be sent through the global external Application Load Balancerinfrastructure, set the state of the backend bucket to
PREPARE, andwait for some time (approximately six minutes).Optional: Test the prepared backend service.
After the backend bucket is in the
PREPAREstate, set its state toTEST_BY_PERCENTAGEand set a percentage of the classic Application Load Balancernetwork traffic to the global external Application Load Balancer infrastructure.Send all classic Application Load Balancer network traffic to the prepared backendbucket.
Set the state of the backend bucket to
TEST_ALL_TRAFFICand send allclassic Application Load Balancer network traffic to it. A backend bucket takessome time (approximately six minutes) to be ready to handle the networktraffic.In the
TEST_ALL_TRAFFICstate, you can't use the additional capabilitiesof the global external Application Load Balancer infrastructure.
Migrate the forwarding rules.
For each forwarding rule, change the load balancing scheme of the forwardingrule to
EXTERNAL_MANAGED, and wait for some time (approximately six minutes).After the load balancing scheme of the forwarding rule changes toEXTERNAL_MANAGED, you can use the advanced features of theglobal external Application Load Balancer infrastructure.
For a detailed step-by-step process, seeMigrate resources from classic Application Load Balancer.
The following diagram shows the classic Application Load Balancer resources in thedifferent states of migration.
After migrating a resource, if you want to roll it back toclassic Application Load Balancer, change its load balancing scheme within 90 days of itsmigration. You can't roll back a resource after the 90-day window has passed.
Using session affinity
Consider the following caveats when migrating classic Application Load Balancer backendservices with session affinity:
Setting a value for
TEST_BY_PERCENTAGEredirects some traffic targetingthe classic Application Load Balancer to the global external Application Load Balancer. This breaks theclient IPaffinity.Changing the migration percentage (for example, increasing it by 10%)breaks the session affinity for the same percentage of client IP addresses(10% in this example), until the affinity is re-established on thenext request.Setting a value for
TEST_BY_PERCENTAGEredirects that percentage oftraffic without asession cookieto the global external Application Load Balancer. It also redirects all traffic with a sessioncookie to the load balancer fleet that generated the cookie.Setting a value for
TEST_BY_PERCENTAGEto 0%, or leaving it unset, orsetting the backend service to thePREPAREstate, invalidates all existingcookies that are directed to the global external Application Load Balancer.Changing the load balancing scheme of the backend service to
EXTERNAL_MANAGEDinvalidates all cookies generated by theclassic Application Load Balancer fleet. Thislets you roll back traffic if there's an issue with your application usingthe global external Application Load Balancer. For example, if a client presents a cookie fromthe classic Application Load Balancer fleet, but the backend service schemeisEXTERNAL_MANAGED, the client's cookie is not honored. Theglobal external Application Load Balancer ignores the cookie and creates a new one.
Roll back migrated resources
After migrating a resource, if you want to roll it back from theglobal external Application Load Balancer infrastructure to the classic Application Load Balancerinfrastructure, you can do so within 90 days of changing its load balancingscheme.
Rolling back a backend service to theEXTERNAL schemerequires rolling back the forwarding rule. Rolling back a forwarding rule to theEXTERNAL scheme doesn't require rolling back the backend services.
To roll back resources, follow these steps:
- Remove any new advanced traffic management features of global external Application Load Balancerconfigured on the resource.
Roll back the forwarding rules.
Change the load balancing scheme of forwarding rules from
EXTERNAL_MANAGEDtoEXTERNAL.Roll back the backend buckets.
- Set the migration state of backend buckets to
TEST_ALL_TRAFFIC, andwait for some time (approximately six minutes). - Optional: To decrease the traffic, set the migration state of backendbuckets to
TEST_BY_PERCENTAGEand set a percentage of the traffic. - Set the migration state of backend buckets to
PREPARE. - Revert backend buckets to their pre-migration states.
- Set the migration state of backend buckets to
Roll back the backend services.
- Set the migration state of backend services to
TEST_ALL_TRAFFIC, andwait for some time (approximately six minutes). - Optional: To decrease the traffic, set the migration state of backendservices to
TEST_BY_PERCENTAGEand set a percentage of the traffic. - Set the migration state of backend services to
PREPARE. - Revert backend services to their pre-migration states.
- Set the migration state of backend services to
For a detailed step-by-step process, seeRoll back migrated resources toclassic Application Load Balancer.
Track your migration process
While migrating your resources, you can check their load balancing schemes by viewing the following:
The logging and monitoring dashboards of the global external Application Load Balancer. For moreinformation, seeGlobal external Application Load Balancer logging andmonitoring.
The values of the following HTTP request and response headers:
X-External-Managed-Migration-Scheme-Override: this request headerroutes the request based on its value. If the header value isEXTERNAL, it directs the request to the classic Application Load Balancerinfrastructure. If the value isEXTERNAL_MANAGED, it routes therequest through the global external Application Load Balancer infrastructure.Use this header to direct a request to a particular load balancer fleet.
X-External-Managed-Migration-Selected-Scheme: this request andresponse header informs the backend and the client about the loadbalancing scheme used to route the request. The header is returned tothe client and passed to the customer's backend.If the request is routed through the classic Application Load Balancer infrastructure,its value is
EXTERNAL. If the request is routed through theglobal external Application Load Balancer infrastructure, its value isEXTERNAL_MANAGED.
What's next
- Migrate resources from classic Application Load Balancer
- Roll back migrated resources to classic Application Load Balancer
Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-12-15 UTC.