通過虛擬節(jié)點(diǎn)將Pod調(diào)度到ECI上運(yùn)行
當(dāng)您需要在短時(shí)間內(nèi)快速創(chuàng)建大量Pod時(shí),ECS節(jié)點(diǎn)擴(kuò)容速度可能無(wú)法滿足要求,而預(yù)留額外的ECS節(jié)點(diǎn)又會(huì)產(chǎn)生資源浪費(fèi)。借助ACK虛擬節(jié)點(diǎn)(Virtual Node)可以將Pod快速地調(diào)度到彈性容器實(shí)例ECI上運(yùn)行,且無(wú)需購(gòu)買和管理ECS節(jié)點(diǎn)。本文主要介紹如何在注冊(cè)集群中將Pod調(diào)度到ECI上運(yùn)行。
工作原理
阿里云彈性容器實(shí)例ECI(Elastic Container Instance)是面向容器設(shè)計(jì)的無(wú)服務(wù)器彈性計(jì)算服務(wù),提供了免運(yùn)維、強(qiáng)隔離、能快速啟動(dòng)的容器運(yùn)行環(huán)境。使用ECI時(shí),您無(wú)需購(gòu)買和管理底層ECS服務(wù)器,可以更加關(guān)注容器應(yīng)用而非底層基礎(chǔ)設(shè)施的維護(hù)工作。您可按需創(chuàng)建ECI,僅為容器配置的資源付費(fèi)(按量按秒計(jì)費(fèi))。
通常,您的ACK集群會(huì)有至少一組ECS節(jié)點(diǎn)池,創(chuàng)建Pod時(shí),背后是將Pod調(diào)度到ECS節(jié)點(diǎn)上運(yùn)行,這種架構(gòu)能很好地應(yīng)對(duì)流量穩(wěn)定的業(yè)務(wù)。如果您的業(yè)務(wù)有不易提前預(yù)測(cè)的瞬時(shí)波峰,盡管ACK支持彈性伸縮,但ECS節(jié)點(diǎn)池?cái)U(kuò)容時(shí),ECS實(shí)例的創(chuàng)建和啟動(dòng)本身會(huì)有一定的額外耗時(shí)。借助虛擬節(jié)點(diǎn)Virtual Node,您可以直接將Pod調(diào)度到ECI上運(yùn)行,省去節(jié)點(diǎn)創(chuàng)建時(shí)間,避免產(chǎn)生閑置節(jié)點(diǎn)資源,降低成本。
前提條件
已創(chuàng)建注冊(cè)集群,并將自建Kubernetes集群(集群版本需大于等于1.14)接入注冊(cè)集群。具體操作,請(qǐng)參見創(chuàng)建注冊(cè)集群。
已登錄彈性容器實(shí)例控制臺(tái)開通相應(yīng)的服務(wù)。
已確認(rèn)集群所在區(qū)域在ECI支持的地域列表內(nèi)。登錄彈性容器實(shí)例控制臺(tái)查看已經(jīng)支持的地域和可用區(qū)。彈性容器實(shí)例ECI地域和可用區(qū)列表信息,請(qǐng)參見地域和可用區(qū)。
步驟一:為ack-virtual-node組件配置RAM權(quán)限
通過onectl配置
在本地安裝配置onectl。具體操作,請(qǐng)參見通過onectl管理注冊(cè)集群。
執(zhí)行以下命令,為ack-virtual-node組件配置RAM權(quán)限。
onectl ram-user grant --addon ack-virtual-node
預(yù)期輸出:
Ram policy ack-one-registered-cluster-policy-ack-virtual-node granted to ram user ack-one-user-ce313528c3 successfully.
通過控制臺(tái)配置
在注冊(cè)集群安裝組件之前,您需要在接入集群中設(shè)置AccessKey用來(lái)訪問云服務(wù)的權(quán)限。設(shè)置AccessKey之前,您需要?jiǎng)?chuàng)建RAM用戶并為其添加訪問相關(guān)云資源的權(quán)限。
創(chuàng)建RAM用戶。具體操作,請(qǐng)參見創(chuàng)建RAM用戶。
可選:創(chuàng)建自定義權(quán)限策略。具體操作,請(qǐng)參見創(chuàng)建自定義權(quán)限策略。
{ "Version": "1", "Statement": [ { "Action": [ "eci:CreateContainerGroup", "eci:DeleteContainerGroup", "eci:DescribeContainerGroups", "eci:DescribeContainerGroupStatus", "eci:DescribeContainerGroupEvents", "eci:DescribeContainerLog", "eci:UpdateContainerGroup", "eci:UpdateContainerGroupByTemplate", "eci:CreateContainerGroupFromTemplate", "eci:RestartContainerGroup", "eci:ExportContainerGroupTemplate", "eci:DescribeContainerGroupMetric", "eci:DescribeMultiContainerGroupMetric", "eci:ExecContainerCommand", "eci:CreateImageCache", "eci:DescribeImageCaches", "eci:DeleteImageCache", "vpc:DescribeVSwitches" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
為RAM用戶添加權(quán)限。具體操作,請(qǐng)參見為RAM用戶授權(quán)。
可選擇自定義權(quán)限策略或AliyunECIFullAccess策略為RAM用戶授權(quán)。
為RAM用戶創(chuàng)建AccessKey。具體操作,請(qǐng)參見獲取AccessKey。
使用AccessKey在注冊(cè)集群中創(chuàng)建名為alibaba-addon-secret的Secret資源。
安裝ack-virtual-node組件時(shí)將自動(dòng)引用此AccessKey訪問對(duì)應(yīng)的云服務(wù)資源。
kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'
說(shuō)明<your access key id>
及<your access key secret>
為上一步獲取的AccessKey信息。
步驟二:安裝ack-virtual-node組件
通過onectl安裝
執(zhí)行以下命令,安裝ack-virtual-node組件。
onectl addon install ack-virtual-node
預(yù)期輸出:
Addon ack-virtual-node, version **** installed.
通過控制臺(tái)安裝
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
單擊其他頁(yè)簽,在ack-virtual-node組件區(qū)域單擊安裝。
在提示對(duì)話框中單擊確定。這時(shí)會(huì)以集群默認(rèn)虛擬交換機(jī)和安全組作為ack-virtual-node的初始ECI配置參數(shù)。具體操作,請(qǐng)參見相關(guān)操作。
步驟三:將Pod調(diào)度到ECI上運(yùn)行
為集群部署了ack-virtual-node組件后,您可以借助虛擬節(jié)點(diǎn)將Pod調(diào)度到ECI上。本小節(jié)介紹了在注冊(cè)集群中將Pod調(diào)度到ECI上的兩種常見方式。調(diào)度前需要確保Virtual node的狀態(tài)為Ready。
執(zhí)行以下命令,查看Virtual node狀態(tài)。
kubectl get no |grep virtual-kubelet
預(yù)期輸出:
virtual-kubelet-cn-hangzhou-b Ready agent 18d v1.20.11-aliyun.1
從預(yù)期輸出可知,當(dāng)前Virtual node狀態(tài)為Ready。
通過以下三種方式可將Pod調(diào)度到ECI上運(yùn)行。
方式一:配置Pod標(biāo)簽(集群版本需大于1.16)
將Pod添加標(biāo)簽
alibabacloud.com/eci=true
,Pod將以ECI方式運(yùn)行,其節(jié)點(diǎn)是虛擬節(jié)點(diǎn),示例如下:執(zhí)行以下命令給Pod添加標(biāo)簽。
執(zhí)行以下命令查看Pod。
預(yù)期輸出:
kubectl run nginx --image nginx -l alibabacloud.com/eci=true
kubectl get pod -o wide|grep virtual-kubelet
nginx-7fc9f746b6-r4xgx 0/1 ContainerCreating 0 20s 192.168.XX.XX virtual-kubelet <none> <none>
方式二:配置命名空間標(biāo)簽
將Pod所在的命名空間添加標(biāo)簽
alibabacloud.com/eci=true
,Pod將以ECI方式運(yùn)行,其節(jié)點(diǎn)是虛擬節(jié)點(diǎn),示例如下:執(zhí)行以下命令創(chuàng)建虛擬節(jié)點(diǎn)。
執(zhí)行以下命令將Pod所在的命名空間添加標(biāo)簽。
執(zhí)行以下命令將命名空間中的Pod調(diào)度到虛擬節(jié)點(diǎn)上。
執(zhí)行以下命令查看Pod。
預(yù)期輸出:
kubectl create ns vk
kubectl label namespace vk alibabacloud.com/eci=true
kubectl -n vk run nginx --image nginx
kubectl -n vk get pod -o wide|grep virtual-kubelet
nginx-6f489b847d-vgj4d 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>
方式三:指定節(jié)點(diǎn)名稱
指定Pod調(diào)度到虛擬節(jié)點(diǎn),添加
nodeName: virtual-kubelet-cn-shanghai-k
,Pod將以ECI方式運(yùn)行,其節(jié)點(diǎn)是虛擬節(jié)點(diǎn),示例如下:使用以下內(nèi)容,創(chuàng)建nginx-deployment.yaml。
執(zhí)行以下命令,創(chuàng)建應(yīng)用。
執(zhí)行以下命令查看Pod。
預(yù)期輸出:
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeName: virtual-kubelet-cn-shanghai-k # 指定vk的nodeName containers: - name: nginx image: nginx:1.7.9 # replace it with your exactly <image_name:tags> ports: - containerPort: 80 resources: limits: cpu: "500m"
kubectl apply -f nginx-deployment.yaml
kubectl get pod -o wide|grep virtual-kubelet
nginx-6f489b847d-XXX 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none> nginx-6f489b847d-XXX 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>
相關(guān)操作
修改ECI交換機(jī)配置
您可以修改ECI Pod所在的虛擬交換機(jī)。建議配置多個(gè)虛擬交換機(jī)支持多可用區(qū),當(dāng)單個(gè)可用區(qū)庫(kù)存不足時(shí),Controller會(huì)選擇另外一個(gè)可用區(qū)創(chuàng)建ECI Pod。
通過如下命令修改ECI交換機(jī)相關(guān)信息:
kubectl edit configmap eci-profile -n kube-system
配置示例如下:
data:
enableClusterIp: "true"
enableHybridMode: "false"
enablePrivateZone: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf**** # ECI Pod所屬交換機(jī)。可配置多個(gè),用半角逗號(hào)間隔。
vpcId: vpc-2zeghwzptn5zii0w7****
更多關(guān)于eci-profile配置的詳細(xì)信息,請(qǐng)參見配置eci-profile。
刪除虛擬節(jié)點(diǎn)
在注冊(cè)集群中卸載ack-virtual-node組件。
通過onectl卸載
執(zhí)行以下命令,卸載組件。
onectl addon uninstall ack-virtual-node
預(yù)期輸出:
Addon ack-virtual-node uninstalled.
通過控制臺(tái)卸載
在組件管理頁(yè)面卸載ack-virtual-node組件即可。
通過命令
kubectl delete node <node name>
刪除相關(guān)虛擬節(jié)點(diǎn)。說(shuō)明卸載ack-virtual-node組件后,集群中已創(chuàng)建的ECI Pod并不會(huì)被刪除。