全部產品
Search
文件中心

Container Service for Kubernetes:通過虛擬節點將Pod調度到ECI上運行

更新時間:Aug 21, 2024

當您需要在短時間內快速建立大量Pod時,ECS節點擴容速度可能無法滿足要求,而預留額外的ECS節點又會產生資源浪費。藉助ACK虛擬節點可以將Pod快速地調度到Elastic Container Instance上運行,且無需購買和管理ECS節點。本文介紹如何在ACK叢集(ACK託管叢集ACK專有叢集)中將Pod調度到ECI上運行。

工作原理

阿里雲Elastic Container Instance(Elastic Container Instance)是面向容器設計的無伺服器彈性計算服務,提供了免營運、強隔離、能快速啟動的容器運行環境。使用ECI時,您無需購買和管理底層ECS伺服器,可以更加關注容器應用而非底層基礎設施的維護工作。您可按需建立ECI,僅為容器配置的資源付費(按量按秒計費)。

通常,您的ACK叢集會有至少一組ECS節點池,建立Pod時,背後是將Pod調度到ECS節點上運行,這種架構能很好地應對流量穩定的業務。如果您的業務有不易提前預測的瞬時波峰,儘管ACK支援Auto Scaling,但ECS節點池擴容時,ECS執行個體的建立和啟動本身會有一定的額外耗時。藉助虛擬節點,您可以直接調度Pod到ECI上運行,省去節點建立時間,避免產生閑置節點資源,降低成本。

適用情境

在ECI上運行Pod適合應對突發流量,也能降低計算成本。典型情境包括:

  • 有明顯波峰波穀的線上業務:例如線上教育、電商等業務的流量通常有明顯的波峰波穀,使用ECI Pod可以更快速地應對突發流量,並且能顯著減少固定資源集區的維護,降低計算成本。

  • 非持續啟動並執行計算任務,使用ECI Pod運行計算任務,無需保留固定節點,僅需為任務執行期間的計算資源付費,降低計算成本,例如:

    • 資料計算:Spark、Presto。

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

    • Job任務:例如定時任務、AI任務等。

前提條件

步驟一:部署ack-virtual-node組件

ACK託管叢集ACK專有叢集中的ack-virtual-node組件安裝和託管方式有所不同:

  • ACK託管叢集中,需要通過組件管理頁面部署ack-virtual-node組件,該組件預設被託管,不佔用Worker節點資源。

  • ACK專有叢集中,需要通過應用市場頁面部署ack-virtual-node組件,安裝成功後會在kube-system命名空間下建立一個名為ack-virtual-node-controller的deployment,該deployment會運行在您的Worker節點上。

ACK託管叢集

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

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

  3. 組件管理頁面的核心組件地區,選擇ack-virtual-node組件,然後單擊安裝,並按照頁面提示完成操作。

    安裝時,使用叢集預設虛擬交換器和安全性群組作為ack-virtual-node的初始ECI配置參數。如需修改ECI配置參數,請參見下文相關操作

ACK專有叢集

  1. 登入Container Service管理主控台,在左側導覽列選擇市場 > 應用市場

  2. 應用市場頁面單擊應用目錄頁簽,搜尋並選中ack-virtual-node,然後在ack-virtual-node頁面,單擊一鍵部署

  3. 建立面板中,選擇叢集和命名空間,然後單擊下一步

    命名空間已設定為kube-system,發布名稱已設定為ack-virtual-node。

  4. 參數配置頁面,選擇最新Chart 版本,在參數地區,配置虛擬節點參數,然後單擊確定

    參數

    可選屬性

    描述

    擷取路徑

    ALIYUN_CLUSTERID

    Required

    叢集ID

    叢集資訊頁面的基本資料頁簽擷取叢集ID。

    ALIYUN_RESOURCEGROUP_ID

    Optional

    資源群組ID

    不配置時,預設使用預設資源群組。如需配置,登入資源管理主控台,擷取目標資源群組ID。

    ECI_REGION

    Required

    地區ID

    叢集資訊頁面的基本資料頁簽擷取地區資訊。

    說明

    關於地區名稱與地區ID的關係,請參見地區和可用性區域列表

    ECI_VPC

    Optional

    Virtual Private Cloud絡VPC ID

    叢集資訊頁面的叢集資源頁簽擷取叢集VPC ID。

    ECI_VSWITCH

    Required

    虛擬交換器

    多個vSwitch ID組成的虛擬交換器列表,用於為業務Pod分配IP。多個vSwitch ID之間使用英文半形逗號(,)分隔,例如vsw-xxx1, vsw-xxx2。建議與節點池使用相同的虛擬交換器列表。

    可在節點池頁面的節點池列表,單擊某個節點池,在基本詳情頁簽的節點配置地區,擷取節點vSwitch ID。

    說明

    請確認當前虛擬交換器在ECI支援的可用性區域列表中。

    ECI_SECURITY_GROUP

    Required

    安全性群組ID

    叢集資訊頁面的叢集資源頁簽擷取安全性群組ID。

    ECI_ACCESS_KEY

    Required

    您的AccessKey ID

    請參見擷取AccessKey

    請授權RAM的AliyunECIFullAccess策略。更多資訊,請參見為RAM使用者授權

    ECI_SECRET_KEY

    Required

    您的AccessKey Secret

    請參見擷取AccessKey

    請授權RAM的AliyunECIFullAccess策略。更多資訊,請參見為RAM使用者授權

    KUBERNETES_APISERVER_HOST

    Required

    API Server的IP地址

    API Server內網串連端點的IP和連接埠。可在叢集資訊頁面的基本資料頁簽查詢。

    KUBERNETES_APISERVER_PORT

    Required

    API Server的連接埠

  5. 執行以下命令,查看ack-virtual-node組件部署狀態。

    kubectl -n kube-system get deploy ack-virtual-node-controller

    預期輸出:

    NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
    ack-virtual-node-controller   1/1     1            1           2m31s

