本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源
作者:庄宇
在前一篇文章《应对突发流量,如何快速为自建 K8s 添加云上弹性能力》中,我们介绍了如何为 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 集群,参见《选对方法,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-podlabels: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: Nevercontainers:- name: cuda-containerimage: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/cuda10.2-vectoraddresources: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:在该组资源最多部署多少个实例
步骤如下:
- 定义 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 // 选择应用Podstrategy: preferunits:- resource: idc //优先使用idc指定使用IDC中节点资源- resource: eci //当idc节点资源不足时,使用Serverless ECI
EOF
- 创建应用 Deployment,启动 2 个副本,每个副本需要 2 个 CPU。
> cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:name: nginxannotations:addannotion: "true"labels:app: nginx # 此处要与上一步创建的ResourcePolicy的selector相关联。spec:schedulerName: ack-co-schedulercontainers:- name: nginximage: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/nginxresources:requests:cpu: 2limits:cpu: 2
EOF
- 执行以下命令对应用扩容 4 个副本,IDC 中 K8s 集群只有一个 6CPU 节点,最多启动 2 个 nginx pods(系统资源预留,无法启动 3 个 pod)。剩余的 2 个副本在 IDC 节点资源不足后,自动使用阿里云 Serverless ECI 运行 Pods。
kubectl scale deployment nginx --replicas 4
- 查看 Pod 运行情况,2 个 Pod 运行在 IDC 中的节点,2 个 Pod 使用虚拟节点在阿里云 Serverless ECI 上运行。
> kubectl get pod -o widek get pod -o wideNAME 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-anginx-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 注册集群的系列文章,包括:容灾备份,安全管理等。欢迎通过搜索钉钉群号加入我们。(群号:35688562)
参考文档:
[1] 注册集群概述
https://help.aliyun.com/document_detail/155208.html
[2] 使用弹性容器ECI扩容集群
https://help.aliyun.com/document_detail/164370.html
[3] ECI支持的实例类型
https://help.aliyun.com/document_detail/451262.html
[4] 多级弹性调度
https://help.aliyun.com/document_detail/446694.html
点击此处,查看 ACK One 更多产品详情
相关文章:

本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源
作者:庄宇 在前一篇文章《应对突发流量,如何快速为自建 K8s 添加云上弹性能力》中,我们介绍了如何为 IDC 中 K8s 集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通…...

MySQL - 安装、连接、简单介绍
1、安装 MySQL8.0 安装MySQL 8.0的步骤,以 Windows 为例: 1.1 下载MySQL Installer: 需要从MySQL官方网站下载MySQL Installer。在下载页面中,选择适用于Windows的MySQL Installer并下载。 1.2 运行MySQL Installer࿱…...

【算法】求欧拉函数(包括完整的证明以及代码模板,建议收藏)
求欧拉函数 前置知识 互质:互质是公约数只有1的两个整数,叫做互质整数。 欧拉函数定义 1 ∼ N − 1 1∼N-1 1∼N−1中与N互质的数的个数被称为欧拉函数,记为 ϕ ( N ) \phi(N) ϕ(N)。 若在算数基本定理中, N p 1 a 1 p 2 a 2 .…...

Ceph的应用
文章目录 一、创建 CephFS 文件系统 MDS 接口1)在管理节点创建 mds 服务2)查看各个节点的 mds 服务3)创建存储池,启用 ceph 文件系统4)查看mds状态,一个up,其余两个待命,目前的工作的…...

