We use Ray 2.55.0 on KubeRay with GCS fault tolerance (external Redis) and RAY_gcs_rpc_server_reconnect_timeout_s=900. After the head pod was repaved/replaced (about a 10-minute gap), the new Serve controller couldn’t recover the replicas on 2 of 6 worker nodes. It force-killed them after 30 seconds, but their GPUs stayed marked as in use, so replacement replicas couldn’t be scheduled until we recreated the whole RayCluster.
What happened:
- A node repave evicted the head pod. Worker pods and replicas kept running.
- About 10 minutes later, a new head started. The controller found all replicas in GCS and marked them RECOVERING.
- On 2 worker nodes, every replica stayed RECOVERING for the full 30 seconds. On the other 4 nodes, almost all replicas recovered normally.
- At exactly 30 seconds, the controller logged Stopping … (currently ReplicaState.RECOVERING) and force-killed them with no grace period.
- The controller tried to add replacement replicas, but Ray still counted the GPUs on those 2 nodes as used. The replacements were never scheduled.
Questions
-
Why would replicas that were running fine be restarted after the head node comes back?
-
Why are only the replicas on some nodes affected, while other nodes recover normally?
-
After those replicas are stopped, why aren’t their GPUs released? Is this a known issue in 2.55, and is it fixed in a newer version?
-
Is there a setting to give replicas more time to recover after a head restart, instead of stopping them after about 30 seconds?
-
Is there a way to free the stuck GPUs without recreating the whole RayCluster?
-
What is the recommended setup to survive head node replacement on KubeRay? For example: a PodDisruptionBudget for the head, or specific Ray or Serve settings.
Environment
Ray 2.55.0, KubeRay, GCS FT with external Redis
RAY_gcs_rpc_server_reconnect_timeout_s=900