自建Kubernetes集群通過ACK Virtual Node接入云上Serverless算力
ACK Virtual Node實(shí)現(xiàn)Kubernetes與云上Serverless算力的無縫連接。本文介紹如何在數(shù)據(jù)中心Kubernetes部署ACK Virtual Node組件。
ACK Virtual Node介紹
ACK Virtual Node實(shí)現(xiàn)Kubernetes與云上Serverless算力的無縫連接,使自建Kubernetes集群能夠輕松獲得云上的彈性算力,包括CPU和GPU。通過ACK Virtual Node,您可以在自建Kubernetes集群創(chuàng)建Serverless Pod,利用云上算力高效應(yīng)對業(yè)務(wù)增長和流量高峰。
數(shù)據(jù)中心和阿里云VPC需使用專線互聯(lián)。
文檔中涉及{region}表示數(shù)據(jù)中心要訪問彈性容器實(shí)例ECI所在地域的Region ID,例如張家口地域?yàn)閏n-zhangjiakou。更多關(guān)于彈性容器實(shí)例ECI的地域信息,請參見服務(wù)接入點(diǎn)。
對于每個Serverless Pod,ACK Virtual Node會創(chuàng)建云上彈性容器實(shí)例,無需額外維護(hù)節(jié)點(diǎn)。
前提條件
已完成Kubernetes集群的部署,推薦Kubernetes版本為1.18及以上。
已為使用ACK Virtual Node Helm Chart的阿里云RAM用戶或角色創(chuàng)建AccessKey,同時授予相應(yīng)的調(diào)用ECI OpenAPI權(quán)限,具體操作請參見RAM子賬號授權(quán)。授權(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"
}
]
}
安裝組件
根據(jù)以下示例創(chuàng)建my-values.yaml,并保存到本地目錄。
virtualNode: image: repository: registry-{Region}.ack.aliyuncs.com/acs/virtual-nodes-eci tag: v2.12.1 env: ECI_REGION: cn-zhangjiakou ECI_VSWITCH: vsw-8vb*** ECI_SECURITY_GROUP: sg-8vb*** ECI_ACCESS_KEY: LTAI5t*** ECI_SECRET_KEY: 99K***
參數(shù)說明:
參數(shù)名稱
參數(shù)說明
是否必選
示例值
virtualNode.image.repository
virtual-node鏡像倉庫地址。
必選
registry-cn-zhangjiakou.ack.aliyuncs.com/acs/virtual-nodes-eci
virtualNode.image.tag
virtual-node鏡像Tag。
必選
v2.12.1
env.ECI_REGION
彈性容器實(shí)例所在地域ID。
必選
cn-zhangjiakou
env.ECI_VSWITCH
彈性容器實(shí)例所在交換機(jī)ID,多個交換機(jī)使用英文半角逗號分隔。根據(jù)Serverless Pod數(shù)量為交換機(jī)預(yù)留足夠的IP地址。
必選
vsw-8vb***
env.ECI_SECURITY_GROUP
彈性容器實(shí)例所在安全組ID。
必選
sg-8vb***
env.ECI_ACCESS_KEY
云賬號AccessKeyId。確保該云賬號有調(diào)用ECI API的權(quán)限。
必選
LTAI5t***
env.ECI_SECRET_KEY
云賬號AccessKeySecret。確保該云賬號有調(diào)用ECI API的權(quán)限。
必選
99K***
env.KUBERNETES_APISERVER_HOST
API Server地址,如有需要指定API Server地址,請?jiān)O(shè)置。
可選
192.168.0.1
env.KUBERNETES_APISERVER_PORT
API Server內(nèi)網(wǎng)地址端口。
可選
6443
env.ECI_VPC
彈性容器實(shí)例所在VPC ID。
可選
vpc-8vb***
env.ALIYUN_RESOURCEGROUP_ID
彈性容器實(shí)例歸屬的資源組ID。
可選
rg-acf***
執(zhí)行以下命令,添加Helm Repo。
helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
執(zhí)行以下命令,安裝ack-virtual-node。
helm install ack-virtual-node aliyunhub/ack-virtual-node --namespace kube-system --values my-values.yaml
執(zhí)行以下命令,查看應(yīng)用狀態(tài)。
kubectl get no |grep virtual-kubelet
預(yù)期輸出:
virtual-kubelet-cn-zhangjiakou-c Ready agent 10d v1.18.8
將Pod調(diào)度到云上Serverless算力運(yùn)行
在自建Kubernetes集群上,通過以下三種方式可將Pod調(diào)度到ECI上運(yùn)行。
方式一:配置Pod標(biāo)簽
執(zhí)行以下命令部署指定Pod標(biāo)簽的測試用例。
kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment-pod-label namespace: default spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: alibabacloud.com/eci: 'true' # 指定Pod標(biāo)簽使用云上Serverless算力運(yùn)行 app: nginx spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2' imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m EOF
執(zhí)行以下命令,查看應(yīng)用狀態(tài)。
kubectl get pod -owide | grep nginx-deployment-pod-label
預(yù)期輸出:
nginx-deployment-pod-label-6575548559-7p9hf 1/1 Running 0 33s 192.168.XX.XXX virtual-kubelet-cn-zhangjiakou-c <none> <none> nginx-deployment-pod-label-6575548559-tztm6 1/1 Running 0 33s 192.168.XX.XXX virtual-kubelet-cn-zhangjiakou-c <none> <none>
方式二:配置命名空間標(biāo)簽
執(zhí)行以下命令,創(chuàng)建名為vk的命名空間。
kubectl create ns vk
執(zhí)行以下命令為命名空間添加alibabacloud.com/eci=true標(biāo)簽。
kubectl label namespace vk alibabacloud.com/eci=true
執(zhí)行以下命令將測試用例部署到指定命名空間。
kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment-ns-label namespace: vk spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2' imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m EOF
執(zhí)行以下命令,查看應(yīng)用狀態(tài)。
kubectl get po -nvk -owide |grep nginx-deployment-ns-label
預(yù)期輸出:
nginx-deployment-ns-label-7bc784448c-5llgb 1/1 Running 0 30s 192.168.XX.XXX virtual-kubelet-cn-zhangjiakou-c <none> <none> nginx-deployment-ns-label-7bc784448c-8ns9q 1/1 Running 0 30s 192.168.XX.XXX virtual-kubelet-cn-zhangjiakou-c <none> <none>
方式三:指定節(jié)點(diǎn)名稱
執(zhí)行以下命令將測試用例部署到指定節(jié)點(diǎn)。
kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment-node-name namespace: default spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeName: virtual-kubelet-cn-zhangjiakou-c # 指定ack-virtual-node的nodeName containers: - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2' imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m EOF
執(zhí)行以下命令,查看應(yīng)用狀態(tài)。
kubectl get pod -owide |grep nginx-deployment-node-name
預(yù)期輸出:
nginx-deployment-node-name-864dffd59f-jq58n 1/1 Running 0 23s 192.168.XX.XXX virtual-kubelet-cn-zhangjiakou-c <none> <none> nginx-deployment-node-name-864dffd59f-r87zp 1/1 Running 0 23s 192.168.XX.XXX virtual-kubelet-cn-zhangjiakou-c <none> <none>