全部產品
Search
文件中心

Container Service for Kubernetes:結合Ray autoscaler實現ECI節點的Auto Scaling

更新時間:Jun 19, 2024

結合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>

相關文檔