全部產品
Search
文件中心

Container Service for Kubernetes:實現K8s叢集以Serverless方式使用雲上CPU/GPU資源

更新時間:Oct 19, 2024

IDC中K8s叢集通過Serverless方式使用阿里雲Elastic Container Instance運行業務Pod。您可以在K8s叢集直接提交業務Pod,使Pod運行在ECI上,無需額外營運雲上節點池,更加靈活、高效、彈性地使用雲上CPU和GPU資源。本文介紹如何基於註冊叢集實現IDC中K8s叢集以Serverless方式使用雲上CPU和GPU資源。

背景資訊

為IDC中K8s叢集直接添加雲上節點或GPU節點的方式,適用於需要自訂配置的節點(runtime、kubelet、NVIDIA等)和特定的ECS執行個體規格等情境,該方式需要自我維護雲上節點池,增加額外成本。您可以選擇Serverless方式使用阿里雲Elastic Container Instance運行業務Pod,無需額外營運雲上節點池,可以更加高效彈性的使用雲上CPU和GPU資源。

前提條件

使用情境

通過Serverless方式使用雲上CPU和GPU資源,解決的依然是IDC中K8s叢集的彈效能力不足,不能滿足業務的快速增長、周期性業務增長和突發業務流量的問題。

通過Serverless方式,您可以在K8s叢集直接提交業務Pod,該Pod將使用阿里雲Elastic Container Instance運行,Elastic Container Instance啟動速度快,與業務Pod的生命週期一致,按Pod已耗用時間計費。從而不需要為IDC中K8s叢集建立雲上節點,無需規劃雲上資源容量,也不需要等待ECS建立完成,實現了高度彈性,並節省了節點的營運成本。通過Serverless方式使用雲上CPU和GPU資源的方式如下圖所示。

IDC中K8s叢集以Serverless方式使用雲上CPU和GPU資源適合以下業務情境。

  • 線上業務的波峰波穀Auto Scaling:例如,線上教育、電商等行業有著明顯的波峰波穀計算特徵。使用Serverless ECI可以顯著減少固定資源集區的維護,降低計算成本。

  • 資料計算:使用Serverless ECI承載Spark、Presto、ArgoWorkflow等計算情境,按Pod已耗用時間計費,有效降低計算成本。

  • CI/CD Pipeline:Jenkins、Gitlab-Runner。

  • Job任務:定時任務、AI。

步驟一:安裝相關組件

通過註冊叢集實現IDC中K8s叢集以Serverless方式使用雲上CPU和GPU資源,您需要安裝以下組件。

  • ack-virtual-node:使用虛擬節點和ECI的高度彈效能力。

  • ack-co-scheduler:通過該組件,您可以自訂ResourcePolicy CR對象,使用多級彈性調度功能。

您可以通過以下兩種方式安裝組件。

通過onectl安裝

  1. 在本地安裝配置onectl。具體操作,請參見通過onectl管理註冊叢集

  2. 執行以下命令,安裝ack-virtual-node和ack-co-scheduler組件。

    onectl addon install ack-virtual-node
    onectl addon install ack-co-scheduler

    預期輸出:

    Addon ack-virtual-node, version **** installed.
    Addon ack-co-scheduler, version **** installed.

通過控制台安裝

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

  3. 組件管理頁面,單擊其他頁簽,找到ack-virtual-node和ack-co-scheduler組件,在卡片右下方單擊安裝

  4. 在提示對話方塊中單擊確定

步驟二:查看節點

ack-virtual-node組件安裝完成後,您可以通過註冊叢集kubeconfig查看叢集節點池。virtual-kubelet為虛擬節點,對接阿里雲Serverless ECI。

執行以下命令,查看節點。

kubectl get node

預期輸出:

NAME                               STATUS   ROLES    AGE    VERSION
iz8vb1xtnuu0ne6b58hvx0z            Ready    master   4d3h   v1.20.9   # IDC叢集節點,樣本只有1個Master節點,同時也是Worker節點,可以運行業務容器。
virtual-kubelet-cn-zhangjiakou-a   Ready    agent    99s    v1.20.9。 # 安裝ack-virtual-node組件生產的虛擬節點。

步驟三:使用Serverless ECI運行Pod(CPU和GPU任務)

您可以通過以下兩種方式進行配置,使用Serverless ECI運行Pod。

方式一:配置Pod標籤

如下樣本中,使用GPU ECI執行個體運行CUDA任務。您無需安裝配置NVIDIA driver和runtime,真正做到Serverless化運行。

