基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行

在前一篇文章《基于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 <<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

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   <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

方式二:设置命名空间标签

为命名空间设置标签alibabacloud.com/eci=true,命名空间中所有新建pod,将以Serverless ECI方式运行。

kubectl label namespace <namespace-name> 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

二维码:

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
运维 Kubernetes 监控
揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
112 0
|
6天前
|
Kubernetes Java 测试技术
ChaosBlade常见问题之在K8s环境下演练cpu满载报错如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
35 0
|
6天前
|
存储 Kubernetes 负载均衡
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
5天前
|
存储 Java Serverless
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
|
5天前
|
运维 Kubernetes Shell
Kubernetes详解(十二)——节点选择器与资源注解
Kubernetes详解(十二)——节点选择器与资源注解
21 2
|
6天前
|
运维 Kubernetes Linux
Kubernetes详解(九)——资源配置清单创建Pod实战
Kubernetes详解(九)——资源配置清单创建Pod实战
21 2
|
6天前
|
JSON Kubernetes API
Kubernetes详解(八)——Kubernetes资源配置清单
Kubernetes详解(八)——Kubernetes资源配置清单
14 2
|
6天前
|
存储 Kubernetes 关系型数据库
Kubernetes详解(二)——Kubernetes结构与资源对象
Kubernetes详解(二)——Kubernetes结构与资源对象
20 0
|
6天前
|
Kubernetes 监控 调度
Kubernetes(K8s)与虚拟GPU(vGPU)协同:实现GPU资源的高效管理与利用
本文探讨了如何使用Kubernetes和虚拟GPU(vGPU)实现异构GPU的协同调度。Kubernetes是一个容器编排平台,通过设备插件、资源规格、调度器扩展和节点标签实现GPU资源管理。vGPU技术允许物理GPU资源在多个虚拟机或容器中共享。文章详细介绍了vGPU的部署配置步骤,并提出了GPU资源调度、负载均衡和监控调优的方法。强调虚拟GPU的性能取决于硬件和驱动支持,合理配置能提供高性能计算环境。参考文献包括Kubernetes和NVIDIA官方文档及相关研究论文。
|
6天前
|
Kubernetes 调度 容器
Kubernetes容器资源限制
Kubernetes容器资源限制
23 0

热门文章

最新文章

推荐镜像

更多