The official clients check a product header and refuse to talk to anything that is not the version they expect, which makes a rolling upgrade a coordinated one.
// the 8.x PHP client against a 7.17 cluster:
// "The client noticed that the server is not a supported
// distribution of Elasticsearch"
// so the order is fixed:
// 1. upgrade the cluster 7.x → 7.17 (the bridge release)
// 2. upgrade the cluster 7.17 → 8.x
// 3. THEN upgrade the client
// and 7.17 is the only version that can be upgraded from
// directly, which makes it a required stop.
The version check is a deliberate incompatibility rather than a technical one and it removes the usual option of upgrading the client first to smooth the transition. Combined with the required stop at 7.17, the upgrade becomes a sequence with no shortcuts — which is worth planning before starting rather than discovering at step two.