應對突發流量,如何快速爲自建 K8s 添加雲上彈性能力

以 Kubernetes 爲代表的容器技術帶來的是一種應用交付模式的變革,其正迅速成爲全世界數據中心的統一 API。

爲了保證業務持續穩定、用戶訪問不中斷,高可用、高彈性等能力是應用架構設計不變的追求,多集羣架構天然具備這樣的能力。而只有在 Kubernetes 這層統一且標準的 API 之下,多集羣和混合雲的能力纔開始真正體現價值。

在前一篇文章《選對方法,K8s 多集羣管理沒那麼難》中,我們着重介紹了阿里雲分佈式雲容器平臺 ACK One 註冊集羣的應用場景、架構實現、安全加固,以及在他雲 K8s 集羣和 IDC 自建 K8s 集羣中使用阿里雲容器服務 ACK 的強大可觀測性能力,實現雲上雲下 K8s 集羣的統一運維管理。

本文中,我們重點介紹 ACK One 註冊集羣的另一個重要使用場景--雲上彈性。

雲上彈性能力典型應用場景和優勢

ACK One 註冊集羣的雲上彈性能力針對的場景:

1. 業務快速增長:在本地 IDC 中部署的 K8s 集羣,往往受到 IDC 計算資源的限制無法及時擴容,計算資源的採購部署上線往往週期較長,無法承擔業務流量的快速增長。

2. 業務週期性增長或突發增長:本地 IDC 中的計算資源數量相對固定,無法應對業務週期性高峯,或者突發業務流量的增長。

解決以上場景的根本是計算資源彈性能力,可以跟隨業務流量的變化,彈性擴大或者縮小計算資源,滿足業務需求的同時也保證了成本的平衡。

ACK One 註冊集羣雲上彈性架構如下圖所示:

通過 ACK One 註冊集羣,本地 IDC 中的 K8s 集羣可以彈性擴容阿里雲 ECS 節點池,利用阿里雲容器服務的極致彈性能力,擴容應對業務流量增長,縮容實現成本節約。尤其針對 AI 場景,通過 ACK One 註冊集羣,可以將雲上 GPU 機器接入 IDC 中的 K8s 集羣。

爲本地 IDC K8s 集羣添加阿里雲 GPU 算力的最佳實踐

1. 創建 ACK One 註冊集羣

訪問 ACK One 控制檯註冊集羣用頁面,我們已經創建了註冊集羣 “ACKOneRegisterCluster1” 並接入了本地 IDC 中的 K8s 集羣。參見:《選對方法,K8s 多集羣管理沒那麼難》

ACK One 控制檯註冊集羣用頁面:
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcs.console.aliyun.com%2Fone

接入後,可以通過 ACK One 控制檯查看本地 IDC K8s 集羣,目前只有一個 master 節點。

2. 創建 GPU 節點池並手動擴容創建 1 個 GPU 節點

在註冊集羣中創建節點池 GPU-P100,將雲上 GPU 機器加入 IDC 中 K8s 集羣。

在 IDC K8s 集羣中執行 kubectl 查看節點信息。

kubectl get node
NAME                           STATUS   ROLES    AGE     VERSION
cn-zhangjiakou.172.16.217.xx   Ready    <none>   5m35s   v1.20.9    // 雲上GPU機器
iz8vb1xtnuu0ne6b58hvx0z        Ready    master   20h     v1.20.9    // IDC機器

k describe node cn-zhangjiakou.172.16.217.xx
Name:               cn-zhangjiakou.172.16.217.xx
Roles:              <none>
Labels:             aliyun.accelerator/nvidia_count=1             //nvidia labels
                    aliyun.accelerator/nvidia_mem=16280MiB        //nvidia labels 
                    aliyun.accelerator/nvidia_name=Tesla-P100-PCIE-16GB  //nvidia labels
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=cn-zhangjiakou.172.16.217.xx
                    kubernetes.io/os=linux
Capacity:
  cpu:                4
  ephemeral-storage:  123722704Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             30568556Ki
  nvidia.com/gpu:     1              //nvidia gpu
  pods:               110
Allocatable:
  cpu:                4
  ephemeral-storage:  114022843818
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             30466156Ki
  nvidia.com/gpu:     1              //nvidia gpu
  pods:               110
System Info:
  OS Image:                   Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle)
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://19.3.13
  Kubelet Version:            v1.20.9
  Kube-Proxy Version:         v1.20.9
......

3. 運行 GPU 任務測試

在 IDC 中 K8s 集羣中提交 GPU 測試任務,運行結果成功。

> cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
 name: gpu-pod
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 # requesting 1 GPU
EOF

> kubectl logs gpu-pod
[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

多級彈性調度策略,自定義彈性資源優先級

自定義彈性資源優先級調度是阿里雲提供的彈性調度策略。您可以在應用發佈或擴容過程中,自定義資源策略(ResourcePolicy),設置應用實例 Pod 被調度到不同類型節點資源的順序。同時在縮容過程中按照原調度順序逆序縮容。

通過上面的演示,我們可以通過 ACK One 註冊集羣,使用雲上 ECS 資源創建節點池,並添加到 IDC 集羣中。您可以爲節點池或者節點打標(label),並通過設置 Pod 的節點親 "affinity" 或者 “nodeSelector" 的方式,爲 Pod 選擇是在 IDC 本地節點中運行,還是在雲上 ECS 節點用運行。這種方式需要修改應用 pod 的配置,如果生產系統有較多的應用需要處理,則需要編寫調度規則,適合自定義調度的場景,例如:特定 CUDA 版本的 GPU 訓練任務調度到雲上特定的 GPU ECS 實例上。

爲了簡化 IDC 中 K8s 集羣使用雲上 ECS 資源,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:在該組資源最多部署多少個實例。

ResourcePolicy 支持以下場景:

場景 1:優先使用 IDC 中集羣資源,再使用雲上 ECS 資源

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: ecs        //當idc節點資源不足時,使用雲上ECS,可以通過nodeSelector選擇節點
    nodeSelector:
      alibabacloud.com/nodepool-id=np7b30xxx

場景 2:混合使用 IDC 資源和雲上 ECS 資源

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
 name: load-balance-policy
spec:
  selector:
    app: nginx
  strategy: prefer
  units:
  - resource: idc
    max: 2             //在idc節點中最多啓動2個應用實例
  - resource: ecs
    nodeSelector:
      alibabacloud.com/nodepool-id=np7b30xxx
    max: 4             //在ecs節點池中最多啓動4個應用實例

總結

演示中,我們將阿里雲 GPU P100 機器添加到 IDC 中的 K8s 集羣,擴展了 IDC 的 GPU 算力。

通過 ACK One 註冊集羣:

1. 您可以選擇阿里雲上的各種 ECS 實例類型和規格,包括:X86,ARM,GPU 等。

2. 您可以手動擴容和縮容 ECS 實例數量。

3. 您可以配置 ECS 實例數量的自動彈性伸縮。

4. 您可以使用多級彈性調度,優先使用 IDC 中資源,IDC 資源不足的情況下,自動擴容雲上 ECS 節點池處理突發業務流量。

參考文檔:

[1] 註冊集羣概述

https://help.aliyun.com/document_detail/155208.html

[2] 創建 ECS 節點池

https://help.aliyun.com/document_detail/208054.html

[3] 配置 ECS 節點自動彈性伸縮

https://help.aliyun.com/document_detail/208055.html

[4] 多級彈性調度

https://help.aliyun.com/document_detail/446694.html

作者:莊宇

點擊立即免費試用雲產品 開啓雲上實踐之旅!

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章