IDC中K8s集群通过Serverless方式使用阿里云弹性容器实例ECI运行业务Pod。您可以在K8s集群直接提交业务Pod,使Pod运行在ECI上,无需额外运维云上节点池,更加灵活、高效、弹性地使用云上CPU和GPU资源。本文介绍如何基于注册集群实现IDC中K8s集群以Serverless方式使用云上CPU和GPU资源。
背景信息
为IDC中K8s集群直接添加云上节点或GPU节点的方式,适用于需要自定义配置的节点(runtime、kubelet、NVIDIA等)和特定的ECS实例规格等场景,该方式需要自行维护云上节点池,增加额外成本。您可以选择Serverless方式使用阿里云弹性容器实例ECI运行业务Pod,无需额外运维云上节点池,可以更加高效弹性的使用云上CPU和GPU资源。
前提条件
已通过注册集群内接入IDC中的K8s集群。具体操作,请参见创建注册集群。
已通过kubectl连接注册集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
使用场景
通过Serverless方式使用云上CPU和GPU资源,解决的依然是IDC中K8s集群的弹性能力不足,不能满足业务的快速增长、周期性业务增长和突发业务流量的问题。
通过Serverless方式,您可以在K8s集群直接提交业务Pod,该Pod将使用阿里云弹性容器实例ECI运行,弹性容器实例ECI启动速度快,与业务Pod的生命周期一致,按Pod运行时间计费。从而不需要为IDC中K8s集群创建云上节点,无需规划云上资源容量,也不需要等待ECS创建完成,实现了高度弹性,并节省了节点的运维成本。通过Serverless方式使用云上CPU和GPU资源的方式如下图所示。
IDC中K8s集群以Serverless方式使用云上CPU和GPU资源适合以下业务场景。
在线业务的波峰波谷弹性伸缩:例如,在线教育、电商等行业有着明显的波峰波谷计算特征。使用Serverless ECI可以显著减少固定资源池的维护,降低计算成本。
数据计算:使用Serverless ECI承载Spark、Presto、ArgoWorkflow等计算场景,按Pod运行时间计费,有效降低计算成本。
CI/CD Pipeline:Jenkins、Gitlab-Runner。
Job任务:定时任务、AI。
步骤一:安装相关组件
通过注册集群实现IDC中K8s集群以Serverless方式使用云上CPU和GPU资源,您需要安装以下组件。
ack-virtual-node:使用虚拟节点和ECI的高度弹性能力。
ack-co-scheduler:通过该组件,您可以自定义ResourcePolicy CR对象,使用多级弹性调度功能。
您可以通过以下两种方式安装组件。
通过onectl安装
在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群。
执行以下命令,安装ack-virtual-node和ack-co-scheduler组件。
onectl addon install ack-virtual-node onectl addon install ack-co-scheduler
预期输出:
Addon ack-virtual-node, version **** installed. Addon ack-co-scheduler, version **** installed.
通过控制台安装
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击其他页签,找到ack-virtual-node和ack-co-scheduler组件,在卡片右下方单击安装。
在提示对话框中单击确定。
步骤二:查看节点
ack-virtual-node组件安装完成后,您可以通过注册集群kubeconfig查看集群节点池。virtual-kubelet为虚拟节点,对接阿里云Serverless ECI。
执行以下命令,查看节点。
kubectl get node
预期输出:
NAME STATUS ROLES AGE VERSION
iz8vb1xtnuu0ne6b58hvx0z Ready master 4d3h v1.20.9 # IDC集群节点,示例只有1个Master节点,同时也是Worker节点,可以运行业务容器。
virtual-kubelet-cn-zhangjiakou-a Ready agent 99s v1.20.9。 # 安装ack-virtual-node组件生产的虚拟节点。
步骤三:使用Serverless ECI运行Pod(CPU和GPU任务)
您可以通过以下两种方式进行配置,使用Serverless ECI运行Pod。
方式一:配置Pod标签
如下示例中,使用GPU ECI实例运行CUDA任务。您无需安装配置NVIDIA driver和runtime,真正做到Serverless化运行。
您可以为Pod添加标签alibabacloud.com/eci=true
,使Pod以Serverless ECI的方式运行。
使用以下YAML内容,提交Pod,使用Serverless ECI运行。
> cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: gpu-pod labels: alibabacloud.com/eci: "true" # 指定Pod使用Serverless ECI运行。 annotations: k8s.aliyun.com/eci-use-specs: ecs.gn5-c4g1.xlarge # 指定支持的GPU规格,该规格具备1个NVIDIA P100 GPU。 spec: restartPolicy: Never containers: - name: cuda-container image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/cuda10.2-vectoradd resources: limits: nvidia.com/gpu: 1 # 申请1个GPU。 EOF
执行以下命令,查看Pod。
kubectl get pod -o wide
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-pod 0/1 Completed 0 5m30s 172.16.XX.XX virtual-kubelet-cn-zhangjiakou-a <none> <none>
kubectl logs gpu-pod
预期输出:
Using CUDA Device [0]: Tesla P100-PCIE-16GB GPU Device has SM 6.0 compute capability [Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done
预期输出表明,Pod运行在虚拟节点virtual-kubelet上,实际后台使用阿里云Serverless ECI运行。
方式二:配置命名空间标签
您可以通过以下命令,为命名空间添加标签alibabacloud.com/eci=true
,该命名空间中所有新建的Pod,将以Serverless ECI方式运行。
kubectl label namespace <namespace-name> alibabacloud.com/eci=true
步骤四:使用多级弹性调度
参见步骤三使用Pod或命名空间的标签让Pod以Serverless ECI的方式运行后,您可以使用ACK One注册集群的多级弹性调度功能实现此效果:应用运行过程中优先使用IDC中的节点资源运行Pod,当IDC资源不足时,再使用阿里云Serverless ECI运行Pod。
通过ack-co-scheduler组件,可以自定义ResourcePolicy CR对象,从而使用多级弹性调度功能。ResourcePolicy CR为命名空间资源,主要参数说明如下。
参数 | 说明 |
selector | 声明ResourcePolicy作用于同一命名空间下 |
strategy | 调度策略选择,目前仅支持 |
units | 用户自定义的调度单元。应用扩容时,将按照
|
使用以下内容,定义ResourcePolicy CR,优先使用IDC中集群资源,再使用云上Serverless ECI资源。
> cat << EOF | kubectl apply -f - apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: cost-balance-policy spec: selector: app: nginx # 选择应用Pod。 key1: value1 strategy: prefer units: - resource: idc # 优先使用IDC指定使用IDC中节点资源。 max:3 - resource: eci # 当IDC节点资源不足时,使用Serverless ECI。 nodeSelector: key2: value2 EOF
使用以下内容,创建应用Deployment,启动2个副本,每个副本需要2个CPU。
> cat << EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: name: nginx annotations: addannotion: "true" labels: app: nginx # 此处要与上一步创建的ResourcePolicy的selector相关联。 spec: schedulerName: ack-co-scheduler containers: - name: nginx image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/nginx resources: requests: cpu: 2 limits: cpu: 2 EOF
执行以下命令,对应用扩容4个副本。
IDC中K8s集群只有一个6 CPU节点,最多启动2个Nginx Pod(系统资源预留,无法启动3个Pod),剩余的2个副本在IDC节点资源不足时,将自动使用阿里云Serverless ECI运行Pod。
kubectl scale deployment nginx --replicas 4
执行以下命令,查看Pod运行情况。
> kubectl get pod -o wide
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE nginx-79cd98b4b5-97s47 1/1 Running 0 84s 10.100.XX.XX iz8vb1xtnuu0ne6b58h**** nginx-79cd98b4b5-gxd8z 1/1 Running 0 84s 10.100.XX.XX iz8vb1xtnuu0ne6b58h**** nginx-79cd98b4b5-k55rb 1/1 Running 0 58s 10.100.XX.XX virtual-kubelet-cn-zhangjiakou-a nginx-79cd98b4b5-m9jxm 1/1 Running 0 58s 10.100.XX.XX virtual-kubelet-cn-zhangjiakou-a
预期输出表明,2个Pod运行在IDC中的节点,2个Pod使用虚拟节点在阿里云Serverless ECI上运行。