步驟二:將Pod調度到ECI上運行

為叢集部署了ack-virtual-node組件後,您可以藉助虛擬節點將Pod調度到ECI上。本小節介紹了在ACK託管叢集ACK專有叢集中將Pod調度到ECI上的兩種常見方式。

如果您期望在ACK叢集Pro版配置更為靈活的ECI Pod調度策略,例如只允許將Pod調度到ECI上、優先調度Pod到ECS節點上,或只允許將Pod調度到ECS節點上,具體操作請參見指定ECS和ECI的資源分派

通過Pod標籤將Pod調度到ECI上

建立Pod時添加標籤alibabacloud.com/eci=true,Pod將被調度到ECI上。樣本如下。

  1. 執行以下命令,為Pod添加標籤alibabacloud.com/eci=true

    kubectl run nginx --image nginx -l alibabacloud.com/eci=true
  2. 執行以下命令,查看通過虛擬節點調度到ECI上啟動並執行Pod。

    kubectl get pod -o wide|grep virtual-kubelet

    預期輸出:

    nginx-7fc9f746b6-r4xgx     1/1     Running   0          34s   192.XX.XX.108   virtual-kubelet-cn-hangzhou-k        <none>           <none>

通過命名空間標籤將Pod調度到ECI上

在命名空間上添加標籤alibabacloud.com/eci=true後,在該命名空間內建立Pod,Pod將調度到ECI上。樣本如下。

  1. 執行以下命令,建立命名空間vk

    kubectl create ns vk
  2. 執行以下命令,為Pod所在的命名空間vk添加標籤alibabacloud.com/eci=true

    kubectl label namespace vk alibabacloud.com/eci=true
  3. 執行以下命令,讓命名空間中的Pod調度到虛擬節點上。

    kubectl -n vk run nginx --image nginx
  4. 執行以下命令,查看通過虛擬節點調度到ECI上啟動並執行Pod。

    kubectl -n vk get pod -o wide|grep virtual-kubelet

    預期輸出:

    nginx-6f489b847d-vgj4d      1/1     Running             0          1m   192.XX.XX.108   virtual-kubelet-cn-hangzhou-k        <none>           <none>

相關操作

為了使用虛擬節點的一些更進階的特性,後續您可能需要升級ack-virtual-node組件或者修改ACK虛擬節點配置。當您不再需要使用虛擬節點時,也可以刪除ack-virtual-node組件。

升級ack-virtual-node組件

升級耗時約1分鐘。升級過程中無法建立Pod,但對存量Pod不造成影響。

ACK託管叢集

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

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

  3. 組件管理頁面的核心組件地區,選擇ack-virtual-node組件,然後單擊升級,並按照頁面提示完成操作。

ACK專有叢集

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

  3. 在Helm列表的操作列,單擊ack-virtual-node對應的更新,在版本地區,選擇最新的Chart版本。

  4. 在配置參數地區,更新Required欄位(需與此前配置一致。如此前配置了Optional欄位,也需保持一致),然後單擊確定

    您也可以同時指定virtualNode.image.tag欄位,升級VirtualNode鏡像到指定版本。

修改ACK虛擬節點配置

關於修改ACK虛擬節點配置的操作,請參見配置eci-profile

刪除ACK虛擬節點

  1. 卸載ack-virtual-node組件。

    • 在ACK託管版叢集中,刪除所有ECI Pod後,在組件管理頁面卸載ack-virtual-node組件。

    • 在ACK專有版叢集中,刪除所有ECI Pod後,在Helm管理頁面刪除ack-virtual-node組件。

  2. 通過命令kubectl delete node <node name>刪除相關虛擬節點。

    說明

    卸載ack-virtual-node組件後,叢集中已建立的ECI Pod並不會被刪除。