當您需要在短時間內快速創(chuàng)建大量Pod時,ECS節(jié)點擴容速度可能無法滿足要求,而預留額外的ECS節(jié)點又會產生資源浪費。借助ACK虛擬節(jié)點可以將Pod快速地調度到彈性容器實例ECI上運行,且無需購買和管理ECS節(jié)點。本文介紹如何在ACK集群(ACK托管集群和ACK專有集群)中將Pod調度到ECI上運行。
工作原理
阿里云彈性容器實例ECI(Elastic Container Instance)是面向容器設計的無服務器彈性計算服務,提供了免運維、強隔離、能快速啟動的容器運行環(huán)境。使用ECI時,您無需購買和管理底層ECS服務器,可以更加關注容器應用而非底層基礎設施的維護工作。您可按需創(chuàng)建ECI,僅為容器配置的資源付費(按量按秒計費)。
通常,您的ACK集群會有至少一組ECS節(jié)點池,創(chuàng)建Pod時,背后是將Pod調度到ECS節(jié)點上運行,這種架構能很好地應對流量穩(wěn)定的業(yè)務。如果您的業(yè)務有不易提前預測的瞬時波峰,盡管ACK支持彈性伸縮,但ECS節(jié)點池擴容時,ECS實例的創(chuàng)建和啟動本身會有一定的額外耗時。借助虛擬節(jié)點,您可以直接調度Pod到ECI上運行,省去節(jié)點創(chuàng)建時間,避免產生閑置節(jié)點資源,降低成本。
適用場景
在ECI上運行Pod適合應對突發(fā)流量,也能降低計算成本。典型場景包括:
有明顯波峰波谷的在線業(yè)務:例如在線教育、電商等業(yè)務的流量通常有明顯的波峰波谷,使用ECI Pod可以更快速地應對突發(fā)流量,并且能顯著減少固定資源池的維護,降低計算成本。
非持續(xù)運行的計算任務,使用ECI Pod運行計算任務,無需保留固定節(jié)點,僅需為任務執(zhí)行期間的計算資源付費,降低計算成本,例如:
數據計算:Spark、Presto。
CI/CD Pipeline:例如Jenkins、Gitlab-Runner等。
Job任務:例如定時任務、AI任務等。
前提條件
已創(chuàng)建ACK托管集群或ACK專有集群,且集群版本為1.16及以上。如需創(chuàng)建集群,請參見創(chuàng)建ACK托管集群或創(chuàng)建ACK專有集群;如需升級集群,請參見手動升級集群。
已開通彈性容器實例服務并確認集群所在區(qū)域在ECI支持的地域列表內。
可登錄彈性容器實例控制臺開通相應的服務,并查看當前支持的地域和可用區(qū)。
已通過kubectl連接Kubernetes集群。具體操作,請參見在CloudShell上通過kubectl管理Kubernetes集群。
步驟一:部署ack-virtual-node組件
ACK托管集群和ACK專有集群中的ack-virtual-node組件安裝和托管方式有所不同:
在ACK托管集群中,需要通過組件管理頁面部署ack-virtual-node組件,該組件默認被托管,不占用Worker節(jié)點資源。
在ACK專有集群中,需要通過應用市場頁面部署ack-virtual-node組件,安裝成功后會在kube-system命名空間下創(chuàng)建一個名為ack-virtual-node-controller的deployment,該deployment會運行在您的Worker節(jié)點上。
ACK托管集群
ACK專有集群
登錄容器服務管理控制臺,在左側導航欄選擇 。
在應用市場頁面單擊應用目錄頁簽,搜索并選中ack-virtual-node,然后在ack-virtual-node頁面,單擊一鍵部署。
在創(chuàng)建面板中,選擇集群和命名空間,然后單擊下一步。
命名空間已設置為kube-system,發(fā)布名稱已設置為ack-virtual-node。
在參數配置頁面,選擇最新Chart 版本,在參數區(qū)域,配置虛擬節(jié)點參數,然后單擊確定。
參數
可選屬性
描述
獲取路徑
ALIYUN_CLUSTERID
Required
集群ID
在集群信息頁面的基本信息頁簽獲取集群ID。
ALIYUN_RESOURCEGROUP_ID
Optional
資源組ID
不配置時,默認使用默認資源組。如需配置,登錄資源管理控制臺,獲取目標資源組ID。
ECI_REGION
Required
地域ID
在集群信息頁面的基本信息頁簽獲取地域信息。
說明關于地域名稱與地域ID的關系,請參見地域和可用區(qū)列表。
ECI_VPC
Optional
虛擬專有網絡VPC ID
在集群信息頁面的基本信息頁簽獲取集群VPC ID。
ECI_VSWITCH
Required
虛擬交換機
多個vSwitch ID組成的虛擬交換機列表,用于為業(yè)務Pod分配IP。多個vSwitch ID之間使用英文半角逗號(,)分隔,例如
vsw-xxx1, vsw-xxx2
。建議與節(jié)點池使用相同的虛擬交換機列表。可在節(jié)點池頁面的節(jié)點池列表,單擊某個節(jié)點池,在基本詳情頁簽的節(jié)點配置區(qū)域,獲取節(jié)點vSwitch ID。
說明請確認當前虛擬交換機在ECI支持的可用區(qū)列表中。
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的端口
執(zhí)行以下命令,查看ack-virtual-node組件部署狀態(tài)。
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組件后,您可以借助虛擬節(jié)點將Pod調度到ECI上。本小節(jié)介紹了在ACK托管集群和ACK專有集群中將Pod調度到ECI上的兩種常見方式。
如果您期望在ACK集群Pro版配置更為靈活的ECI Pod調度策略,例如只允許將Pod調度到ECI上、優(yōu)先調度Pod到ECS節(jié)點上,或只允許將Pod調度到ECS節(jié)點上,具體操作請參見指定ECS和ECI的資源分配。
通過Pod標簽將Pod調度到ECI上
創(chuàng)建Pod時添加標簽alibabacloud.com/eci=true
,Pod將被調度到ECI上。示例如下。
執(zhí)行以下命令,為Pod添加標簽
alibabacloud.com/eci=true
。kubectl run nginx --image nginx -l alibabacloud.com/eci=true
執(zhí)行以下命令,查看通過虛擬節(jié)點調度到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
后,在該命名空間內創(chuàng)建Pod,Pod將調度到ECI上。示例如下。
執(zhí)行以下命令,創(chuàng)建命名空間
vk
。kubectl create ns vk
執(zhí)行以下命令,為Pod所在的命名空間
vk
添加標簽alibabacloud.com/eci=true
。kubectl label namespace vk alibabacloud.com/eci=true
執(zhí)行以下命令,讓命名空間中的Pod調度到虛擬節(jié)點上。
kubectl -n vk run nginx --image nginx
執(zhí)行以下命令,查看通過虛擬節(jié)點調度到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>
相關操作
為了使用虛擬節(jié)點的一些更高級的特性,后續(xù)您可能需要升級ack-virtual-node組件或者修改ACK虛擬節(jié)點配置。當您不再需要使用虛擬節(jié)點時,也可以刪除ack-virtual-node組件。
升級ack-virtual-node組件
升級耗時約1分鐘。升級過程中無法新建Pod,但對存量Pod不造成影響。
ACK托管集群
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁面的核心組件區(qū)域,選擇ack-virtual-node組件,然后單擊升級,并按照頁面提示完成操作。
ACK專有集群
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在Helm列表的操作列,單擊ack-virtual-node對應的更新,在版本區(qū)域,選擇最新的Chart版本。
在配置參數區(qū)域,更新Required字段(需與此前配置一致。如此前配置了Optional字段,也需保持一致),然后單擊確定。
您也可以同時指定
virtualNode.image.tag
字段,升級VirtualNode鏡像到指定版本。
修改ACK虛擬節(jié)點配置
關于修改ACK虛擬節(jié)點配置的操作,請參見配置eci-profile。
刪除ACK虛擬節(jié)點
卸載ack-virtual-node組件。
在ACK托管版集群中,刪除所有ECI Pod后,在組件管理頁面卸載ack-virtual-node組件。
在ACK專有版集群中,刪除所有ECI Pod后,在Helm管理頁面刪除ack-virtual-node組件。
通過命令
kubectl delete node <node name>
刪除相關虛擬節(jié)點。說明卸載ack-virtual-node組件后,集群中已創(chuàng)建的ECI Pod并不會被刪除。