Temporal cluster always seems to be out of resources but always seems healthy

“no hosts are available to serve the request”.

Do you mean “Not enough hosts to serve the request”? If so this comes from ringpop, and means there is no host available for the requested server role. This could happen on server shutdown but it could also mean deployment issues, for example all your service X pods are down or restarting.
Also see this forum post that reports similar issue on kubernetes setup.

tctl --address temporal.b8s.biz:7233 cluster health

tctl cluster health health checks only the temporal frontend service.
If you are deploying on k8s you could use grpc-health-probe to health check frontend, matching and history services, for example:

matching:
./grpc-health-probe -addr=localhost:7235 -service=temporal.api.workflowservice.v1.MatchingService

history:
./grpc-health-probe -addr=localhost:7234 -service=temporal.api.workflowservice.v1.HistoryService

frontend:
./grpc-health-probe -addr=localhost:7233 -service=temporal.api.workflowservice.v1.WorkflowServicePreformatted text

(change the host:port to whatever you need to set it to)