實現(xiàn)K8s集群以Serverless方式使用云上CPU/GPU資源
IDC中K8s集群通過Serverless方式使用阿里云彈性容器實例ECI運行業(yè)務(wù)Pod。您可以在K8s集群直接提交業(yè)務(wù)Pod,使Pod運行在ECI上,無需額外運維云上節(jié)點池,更加靈活、高效、彈性地使用云上CPU和GPU資源。本文介紹如何基于注冊集群實現(xiàn)IDC中K8s集群以Serverless方式使用云上CPU和GPU資源。
背景信息
為IDC中K8s集群直接添加云上節(jié)點或GPU節(jié)點的方式,適用于需要自定義配置的節(jié)點(runtime、kubelet、NVIDIA等)和特定的ECS實例規(guī)格等場景,該方式需要自行維護云上節(jié)點池,增加額外成本。您可以選擇Serverless方式使用阿里云彈性容器實例ECI運行業(yè)務(wù)Pod,無需額外運維云上節(jié)點池,可以更加高效彈性的使用云上CPU和GPU資源。
前提條件
已通過注冊集群內(nèi)接入IDC中的K8s集群。具體操作,請參見創(chuàng)建注冊集群。
已通過kubectl連接注冊集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
使用場景
通過Serverless方式使用云上CPU和GPU資源,解決的依然是IDC中K8s集群的彈性能力不足,不能滿足業(yè)務(wù)的快速增長、周期性業(yè)務(wù)增長和突發(fā)業(yè)務(wù)流量的問題。
通過Serverless方式,您可以在K8s集群直接提交業(yè)務(wù)Pod,該Pod將使用阿里云彈性容器實例ECI運行,彈性容器實例ECI啟動速度快,與業(yè)務(wù)Pod的生命周期一致,按Pod運行時間計費。從而不需要為IDC中K8s集群創(chuàng)建云上節(jié)點,無需規(guī)劃云上資源容量,也不需要等待ECS創(chuàng)建完成,實現(xiàn)了高度彈性,并節(jié)省了節(jié)點的運維成本。通過Serverless方式使用云上CPU和GPU資源的方式如下圖所示。
IDC中K8s集群以Serverless方式使用云上CPU和GPU資源適合以下業(yè)務(wù)場景。
在線業(yè)務(wù)的波峰波谷彈性伸縮:例如,在線教育、電商等行業(yè)有著明顯的波峰波谷計算特征。使用Serverless ECI可以顯著減少固定資源池的維護,降低計算成本。
數(shù)據(jù)計算:使用Serverless ECI承載Spark、Presto、ArgoWorkflow等計算場景,按Pod運行時間計費,有效降低計算成本。
CI/CD Pipeline:Jenkins、Gitlab-Runner。
Job任務(wù):定時任務(wù)、AI。
步驟一:安裝相關(guān)組件
通過注冊集群實現(xiàn)IDC中K8s集群以Serverless方式使用云上CPU和GPU資源,您需要安裝以下組件。
ack-virtual-node:使用虛擬節(jié)點和ECI的高度彈性能力。
ack-co-scheduler:通過該組件,您可以自定義ResourcePolicy CR對象,使用多級彈性調(diào)度功能。
您可以通過以下兩種方式安裝組件。
通過onectl安裝
在本地安裝配置onectl。具體操作,請參見通過onectl管理注冊集群。
執(zhí)行以下命令,安裝ack-virtual-node和ack-co-scheduler組件。
onectl addon install ack-virtual-node onectl addon install ack-co-scheduler
預(yù)期輸出:
Addon ack-virtual-node, version **** installed. Addon ack-co-scheduler, version **** installed.
通過控制臺安裝
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁面,單擊其他頁簽,找到ack-virtual-node和ack-co-scheduler組件,在卡片右下方單擊安裝。
在提示對話框中單擊確定。
步驟二:查看節(jié)點
ack-virtual-node組件安裝完成后,您可以通過注冊集群kubeconfig查看集群節(jié)點池。virtual-kubelet為虛擬節(jié)點,對接阿里云Serverless ECI。
執(zhí)行以下命令,查看節(jié)點。
kubectl get node
預(yù)期輸出:
NAME STATUS ROLES AGE VERSION
iz8vb1xtnuu0ne6b58hvx0z Ready master 4d3h v1.20.9 # IDC集群節(jié)點,示例只有1個Master節(jié)點,同時也是Worker節(jié)點,可以運行業(yè)務(wù)容器。
virtual-kubelet-cn-zhangjiakou-a Ready agent 99s v1.20.9。 # 安裝ack-virtual-node組件生產(chǎn)的虛擬節(jié)點。
步驟三:使用Serverless ECI運行Pod(CPU和GPU任務(wù))
您可以通過以下兩種方式進行配置,使用Serverless ECI運行Pod。
方式一:配置Pod標(biāo)簽
如下示例中,使用GPU ECI實例運行CUDA任務(wù)。您無需安裝配置NVIDIA driver和runtime,真正做到Serverless化運行。
您可以為Pod添加標(biāo)簽alibabacloud.com/eci=true
,使Pod以Serverless ECI的方式運行。
使用以下YAML內(nèi)容,提交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規(guī)格,該規(guī)格具備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
執(zhí)行以下命令,查看Pod。
kubectl get pod -o wide
預(yù)期輸出:
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
預(yù)期輸出:
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
預(yù)期輸出表明,Pod運行在虛擬節(jié)點virtual-kubelet上,實際后臺使用阿里云Serverless ECI運行。
方式二:配置命名空間標(biāo)簽
您可以通過以下命令,為命名空間添加標(biāo)簽alibabacloud.com/eci=true
,該命名空間中所有新建的Pod,將以Serverless ECI方式運行。
kubectl label namespace <namespace-name> alibabacloud.com/eci=true
步驟四:使用多級彈性調(diào)度
參見步驟三使用Pod或命名空間的標(biāo)簽讓Pod以Serverless ECI的方式運行后,您可以使用ACK One注冊集群的多級彈性調(diào)度功能實現(xiàn)此效果:應(yīng)用運行過程中優(yōu)先使用IDC中的節(jié)點資源運行Pod,當(dāng)IDC資源不足時,再使用阿里云Serverless ECI運行Pod。
通過ack-co-scheduler組件,可以自定義ResourcePolicy CR對象,從而使用多級彈性調(diào)度功能。ResourcePolicy CR為命名空間資源,主要參數(shù)說明如下。
參數(shù) | 說明 |
selector | 聲明ResourcePolicy作用于同一命名空間下 |
strategy | 調(diào)度策略選擇,目前僅支持 |
units | 用戶自定義的調(diào)度單元。應(yīng)用擴容時,將按照
|
使用以下內(nèi)容,定義ResourcePolicy CR,優(yōu)先使用IDC中集群資源,再使用云上Serverless ECI資源。
> cat << EOF | kubectl apply -f - apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: cost-balance-policy spec: selector: app: nginx # 選擇應(yīng)用Pod。 key1: value1 strategy: prefer units: - resource: idc # 優(yōu)先使用IDC指定使用IDC中節(jié)點資源。 max:3 - resource: eci # 當(dāng)IDC節(jié)點資源不足時,使用Serverless ECI。 nodeSelector: key2: value2 EOF
使用以下內(nèi)容,創(chuàng)建應(yīng)用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 # 此處要與上一步創(chuàng)建的ResourcePolicy的selector相關(guān)聯(lián)。 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
執(zhí)行以下命令,對應(yīng)用擴容4個副本。
IDC中K8s集群只有一個6 CPU節(jié)點,最多啟動2個Nginx Pod(系統(tǒng)資源預(yù)留,無法啟動3個Pod),剩余的2個副本在IDC節(jié)點資源不足時,將自動使用阿里云Serverless ECI運行Pod。
kubectl scale deployment nginx --replicas 4
執(zhí)行以下命令,查看Pod運行情況。
> kubectl get pod -o wide
預(yù)期輸出:
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
預(yù)期輸出表明,2個Pod運行在IDC中的節(jié)點,2個Pod使用虛擬節(jié)點在阿里云Serverless ECI上運行。