mac m1 触控栏TouchBar功能栏异常
电脑可能在高温下运行时间过长,导致TouchBar之前正常显示的调整屏幕亮度与调整声音等功能的按钮均丢失,然后看了一眼键盘设置,设置也是正常的,已勾选显示功能栏 下面请看 如何在MacBook Pro(macOS Monterey࿰…...

“奢侈品”价格的“快消品”,竹叶青这么想赚年轻人的“茶水钱”?
文 | 螳螂观察 作者 | 青月 或许是受养生焦虑的影响,这届年轻人似乎爱上了喝茶。 《抖音电商茶行业洞察报告》数据显示, 年轻客群已经成为了抖音电商茶行业的增长极,在茶叶、茶具、茶文化书籍等方面,18-30岁消费者是当之无愧消…...

【Matlab】基于随机森林算法的时间序列预测(Excel可直接替换数据)
【Matlab】基于随机森林算法的时间序列预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 基于随机森林算法的时间序列预测是一种利用随机森林模型来解决时间序列预测问题的方法。在传统的随机森林算法中,对于…...

vue 中断请求
1 背景:针对一些请求时间较长,组件销毁后即中断请求; 2 方法: data(){return {//用于取消请求abortController:new AbortController(), } }, created(){//请求接口this.groundAcquisition(); }, beforeDestroy(){//中断请求this.…...

Jwt(Json web token)——从Http协议到session+cookie到Token Jwt介绍 Jwt的应用:登陆验证的流程
目录 引出从Http协议到session&cookie到TokenHTTP协议session & cookiesessioncookie为什么需要session & cookie? JavaEE传统解决长连接方案问题:分布式不适用解决方案:令牌Token Jwt,Json web tokenjwt的结构Header加密算法Ba…...

Java使用 java.util.regex.Pattern 正则表达式校验参数值是否规范
场景: java中我们可以利用 Pattern 注解对某个入参进行规则校验,但有些特殊参数在接口入口处不方便校验,需要在代码中校验 一、使用 Pattern 注解校验 Pattern(regexp "^[a-zA-Z0-9]$", message "xxx号限输入字母、…...

HDFS基本操作命令
这里写目录标题 HDFS Shell CLI客户端说明常用命令hadoop fs -mkdir [-p] <path>hadoop fs -ls [-h] [-R] [<path>...]上传文件到指定目录下方法一:hadoop fs -put [-f] [-p] <localsrc>.....<dst>方法二:hadoop fs -moveFromLocal <loc…...

git 实操
首先有安装好的git,安装好后,会在任一目录下右键出现git bash和git gui两个选项 打开git bash,设置好全局变量,用户名和邮箱,设置方法为: git config -- global user.name "xxx" git config --global user.email "xxxxxx.com" 1.创建版本库 git init 命…...

Visual Studio Code Python 扩展中的包管理
排版:Alan Wang Python 凭借其简单的语法和强大的库,目前已成为最流行的编程语言之一,也是最适合那些刚接触编程的人们的语言。但是,随着项目复杂性和规模的增长,管理依赖项的复杂性也会增加。当新用户不断承接更成熟的…...

spring学习笔记九
数据源对象管理 1、加入pom坐标 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><!-- https://mvnrepository.com/artifact/c3p0/c3p0 --><depe…...

java list stream 使用
1、实现List对象集合的简单去重(distinct()) List<User> list list.stream().distinct().collect(Collectors.toList()); 2、实现List集合的根据属性(name)去重 list list.stream().filter(o -> o.getName() ! …...

两个Ubuntu电脑用SSH远程连接
两个Ubuntu电脑用SSH远程连接 1.ssh客户端及服务端的安装: 打开终端后,只需要以下两个命令即可 sudo apt-get install openssh-clientsudo apt-get install openssh-server2.启动ssh服务,执行以下命令: sudo /etc/init.d/ssh …...

讲解 @ServletComponentScan注解
目录: 1、用法介绍2、实例讲解 1、介绍 在SpringBoot项目启动器中添加ServletComponentScan注解后,SpringBoot在启动时会扫描并注册所有带有WebServlet(控制器)、WebFilter(过滤器)、WebListener(监听器&a…...

20款奔驰S350商务型加装原厂前排座椅通风系统,夏天必备的功能
通风座椅的主动通风功能可以迅速将座椅表面温度降至适宜程度,从而确保最佳座椅舒适性。该功能启用后,车内空气透过打孔皮饰座套被吸入座椅内部,持续时间为 8 分钟。然后,风扇会自动改变旋转方向,将更凉爽的环境空气从座…...

Rust vs Go:常用语法对比(十一)
题目来自 Rust Vs Go: Which Language Is Better For Developing High-Performance Applications?[1] 202. Sum of squares Calculate the sum of squares s of data, an array of floating point values. 计算平方和 package mainimport ( "math")func main() { da…...

Spring MVC拦截器和跨域请求
一、拦截器简介 SpringMVC的拦截器(Interceptor)也是AOP思想的一种实现方式。它与Servlet的过滤器(Filter)功能类似,主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用…...

C++初阶--C++入门
目录 前言C关键字命名空间命名空间的定义命名空间的使用加命名空间名称及作用域限定符使用using namespace 命名空间名称引入使用using将命名空间中的成员引入 C的输入与输出缺省参数全缺省半缺省参数 函数重载参数类型不同参数个数不同参数类型顺序不同 引用引用特性 常引用使…...

Matlab实现PID控制仿真(附上30个完整仿真源码+数据)
本文介绍了如何使用Matlab实现PID控制器的仿真。首先,我们将简要介绍PID控制器的原理和控制算法。然后,我们将使用Matlab编写一个简单的PID控制器,并使用仿真环境来验证其性能。最后,我们将通过调整PID控制器的参数来优化控制系统…...

微信小程序:文件下载
目录 第一步 请求资源 第二步 获取资源后写入到微信本地 获取资源 写入资源(wx.getFileSystemManager)writeFile 的api 第三步 读取资源(openDocument与saveImageToPhotosAlbum) 第一步 请求资源 下面是请求接口中的脚本内容 export let baseUrl http://192.168.78.112…...

QString和QByteArray的区别
QString和QByteArray的区别 本质格式转换QString字符串格式化打印长度 本质 QString是对QByteArray的再次封装 QString可以通过char*来构造,也可以通过QByteArray来构造 QByteArray就是char* QString是编码后的char* QString也是封装了字符串, 但是内部的编码为utf…...

Vue3 Vite electron 开发桌面程序
Electron是一个跨平台的桌面应用程序开发框架,它允许开发人员使用Web技术(如HTML、CSS和JavaScript)构建桌面应用程序,这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…...

【Nodejs】Express模板使用
1.Express脚手架的安装 安装Express脚手架有两种方式: 使用express-generator安装 使用命令行进入项目目录,依次执行: cnpm i -g express-generator可通过express -h查看命令行的指令含义 express -hUsage: express [options] [dir] Optio…...

【iOS】App仿写--管理系统
文章目录 前言一、账号界面二、功能界面三、添加功能四、删除功能五、更改功能六、查找功能七、排序功能八、退出功能总结 前言 在日常生活中,如果用文字来记述与管理我们数据会十分麻烦,并且人工成本较高,这里笔者给出一种管理系统的模版&a…...

JS实现队列的数据结构
创建queue.ts /*** 队列*/ export default class Queue<T> {private items: object;private count: number;private header: number;constructor() {this.items {};this.count this.header 0;}/*** 入队列* param element* returns 当前队列的数量*/enqueue(element:…...

title: 用 LangChain 构建基于资料库的问答机器人(四):通过代理使用外部工具
上一篇教程我们介绍了 ReAct 系统,这是一个非常强大的行为模式,但它需要编写大量的示例来告诉 LLM 如何思考、行动,并且为了遵循这个模式,还需要编写代码来分析生成文字、调用函数、拼接 prompt 等,这些工作都是十分繁…...

使用 CSS 自定义属性
我们常见的网站日夜间模式的变化,其实用到了 css 自定义属性。 CSS 自定义属性(也称为 CSS 变量)是一种在 CSS 中预定义和使用的变量。它们提供了一种简洁和灵活的方式来通过多个 CSS 规则共享相同的值,使得样式更易于维护和修改。…...