I've seen three builds fail now witht he same error and this started happening on Nov 7 so it's likely we've introduced something here:

https://gradle-enterprise.elastic.co/scans/failures?failures.failureClassification=all_failures&failures.failureMessage=Execution%20failed%20for%20task%20%27:x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0%23follower%23oneThirdUpgradedTest%27.%0A%3E%20%60cluster%7B:x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0-follower%7D%60%20failed%20to%20wait%20for%20cluster%20health%20yellow%20after%2040%20SECONDS%0A%20%20%20%20IO%20error%20while%20waiting%20cluster%0A%20%20%20%20%20%20503%20Service%20Unavailable&search.relativeStartTime=P28D&search.timeZoneId=America/Los_Angeles#

```
* What went wrong:
Execution failed for task ':x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0#follower#oneThirdUpgradedTest'.
> `cluster{:x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0-follower}` failed to wait for cluster health yellow after 40 SECONDS
    IO error while waiting cluster
      503 Service Unavailable
```

It seems the follower cluster is having issues coming back up after upgrade.
server/src/test/java/org/elasticsearch/cluster/routing/allocation/allocator/DesiredBalanceReconcilerTests.java
final var state2 = startInitializingShardsAndReroute(allocationService, state1);
        assertTrue(primaryGetter.apply(state2, higherIndex, 0).started());
        assertTrue(primaryGetter.apply(state2, higherIndex, 1).initializing());
        assertTrue(primaryGetter.apply(state2, lowerIndex, 0).unassigned());
        assertTrue(primaryGetter.apply(state2, lowerIndex, 1).unassigned());
        final var state3 = startInitializingShardsAndReroute(allocationService, state2);
        assertTrue(primaryGetter.apply(state3, higherIndex, 0).started());
        assertTrue(primaryGetter.apply(state3, higherIndex, 1).started());
        assertTrue(primaryGetter.apply(state3, lowerIndex, 0).initializing());
        assertTrue(primaryGetter.apply(state3, lowerIndex, 1).unassigned());
        final var state4 = startInitializingShardsAndReroute(allocationService, state3);
        assertTrue(primaryGetter.apply(state4, higherIndex, 0).started());
        assertTrue(primaryGetter.apply(state4, higherIndex, 1).started());
        assertTrue(primaryGetter.apply(state4, lowerIndex, 0).started());
        assertTrue(primaryGetter.apply(state4, lowerIndex, 1).initializing());
        final var state5 = startInitializingShardsAndReroute(allocationService, state4);
        assertTrue(primaryGetter.apply(state5, higherIndex, 0).started());
        assertTrue(primaryGetter.apply(state5, higherIndex, 1).started());
        assertTrue(primaryGetter.apply(state5, lowerIndex, 0).started());
        assertTrue(primaryGetter.apply(state5, lowerIndex, 1).started());
        final TriFunction<ClusterState, IndexMetadata, Integer, ShardRouting> replicaGetter = (state, indexMetadata, shardId) -> state
            .routingTable()
            .shardRoutingTable(indexMetadata.getIndex().getName(), shardId)
            .replicaShards()
            .get(0);
        assignReplicas.set(true);
        final var state6 = startInitializingShardsAndReroute(allocationService, state5);
        assertTrue(replicaGetter.apply(state6, higherIndex, 0).initializing());
        assertTrue(replicaGetter.apply(state6, higherIndex, 1).unassigned());
        assertTrue(replicaGetter.apply(state6, lowerIndex, 0).unassigned());