在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。
这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行维护云上节点池。
如果您不想维护云上节点池,您可以选择Serverless方式使用阿里云ECI弹性容器实例运行业务Pod,更加高效弹性的使用云上CPU/GPU资源。
概述
通过Serverless方式使用云上计CPU/GPU资源,针对的问题依然是IDC中K8s集群的弹性能力不足,不能满足业务的快速增长、周期性业务增长和突发业务流量。
通过Serverless方式,可以在K8s集群直接提交业务Pod,Pod将使用阿里云ECI弹性容器实例运行,ECI弹性容器实例启动速度快,与业务Pod的生命周期一致,按Pod运行时间计费。从而不需要为IDC中K8s集群创建云上节点,不需要规划云上资源容量,不需要等待ECS创建完成,实现了极致弹性,并节省了节点运维成本。
IDC中K8s集群以Serverless方式使用云上CPU/GPU资源,适合以下业务场景:
-
在线业务的波峰波谷弹性伸缩:如在线教育、电商等行业有着明显的波峰波谷计算特征。使用Serverless ECI可以显著减少固定资源池的维护,降低计算成本。
-
数据计算:使用Serverless ECI承载Spark、Presto、ArgoWorkflow等计算场景,按Pod运行时间计费,有效降低计算成本。
-
CI/CD Pipeline:Jenkins、Gitlab-Runner。
-
Job任务:定时任务、AI。
演示 - IDC中K8s集群以Serverless方式使用云上资源
1. 前提条件:
已经通过ACK One注册机群接入IDC中K8s集群,参见《基于ACK One注册集群轻松实现云上云下K8s集群统一管理》
2. 安装ack-virtual-node组件
通过ACK One注册集群控制台安装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组件生产的虚拟节点
3. 使用Serverless ECI运行Pod(CPU/GPU任务)
方式一:配置Pod标签,为Pod添加标签alibabacloud.com/eci=true,Pod将以Serverless ECI方式运行。示例中,使用GPU ECI实例运行CUDA任务,您不需要安装配置NVIDIA driver和runtime,真正做到Serverless化运行。
a. 提交Pod,使用Serverless ECI运行
> cat <
b. 查看Pod,Pod运行在虚拟节点virtual-kubelet上,实际后台使用阿里云Serverless ECI运行。
> 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.217.90 virtual-kubelet-cn-zhangjiakou-a
> 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
方式二:设置命名空间标签
为命名空间设置标签alibabacloud.com/eci=true,命名空间中所有新建pod,将以Serverless ECI方式运行。
kubectl label namespace alibabacloud.com/eci=true
4. 多级弹性调度
上面的演示中,我们通过设置Pod或者命名空间的标签以使用Serverless ECI运行Pod。如果您期望应用运行过程中优先使用IDC中的节点资源运行Pod,当IDC资源不足时,再使用阿里云Serverless ECI运行Pod。您可以使用ACK One注册集群的多级弹性调度,通过安装ack-co-scheduler组件,您可以定义ResourcePolicy CR对象,使用多级弹性调度功能。
ResourcePolicy CR是命名空间资源,重要参数解析:
-
selector :声明ResourcePolicy作用于同一命名空间下 label 上打了 key1=value1 的Pod。
-
strategy :调度策略选择,目前只支持 prefer 。
-
units :用户自定义的调度单元。应用扩容时,将按照 units 下资源的顺序选择资源运行;应用缩容时,将按照逆序进行缩容。
-
resource :弹性资源的类型,目前支持 idc 、 ecs 和 eci 三种类型。
-
nodeSelector :用 node 的 label 标识该调度单元下的节点,只对 ecs 资源生效。
-
max :在该组资源最多部署多少个实例。
步骤如下:
1) 定义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
strategy: prefer
units:
- resource: idc //优先使用idc指定使用IDC中节点资源
- resource: eci //当idc节点资源不足时,使用Serverless ECI
EOF
2) 创建应用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
3) 执行以下命令对应用扩容4个副本,IDC中K8s集群只有一个6CPU节点,最多启动2个nginx pods(系统资源预留,无法启动3个pod)。剩余的2个副本在IDC节点资源不足后,自动使用阿里云Serverless ECI运行Pods。
kubectl scale deployment nginx --replicas 4
4) 查看Pod运行情况,2个Pod运行在IDC中的节点,2个Pod使用虚拟节点在阿里云Serverless ECI上运行。
> kubectl get pod -o wide
k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-79cd98b4b5-97s47 1/1 Running 0 84s 10.100.75.22 iz8vb1xtnuu0ne6b58hvx0z
nginx-79cd98b4b5-gxd8z 1/1 Running 0 84s 10.100.75.23 iz8vb1xtnuu0ne6b58hvx0z
nginx-79cd98b4b5-k55rb 1/1 Running 0 58s 10.100.75.24 virtual-kubelet-cn-zhangjiakou-a
nginx-79cd98b4b5-m9jxm 1/1 Running 0 58s 10.100.75.25 virtual-kubelet-cn-zhangjiakou-a
总结
本文介绍了基于ACK One注册集群实现IDC中K8s集群以Serverless ECI方式使用阿里云CPU和GPU计算资源,以应对业务流量增长。这种方式,完全Serverless化,无需额外运维云上节点,按Pod运行时间计费,灵活高效。
预告
后续我们将陆续推出ACK One注册集群的系列文章,包括:容灾备份,安全管理等。
参考文档
注册集群概述:https://help.aliyun.com/document_detail/155208.html
使用弹性容器ECI扩容集群:https://help.aliyun.com/document_detail/164370.html
ECI支持的实例类型:https://help.aliyun.com/document_detail/451262.html
多级弹性调度:https://help.aliyun.com/document_detail/446694.html
联系我们
钉钉群号:35688562
二维码: