应对突发流量,如何快速为自建 K8s 添加云上弹性能力

作者:庄宇

以 Kubernetes 为代表的容器技术带来的是一种应用交付模式的变革,其正迅速成为全世界数据中心的统一 API。

为了保证业务持续稳定、用户访问不中断,高可用、高弹性等能力是应用架构设计不变的追求,多集群架构天然具备这样的能力。而只有在 Kubernetes 这层统一且标准的 API 之下,多集群和混合云的能力才开始真正体现价值。

在前一篇文章《选对方法,K8s 多集群管理没那么难》中,我们着重介绍了阿里云分布式云容器平台 ACK One 注册集群的应用场景、架构实现、安全加固,以及在他云 K8s 集群和 IDC 自建 K8s 集群中使用阿里云容器服务 ACK 的强大可观测性能力,实现云上云下 K8s 集群的统一运维管理。

本文中,我们重点介绍 ACK One 注册集群的另一个重要使用场景–云上弹性。

云上弹性能力典型应用场景和优势

ACK One 注册集群的云上弹性能力针对的场景:

1. 业务快速增长: 在本地 IDC 中部署的 K8s 集群,往往受到 IDC 计算资源的限制无法及时扩容,计算资源的采购部署上线往往周期较长,无法承担业务流量的快速增长。

2. 业务周期性增长或突发增长: 本地 IDC 中的计算资源数量相对固定,无法应对业务周期性高峰,或者突发业务流量的增长。

解决以上场景的根本是计算资源弹性能力,可以跟随业务流量的变化,弹性扩大或者缩小计算资源,满足业务需求的同时也保证了成本的平衡。

ACK One 注册集群云上弹性架构如下图所示:

在这里插入图片描述

通过 ACK One 注册集群,本地 IDC 中的 K8s 集群可以弹性扩容阿里云 ECS 节点池,利用阿里云容器服务的极致弹性能力,扩容应对业务流量增长,缩容实现成本节约。尤其针对 AI 场景,通过 ACK One 注册集群,可以将云上 GPU 机器接入 IDC 中的 K8s 集群。

为本地 IDC K8s 集群添加阿里云 GPU 算力的最佳实践

1. 创建 ACK One 注册集群

访问 ACK One 控制台注册集群用页面,我们已经创建了注册集群 “ACKOneRegisterCluster1” 并接入了本地 IDC 中的 K8s 集群。参见:《选对方法,K8s 多集群管理没那么难》

ACK One 控制台注册集群用页面:

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcs.console.aliyun.com%2Fone

在这里插入图片描述

接入后,可以通过 ACK One 控制台查看本地 IDC K8s 集群,目前只有一个 master 节点。

在这里插入图片描述

2. 创建 GPU 节点池并手动扩容创建 1 个 GPU 节点

在注册集群中创建节点池 GPU-P100,将云上 GPU 机器加入 IDC 中 K8s 集群。

在这里插入图片描述

在 IDC K8s 集群中执行 kubectl 查看节点信息。

kubectl get node
NAME                           STATUS   ROLES    AGE     VERSION
cn-zhangjiakou.172.16.217.xx   Ready    <none>   5m35s   v1.20.9    // 云上GPU机器
iz8vb1xtnuu0ne6b58hvx0z        Ready    master   20h     v1.20.9    // IDC机器k describe node cn-zhangjiakou.172.16.217.xx
Name:               cn-zhangjiakou.172.16.217.xx
Roles:              <none>
Labels:             aliyun.accelerator/nvidia_count=1             //nvidia labelsaliyun.accelerator/nvidia_mem=16280MiB        //nvidia labels aliyun.accelerator/nvidia_name=Tesla-P100-PCIE-16GB  //nvidia labelsbeta.kubernetes.io/arch=amd64beta.kubernetes.io/os=linuxkubernetes.io/arch=amd64kubernetes.io/hostname=cn-zhangjiakou.172.16.217.xxkubernetes.io/os=linux
Capacity:cpu:                4ephemeral-storage:  123722704Kihugepages-1Gi:      0hugepages-2Mi:      0memory:             30568556Kinvidia.com/gpu:     1              //nvidia gpupods:               110
Allocatable:cpu:                4ephemeral-storage:  114022843818hugepages-1Gi:      0hugepages-2Mi:      0memory:             30466156Kinvidia.com/gpu:     1              //nvidia gpupods:               110
System Info:OS Image:                   Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle)Operating System:           linuxArchitecture:               amd64Container Runtime Version:  docker://19.3.13Kubelet Version:            v1.20.9Kube-Proxy Version:         v1.20.9
......

3. 运行 GPU 任务测试

在 IDC 中 K8s 集群中提交 GPU 测试任务,运行结果成功。

> cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: gpu-pod
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 # requesting 1 GPU
EOF> kubectl logs gpu-pod
[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

多级弹性调度策略,自定义弹性资源优先级

自定义弹性资源优先级调度是阿里云提供的弹性调度策略。您可以在应用发布或扩容过程中,自定义资源策略(ResourcePolicy),设置应用实例 Pod 被调度到不同类型节点资源的顺序。同时在缩容过程中按照原调度顺序逆序缩容。

通过上面的演示,我们可以通过 ACK One 注册集群,使用云上 ECS 资源创建节点池,并添加到 IDC 集群中。您可以为节点池或者节点打标(label),并通过设置 Pod 的节点亲 “affinity” 或者 “nodeSelector" 的方式,为 Pod 选择是在 IDC 本地节点中运行,还是在云上 ECS 节点用运行。这种方式需要修改应用 pod 的配置,如果生产系统有较多的应用需要处理,则需要编写调度规则,适合自定义调度的场景,例如:特定 CUDA 版本的 GPU 训练任务调度到云上特定的 GPU ECS 实例上。

为了简化 IDC 中 K8s 集群使用云上 ECS 资源,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 支持以下场景:

场景 1:优先使用 IDC 中集群资源,再使用云上 ECS 资源

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:name: cost-balance-policy
spec:selector:app: nginx           // 选择应用Podstrategy: preferunits:- resource: idc        //优先使用idc指定使用IDC中节点资源- resource: ecs        //当idc节点资源不足时,使用云上ECS,可以通过nodeSelector选择节点nodeSelector:alibabacloud.com/nodepool-id=np7b30xxx

场景 2:混合使用 IDC 资源和云上 ECS 资源

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:name: load-balance-policy
spec:selector:app: nginxstrategy: preferunits:- resource: idcmax: 2             //在idc节点中最多启动2个应用实例- resource: ecsnodeSelector:alibabacloud.com/nodepool-id=np7b30xxxmax: 4             //在ecs节点池中最多启动4个应用实例

总结

演示中,我们将阿里云 GPU P100 机器添加到 IDC 中的 K8s 集群,扩展了 IDC 的 GPU 算力。

通过 ACK One 注册集群:

  1. 您可以选择阿里云上的各种 ECS 实例类型和规格,包括:X86,ARM,GPU 等。

  2. 您可以手动扩容和缩容 ECS 实例数量。

  3. 您可以配置 ECS 实例数量的自动弹性伸缩。

  4. 您可以使用多级弹性调度,优先使用 IDC 中资源,IDC 资源不足的情况下,自动扩容云上 ECS 节点池处理突发业务流量。

后续我们将陆续推出 ACK One 注册集群的系列文章,包括:Serverless 方式扩容 IDC 中 K8s 集群,容灾备份,安全管理等。如果您希望了解并交流 ACK One 的更多能力,欢迎加入 ACK One 客户钉钉交流群讨论(群号):35688562。

参考文档:

[1] 注册集群概述

https://help.aliyun.com/document_detail/155208.html

[2] 创建 ECS 节点池

https://help.aliyun.com/document_detail/208054.html

[3] 配置 ECS 节点自动弹性伸缩

https://help.aliyun.com/document_detail/208055.html

[4] 多级弹性调度

https://help.aliyun.com/document_detail/446694.html

点击此处,查看 ACK One 更多产品详情

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AJAX基础教程

1、引言 就是异步刷新&#xff0c;AJAX要和XMLHttpRequest对象、JavaScript/DOM、CSS、XML一起使用 2、XMLHttpRequest对象 XMLHttpRequest对象&#xff0c;异步的与服务器交换数据&#xff0c;这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新…

【无标题】

Linux下不能连接ppa.launchpad.net的问题&#xff08;中科大软件源&#xff09; 警告&#xff1a;操作前请先做好备份。 1. 替换ppa源成中科大源 每个ppa都会在/etc/apt/sources.list.d/目录下创建一个list文件&#xff0c;修改: vi /etc/apt/sources.list.d/ubuntu-toolch…

JAVA找BUG之OOM

大家好哇&#xff0c;我是梦辛工作室的灵&#xff0c;在最近的工作中&#xff0c;又遇到了一个bug&#xff0c;系统运行一段时间后就会频繁OOM&#xff0c;然后直接假死或退出&#xff0c;一度折磨着我&#xff0c;后面不停的翻日志查GC&#xff0c;最后才终于确认位置&#xf…

UNI-APP开发中遇到的坑

UNI-APP开发中遇到的坑 一、页面无法回退二、列表页面下拉刷新不显示数据 一、页面无法回退 在页面中我们一般会在顶部左侧放置一个返回按钮&#xff0c;用户点击返回按钮则关闭当前页面&#xff0c;返回上一层页面。 <uni-nav-bar left-icon"back" title"添…

Python爬虫——urllib_ajax请求的post请求

爬取肯德基官网的门店位置信息&#xff08;现在已经进不去了&#xff0c;所以现在返回的全是-1000&#xff09;&#xff1a; import urllib.request import urllib.parsedef create_request(page):base_url http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opcnamehea…

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言&#xff1a; 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…

【软件测试面试】腾讯数据平台笔试题-接口-自动化-数据库

数据库题 答案&#xff1a; Python编程题 答案&#xff1a; 接口参数化题 答案&#xff1a; 接口自动化题 答案&#xff1a; 以下是我收集到的比较好的学习教程资源&#xff0c;虽然不是什么很值钱的东西&#xff0c;如果你刚好需要&#xff0c;可以评论区&#…

高斯误差线性单元激活ReLU以外的神经网络

高斯误差线性单位&#xff08;GELU&#xff09;激活函数由加州大学伯克利分校的Dan Hendrycks和芝加哥丰田技术研究所的Kevin Gimpel于2018年引入。激活函数是触发神经元输出的“开关”&#xff0c;随着网络的深入&#xff0c;其重要性也随之增加。最近几周&#xff0c;机器学习…

create database创建数据库失败

瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.7 症状 1、执行如下sql语句创建数据库报错。 create database printcdburn with encodingUTF8 OWNERprintcdburn LC_COLLATEzh_CN.UTF-…

github 最简单的使用步骤(个人学习记录~)

github 使用步骤&#xff1a; (11条消息) github新手用法详解&#xff08;建议收藏&#xff01;&#xff01;&#xff01;&#xff09;_github详解_怪 咖的博客-CSDN博客 1.获取ssh密钥 打开输入&#xff1a;ssh-keygen -t rsa -C “git账号” 输入之后一路Enter&#xff08…

谈谈VPN是什么、类型、使用场景、工作原理

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解VPN是什么、以及它的类型、使用场景、工作原理。 目录 一、VPN是什么&#xff1f; 二、VPN的类型 1、站点对站点VPN 2、…

单例模式(java)

目录 概述 结构 代码实现 饿汉式&#xff08;静态变量&#xff09; 饿汉式&#xff08;静态代码块&#xff09; 懒汉式&#xff08;双重检查方式&#xff09; 概述 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式…

labview 弹窗(子vi)

如果你遇到了需要在主vi运行时需要弹窗某个窗口(或者称为子vi,子画面)&#xff0c;而且要主画面和子画面能独立运行各自的循环程序&#xff0c;本文能给你帮助。 本文的精髓在于: wait until Donefalse,表示子VI运行的同时&#xff0c;主vi也继续运行后面的代码&#xff0c;主…

win10下解决git报错 Permission denied(publickey)

今天在csdn的GitCode新建了一个项目&#xff0c;然后在windows下git clone时出现错误 gitgitcode.net: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 完整…

Apache Doris (三十一):Doris 数据导入(九)Spark Load 4- 导入Hive数据及注意事项

目录 1. Spark Load导入Hive非分区表数据 2. Spark Load 导入Hive分区表数据 3. 注意事项 进入正文之前&#xff0c;欢迎订阅专题、对博文点赞、评论、收藏&#xff0c;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; 宝子们订阅、点赞、收藏不迷路&#xff01;抓紧…

拼多多API接口,百亿补贴商品详情页面采集

电商API的数据类型 电商API提供的数据种类多样&#xff0c;一般可分为以下几类&#xff1a; 1.商品数据&#xff1a;商品ID、商品名称、商品价格、库存等。 2.交易数据&#xff1a;订单号、付款时间、收货人等。 3.店铺数据&#xff1a;店铺ID、店铺名称、开店时间、店铺评…

责任链模式

责任链模式 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/131760462 1、是一种行为型设计模式 2、主要角色 抽象处理者具体处理者 3、允许将请求沿着一系列处理者进行传递&#xff0c;直到有一个处理者可以处理该请求 解耦请求 发送者 和 处理…

如何fork GitHub上的官方仓库

在GitHub中&#xff0c;fork表示复制一个仓库到你自己的GitHub账号下&#xff0c;创建一个独立的副本。通过fork操作&#xff0c;你可以在自己的副本中进行修改、改进和实验&#xff0c;而不会影响到原始仓库或其他人的工作。 当你fork一个仓库时&#xff0c;GitHub将会为你创…

使用Canal同步mysql数据到es

一、简介 Canal主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x 二、工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记…

常用粗糙集特征选择(属性约简)的算法汇总-基于Feast和MIToolbox工具箱实现

常用粗糙集特征选择&#xff08;属性约简&#xff09;的算法汇总 这些算法主要建立在粗糙集工具箱Feast,MIToolbox进行实现。工具箱的安装&#xff1a;https://blog.csdn.net/qq_44822612/article/details/131816235 MIM&#xff0c; MRMR&#xff0c; MIFS&#xff0c; CMIM…