您可以為Pod添加標籤alibabacloud.com/eci=true,使Pod以Serverless ECI的方式運行。

  1. 使用以下YAML內容,提交Pod,使用Serverless ECI運行。

    > cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
      labels:
        alibabacloud.com/eci: "true"  # 指定Pod使用Serverless ECI運行。
      annotations:
        k8s.aliyun.com/eci-use-specs: ecs.gn5-c4g1.xlarge  # 指定支援的GPU規格,該規格具備1個NVIDIA P100 GPU。
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/cuda10.2-vectoradd
          resources:
            limits:
              nvidia.com/gpu: 1 # 申請1個GPU。
    EOF
    
  2. 執行以下命令,查看Pod。

    kubectl get pod -o wide

    預期輸出:

    NAME       READY   STATUS      RESTARTS   AGE     IP              NODE                               NOMINATED NODE   READINESS GATES
    gpu-pod    0/1     Completed   0          5m30s   172.16.XX.XX   virtual-kubelet-cn-zhangjiakou-a   <none>           <none>
    kubectl logs gpu-pod

    預期輸出:

    Using CUDA Device [0]: Tesla P100-PCIE-16GB
    GPU Device has SM 6.0 compute capability
    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done

    預期輸出表明,Pod運行在虛擬節點virtual-kubelet上,實際後台使用阿里雲Serverless ECI運行。

方式二:配置命名空間標籤

您可以通過以下命令,為命名空間添加標籤alibabacloud.com/eci=true,該命名空間中所有建立的Pod,將以Serverless ECI方式運行。

kubectl label namespace <namespace-name> alibabacloud.com/eci=true

步驟四:使用多級彈性調度

參見步驟三使用Pod或命名空間的標籤讓Pod以Serverless ECI的方式運行後,您可以使用ACK One註冊叢集的多級彈性調度功能實現此效果:應用運行過程中優先使用IDC中的節點資源運行Pod,當IDC資源不足時,再使用阿里雲Serverless ECI運行Pod。

通過ack-co-scheduler組件,可以自訂ResourcePolicy CR對象,從而使用多級彈性調度功能。ResourcePolicy CR為命名空間資源,主要參數說明如下。

參數

說明

selector

聲明ResourcePolicy作用於同一命名空間下label上打了key1=value1的Pod。

strategy

調度策略選擇,目前僅支援prefer

units

使用者自訂的調度單元。應用擴容時,將按照units下資源的順序選擇資源運行;應用縮容時,將按照逆序進行縮容。

  • resource:彈性資源的類型,目前支援idcecseci三種類型。

  • nodeSelector:用nodelabel標識該調度單元下的節點,只對ecs彈性資源生效。

  • max:在該組資源最多部署多少個執行個體。

  1. 使用以下內容,定義ResourcePolicy CR,優先使用IDC中叢集資源,再使用雲上Serverless ECI資源。

    > cat << EOF | kubectl apply -f -
    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: cost-balance-policy
    spec:
      selector:
        app: nginx           # 選擇應用Pod。
        key1: value1
      strategy: prefer
      units:
      - resource: idc        # 優先使用IDC指定使用IDC中節點資源。
        max:3
      - resource: eci        # 當IDC節點資源不足時,使用Serverless ECI。
        nodeSelector:
          key2: value2
    EOF
  2. 使用以下內容,建立應用Deployment,啟動2個副本,每個副本需要2個CPU。

    > cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          annotations:
            addannotion: "true"
          labels:
            app: nginx      # 此處要與上一步建立的ResourcePolicy的selector相關聯。
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: nginx
            image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/nginx
            resources:
              requests:
                cpu: 2
              limits:
                cpu: 2
    EOF
  3. 執行以下命令,對應用擴容4個副本。

    IDC中K8s叢集只有一個6 CPU節點,最多啟動2個Nginx Pod(系統資源預留,無法啟動3個Pod),剩餘的2個副本在IDC節點資源不足時,將自動使用阿里雲Serverless ECI運行Pod。

    kubectl scale deployment nginx --replicas 4
  4. 執行以下命令,查看Pod運行情況。

    > kubectl get pod -o wide

    預期輸出:

    NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE                      
    nginx-79cd98b4b5-97s47   1/1     Running   0          84s     10.100.XX.XX    iz8vb1xtnuu0ne6b58h****   
    nginx-79cd98b4b5-gxd8z   1/1     Running   0          84s     10.100.XX.XX    iz8vb1xtnuu0ne6b58h****   
    nginx-79cd98b4b5-k55rb   1/1     Running   0          58s     10.100.XX.XX    virtual-kubelet-cn-zhangjiakou-a
    nginx-79cd98b4b5-m9jxm   1/1     Running   0          58s     10.100.XX.XX    virtual-kubelet-cn-zhangjiakou-a

    預期輸出表明,2個Pod運行在IDC中的節點,2個Pod使用虛擬節點在阿里雲Serverless ECI上運行。