结合Ray autoscaler实现ECI节点的弹性伸缩

结合Ray autoscaler能力,您可以在ACK集群中创建Ray Cluster并配置在Ray Cluster内自动弹出ECI节点,以享用免运维、强隔离、能快速启动的容器运行环境。使用ECI时,您无需购买和管理底层ECS服务器,可以更加关注容器应用而非底层基础设施的维护工作,且仅为实际使用的资源付费。

前提条件

示例集群架构

image.png

操作步骤

  1. 执行以下命令,查看Node节点,确认其中有新增virtual-kubelet虚拟节点。

    kubectl get node

    预期输出:

    NAME                            STATUS   ROLES    AGE   VERSION
    cn-hangzhou.172.XX.XX.20         Ready    <none>   19h   v1.26.3-aliyun.1
    cn-hangzhou.172.XX.XX.236        Ready    <none>   82m   v1.26.3-aliyun.1
    cn-hangzhou.172.XX.XX.41         Ready    <none>   19h   v1.26.3-aliyun.1
    virtual-kubelet-cn-hangzhou-k   Ready    agent    16m   v1.26.3-aliyun.1
  2. 执行以下命令,创建values.yaml文件。

    cat > values.yaml <<EOF
    worker:
      groupName: workergroup
      labels:
        alibabacloud.com/eci: "true"
    EOF
  3. 执行以下命令,安装支持ECI的Ray Cluster。

    helm uninstall ${RAY_CLUSTER_NAME} -n ${RAY_CLUSTER_NS}
    helm install ${RAY_CLUSTER_NAME} aliyunhub/ack-ray-cluster -n ${RAY_CLUSTER_NS}  -f values.yaml
  4. 执行以下命令,确认Ray Cluster的Pod运行正常。

    kubectl get pod

    预期输出:

    NAME                                           READY   STATUS    RESTARTS   AGE     IP             NODE                            NOMINATED NODE   READINESS GATES
    myfirst-ray-cluster-head-7fgp4                 2/2     Running   0          7m2s    172.16.0.241   cn-hangzhou.172.16.0.240        <none>           <none>
  5. 执行以下命令,登录Head节点。

    请将Pod名称替换为实际的Ray Cluster的Pod名称。

    kubectl -n ${RAY_CLUSTER_NS} exec -it myfirst-ray-cluster-head-7fgp4 -- bash
  6. 向Ray Cluster提交并运行Python Job。

    下方代码启动了2个Task,每个Task需要1核CPU调度资源。默认创建的Ray Cluster的Head Pod的--num-cpus为0,即不允许调度task;Work Pod的CPU内存默认为1核1 GB。因此,Ray Cluster会自动扩容2个ECI Work Pod。

    import time
    import ray
    import socket
    
    ray.init()
    
    @ray.remote(num_cpus=1)
    def get_task_hostname():
        time.sleep(120)
        host = socket.gethostbyname(socket.gethostname())
        return host
    
    object_refs = []
    for _ in range(2):
        object_refs.append(get_task_hostname.remote())
    
    ray.wait(object_refs)
    
    for t in object_refs:
        print(ray.get(t))
  7. 执行以下命令,确认Pod运行正常,即扩容成功。

    kubectl get pod -o wide
    # 预期输出:
    NAME                                           READY   STATUS     RESTARTS   AGE     IP             NODE                            NOMINATED NODE   READINESS GATES
    myfirst-ray-cluster-head-7fgp4                 2/2     Running    0          4m56s   172.16.0.241   cn-hangzhou.172.16.0.240        <none>           <none>
    myfirst-ray-cluster-worker-workergroup-6s2cl   0/1     Init:0/1   0          4m5s    172.16.0.17    virtual-kubelet-cn-hangzhou-k   <none>           <none>
    myfirst-ray-cluster-worker-workergroup-l9qgb   1/1     Running    0          4m5s    172.16.0.16    virtual-kubelet-cn-hangzhou-k   <none>

相关文档