code: def _wait_services_ready(self):
      min_worker_num = int(self._min_worker_num or self._worker_num)
      limits = [self._supervisor_num, min_worker_num]
      selectors = [
          "mars/service-type=" + MarsSupervisorsConfig.rc_name,
          "mars/service-type=" + MarsWorkersConfig.rc_name,
      ]
      start_time = time.time()
      logger.debug("Start waiting pods to be ready")
      wait_services_ready(
          selectors,
          limits,
          lambda sel: self._get_ready_pod_count(sel),
          timeout=self._timeout,
      )
      logger.info("All service pods ready.")
      if self._timeout is not None:  # pragma: no branch
          self._timeout -= time.time() - start_time
  
imports: import asyncio
  import functools
  import logging
  import random
  import time
  import uuid
  from urllib.parse import urlparse
  from ...lib.aio import new_isolation, stop_isolation
  from ...services.cluster.api import WebClusterAPI
  from ...session import new_session
  from ...utils import calc_size_by_str
  from ..utils import wait_services_ready
  from .config import NamespaceConfig, RoleConfig, RoleBindingConfig, ServiceConfig, MarsSupervisorsConfig, MarsWorkersConfig
label_desc: Use image node_id 11 for calling the KubernetesCluster obj's underlying member method code with example usage: obj._wait_services_ready() without return types