ACK Virtual Node实现Kubernetes与云上Serverless算力的无缝连接。本文介绍如何在数据中心Kubernetes部署ACK Virtual Node组件。
ACK Virtual Node介绍
ACK Virtual Node实现Kubernetes与云上Serverless算力的无缝连接,使自建Kubernetes集群能够轻松获得云上的弹性算力,包括CPU和GPU。通过ACK Virtual Node,您可以在自建Kubernetes集群创建Serverless Pod,利用云上算力高效应对业务增长和流量高峰。
数据中心和阿里云VPC需使用专线互联。
文档中涉及{region}表示数据中心要访问弹性容器实例ECI所在地域的Region ID,例如张家口地域为cn-zhangjiakou。更多关于弹性容器实例ECI的地域信息,请参见服务接入点。
对于每个Serverless Pod,ACK Virtual Node会创建云上弹性容器实例,无需额外维护节点。
前提条件
已完成Kubernetes集群的部署,推荐Kubernetes版本为1.18及以上。
已为使用ACK Virtual Node Helm Chart的阿里云RAM用户或角色创建AccessKey,同时授予相应的调用ECI OpenAPI权限,具体操作请参见RAM子账号授权。授权信息如下:
安装组件
根据以下示例创建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***
参数说明:
参数名称
参数说明
是否必选
示例值
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
弹性容器实例所在地域ID。
必选
cn-zhangjiakou
env.ECI_VSWITCH
弹性容器实例所在交换机ID,多个交换机使用英文半角逗号分隔。根据Serverless Pod数量为交换机预留足够的IP地址。
必选
vsw-8vb***
env.ECI_SECURITY_GROUP
弹性容器实例所在安全组ID。
必选
sg-8vb***
env.ECI_ACCESS_KEY
云账号AccessKeyId。确保该云账号有调用ECI API的权限。
必选
LTAI5t***
env.ECI_SECRET_KEY
云账号AccessKeySecret。确保该云账号有调用ECI API的权限。
必选
99K***
env.KUBERNETES_APISERVER_HOST
API Server地址,如有需要指定API Server地址,请设置。
可选
192.168.0.1
env.KUBERNETES_APISERVER_PORT
API Server内网地址端口。
可选
6443
env.ECI_VPC
弹性容器实例所在VPC ID。
可选
vpc-8vb***
env.ALIYUN_RESOURCEGROUP_ID
弹性容器实例归属的资源组ID。
可选
rg-acf***
执行以下命令,添加Helm Repo。
helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
执行以下命令,安装ack-virtual-node。
helm install ack-virtual-node aliyunhub/ack-virtual-node --namespace kube-system --values my-values.yaml
执行以下命令,查看应用状态。
kubectl get no |grep virtual-kubelet
预期输出:
virtual-kubelet-cn-zhangjiakou-c Ready agent 10d v1.18.8
将Pod调度到云上Serverless算力运行
在自建Kubernetes集群上,通过以下三种方式可将Pod调度到ECI上运行。
方式一:配置Pod标签
执行以下命令部署指定Pod标签的测试用例。
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标签使用云上Serverless算力运行 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
执行以下命令,查看应用状态。
kubectl get pod -owide | grep nginx-deployment-pod-label
预期输出:
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>
方式二:配置命名空间标签
执行以下命令,创建名为vk的命名空间。
kubectl create ns vk
执行以下命令为命名空间添加alibabacloud.com/eci=true标签。
kubectl label namespace vk alibabacloud.com/eci=true
执行以下命令将测试用例部署到指定命名空间。
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
执行以下命令,查看应用状态。
kubectl get po -nvk -owide |grep nginx-deployment-ns-label
预期输出:
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>
方式三:指定节点名称
执行以下命令将测试用例部署到指定节点。
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
执行以下命令,查看应用状态。
kubectl get pod -owide |grep nginx-deployment-node-name
预期输出:
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>