當您需要在短時間內快速建立大量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託管叢集或ACK專有叢集,且叢集版本為1.16及以上。如需建立叢集,請參見建立ACK託管叢集或建立ACK專有叢集;如需升級叢集,請參見手動升級叢集。
已開通Elastic Container Instance服務並確認叢集所在地區在ECI支援的地區列表內。
可登入Elastic Container Instance控制台開通相應的服務,並查看當前支援的地區和可用性區域。
已通過kubectl串連Kubernetes叢集。具體操作,請參見在CloudShell上通過kubectl管理Kubernetes叢集。
步驟一:部署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託管叢集
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面的核心組件地區,選擇ack-virtual-node組件,然後單擊安裝,並按照頁面提示完成操作。
安裝時,使用叢集預設虛擬交換器和安全性群組作為ack-virtual-node的初始ECI配置參數。如需修改ECI配置參數,請參見下文相關操作。
ACK專有叢集
登入Container Service管理主控台,在左側導覽列選擇 。
在應用市場頁面單擊應用目錄頁簽,搜尋並選中ack-virtual-node,然後在ack-virtual-node頁面,單擊一鍵部署。
在建立面板中,選擇叢集和命名空間,然後單擊下一步。
命名空間已設定為kube-system,發布名稱已設定為ack-virtual-node。
在參數配置頁面,選擇最新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的連接埠
執行以下命令,查看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上。樣本如下。
執行以下命令,為Pod添加標籤
alibabacloud.com/eci=true
。kubectl run nginx --image nginx -l alibabacloud.com/eci=true
執行以下命令,查看通過虛擬節點調度到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上。樣本如下。
執行以下命令,建立命名空間
vk
。kubectl create ns vk
執行以下命令,為Pod所在的命名空間
vk
添加標籤alibabacloud.com/eci=true
。kubectl label namespace vk alibabacloud.com/eci=true
執行以下命令,讓命名空間中的Pod調度到虛擬節點上。
kubectl -n vk run nginx --image nginx
執行以下命令,查看通過虛擬節點調度到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託管叢集
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面的核心組件地區,選擇ack-virtual-node組件,然後單擊升級,並按照頁面提示完成操作。
ACK專有叢集
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在Helm列表的操作列,單擊ack-virtual-node對應的更新,在版本地區,選擇最新的Chart版本。
在配置參數地區,更新Required欄位(需與此前配置一致。如此前配置了Optional欄位,也需保持一致),然後單擊確定。
您也可以同時指定
virtualNode.image.tag
欄位,升級VirtualNode鏡像到指定版本。
修改ACK虛擬節點配置
關於修改ACK虛擬節點配置的操作,請參見配置eci-profile。
刪除ACK虛擬節點
卸載ack-virtual-node組件。
在ACK託管版叢集中,刪除所有ECI Pod後,在組件管理頁面卸載ack-virtual-node組件。
在ACK專有版叢集中,刪除所有ECI Pod後,在Helm管理頁面刪除ack-virtual-node組件。
通過命令
kubectl delete node <node name>
刪除相關虛擬節點。說明卸載ack-virtual-node組件後,叢集中已建立的ECI Pod並不會被刪除。