天天看點

本地 IDC 中的 K8s 叢集如何以 Serverless 方式使用雲上計算資源

作者:技術聯盟總壇

莊宇 阿裡雲雲原生 2023-07-18 18:30 發表于浙江

本地 IDC 中的 K8s 叢集如何以 Serverless 方式使用雲上計算資源

在前一篇文章《應對突發流量,如何快速為自建 K8s 添加雲上彈性能力》中,我們介紹了如何為 IDC 中 K8s 叢集添加雲上節點,應對業務流量的增長,通過多級彈性排程,靈活使用雲上資源,并通過自動彈性伸縮,提高使用率,降低雲上成本。

這種直接添加節點的方式,适合需要自定義配置節點(runtime,kubelet,NVIDIA 等),需要特定 ECS 執行個體規格等場景。同時,這種方式意味您需要自行維護雲上節點池。

如果您不想維護雲上節點池,您可以選擇 Serverless 方式使用阿裡雲 ECI 彈性容器執行個體運作業務 Pod,更加高效彈性的使用雲上 CPU/GPU 資源。

概述

Cloud Native

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

通過 Serverless 方式,可以在 K8s 叢集直接送出業務 Pod,Pod 将使用阿裡雲 ECI 彈性容器執行個體運作,ECI 彈性容器執行個體啟動速度快,與業務 Pod 的生命周期一緻,按 Pod 運作時間計費。進而不需要為 IDC 中 K8s 叢集建立雲上節點,不需要規劃雲上資源容量,不需要等待 ECS 建立完成,實作了極緻彈性,并節省了節點運維成本。

IDC 中 K8s 叢集以 Serverless 方式使用雲上 CPU/GPU 資源,适合以下業務場景:

  • 線上業務的波峰波谷彈性伸縮:如線上教育、電商等行業有着明顯的波峰波谷計算特征。使用 Serverless ECI 可以顯著減少固定資源池的維護,降低計算成本。
  • 資料計算:使用 Serverless ECI 承載 Spark、Presto、ArgoWorkflow 等計算場景,按 Pod 運作時間計費,有效降低計算成本。
  • CI/CD Pipeline:Jenkins、Gitlab-Runner。
  • Job 任務:定時任務、AI。
本地 IDC 中的 K8s 叢集如何以 Serverless 方式使用雲上計算資源

示範-IDC 中 K8s 叢集以 Serverless 方式使用雲上資源

Cloud Native

1. 前提條件

已經通過 ACK One 注冊機群接入 IDC 中 K8s 叢集,參見《選對方法,K8s 多叢集管理沒那麼難》。

2. 安裝 ack-virtual-node 元件

通過 ACK One 注冊叢集控制台安裝 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元件生産的虛拟節點           

3. 使用 Serverless ECI 運作 Pod(CPU/GPU 任務)

方式一:配置 Pod 标簽,為 Pod 添加标簽 alibabacloud.com/eci=true,Pod 将以 Serverless ECI 方式運作。示例中,使用 GPU ECI 執行個體運作 CUDA 任務,您不需要安裝配置 NVIDIA driver 和 runtime,真正做到 Serverless 化運作。

a. 送出 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           

b. 檢視 Pod,Pod 運作在虛拟節點 virtual-kubelet 上,實際背景使用阿裡雲 Serverless ECI 運作。

> 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.217.90   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           

方式二:設定命名空間标簽

為命名空間設定标簽 alibabacloud.com/eci=true,命名空間中所有建立 pod,将以 Serverless ECI 方式運作。

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

4. 多級彈性排程

上面的示範中,我們通過設定 Pod 或者命名空間的标簽以使用 Serverless ECI 運作 Pod。如果您期望應用運作過程中優先使用 IDC 中的節點資源運作 Pod,當 IDC 資源不足時,再使用阿裡雲 Serverless ECI 運作 Pod。您可以使用 ACK One 注冊叢集的多級彈性排程,通過安裝 ack-co-scheduler 元件,您可以定義 ResourcePolicy CR 對象,使用多級彈性排程功能。

ResourcePolicy CR 是命名空間資源,重要參數解析:

  • selector:聲明 ResourcePolicy 作用于同一命名空間下 label 上打了 key1=value1 的 Pod
  • strategy:排程政策選擇,目前隻支援 prefer
  • units:使用者自定義的排程單元。應用擴容時,将按照 units 下資源的順序選擇資源運作;應用縮容時,将按照逆序進行縮容
    • resource:彈性資源的類型,目前支援 idc、ecs 和 eci 三種類型
    • nodeSelector:用 node 的 label 辨別該排程單元下的節點,隻對 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

  strategy: prefer

  units:

  - resource: idc        //優先使用idc指定使用IDC中節點資源

  - resource: eci        //當idc節點資源不足時,使用Serverless ECI

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 叢集隻有一個 6CPU 節點,最多啟動 2 個 nginx pods(系統資源預留,無法啟動 3 個 pod)。剩餘的 2 個副本在 IDC 節點資源不足後,自動使用阿裡雲 Serverless ECI 運作 Pods。

kubectl scale deployment nginx --replicas 4           

4) 檢視 Pod 運作情況,2 個 Pod 運作在 IDC 中的節點,2 個 Pod 使用虛拟節點在阿裡雲 Serverless ECI 上運作。

> kubectl get pod -o wide
k get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE                      
nginx-79cd98b4b5-97s47   1/1     Running   0          84s     10.100.75.22    iz8vb1xtnuu0ne6b58hvx0z   
nginx-79cd98b4b5-gxd8z   1/1     Running   0          84s     10.100.75.23    iz8vb1xtnuu0ne6b58hvx0z   
nginx-79cd98b4b5-k55rb   1/1     Running   0          58s     10.100.75.24    virtual-kubelet-cn-zhangjiakou-a
nginx-79cd98b4b5-m9jxm   1/1     Running   0          58s     10.100.75.25    virtual-kubelet-cn-zhangjiakou-a           

總結

Cloud Native

本文介紹了基于 ACK One 注冊叢集實作 IDC 中 K8s 叢集以 Serverless ECI 方式使用阿裡雲 CPU 和 GPU 計算資源,以應對業務流量增長。這種方式,完全 Serverless 化,無需額外運維雲上節點,按 Pod 運作時間計費,靈活高效。

後續我們将陸續推出 ACK One 注冊叢集的系列文章,包括:容災備份,安全管理等。歡迎通過搜尋釘釘群号加入我們。(群号:35688562)

參考文檔:

[1] 注冊叢集概述

[2] 使用彈性容器ECI擴容叢集

[3] ECI支援的執行個體類型

[4] 多級彈性排程