TKE qGPU 通过 CRD 管理集群 GPU 卡资源
作者
刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理经验,现负责腾讯云 GPU 容器的研发工作。
背景
目前 TKE 已提供基于 qGPU 的算力/显存强隔离的共享 GPU 调度隔离方案,但是部分用户反馈缺乏 GPU 资源的可观测性,例如无法获取单个 GPU 设备的剩余资源,不利于 GPU 资源的运维和管理。在这种背景下,我们希望提供一种方案,可以让用户在 Kubernetes 集群中直观的统计和查询 GPU 资源的使用情况。
目标
在目前 TKE 共享 GPU 调度方案的基础上,从以下几个方面增强 GPU 设备的可观测性:
支持获取单个 GPU 设备的资源分配信息。
支持获取单个 GPU 设备的健康状态。
支持获取某个节点上各 GPU 设备信息。
支持获取 GPU 设备和 Pod / Container 关联信息。
我们的方案
我们通过 GPU CRD 扫描物理 GPU 的信息,并在 qGPU 生命周期中更新使用到的物理 GPU 资源,从而解决在共享 GPU 场景下缺少可见性的问题。
自定义 GPU CRD:每个 GPU 设备对应一个 GPU 对象,通过 GPU 对象可以获取 GPU 设备的硬件信息,健康状态以及资源分配情况。
Elastic GPU Device Plugin:根据 GPU 设备的硬件信息创建 GPU 对象,定期更新 GPU 设备的健康状态。
Elastic GPU Scheduler:根据 GPU 资源使用情况调度 Pod,同时将调度结果更新到 GPU 对象。

TKE GPU CRD 设计
apiVersion: elasticgpu.io/v1alpha1
kind: GPU
metadata:
labels:
elasticgpu.io/node: 10.0.0.2
name: 192.168.2.5-00
spec:
index: 0
memory: 34089730048
model: Tesla V100-SXM2-32GB
nodeName: 10.0.0.2
path: /dev/nvidia0
uuid: GPU-cf0f5fe7-0e15-4915-be3c-a6d976d65ad4
status:
state: Healthy
allocatable:
tke.cloud.tencent.com/qgpu-core: "50"
tke.cloud.tencent.com/qgpu-memory: "23"
allocated:
0dc3c905-2955-4346-b74e-7e65e29368d2:
containers:
- container: test
resource:
tke.cloud.tencent.com/qgpu-core: "50"
tke.cloud.tencent.com/qgpu-memory: "8"
namespace: default
pod: test
capacity:
tke.cloud.tencent.com/qgpu-core: "100"
tke.cloud.tencent.com/qgpu-memory: "31"
每个 GPU 物理卡对应一个 GPU CRD,通过 GPU CRD 可以清楚了解每张卡的型号,显存等硬件信息,同时通过 status 可以获取每个 GPU 设备的健康状态和资源分配情况。
TKE GPU 调度过程

Kubernetes 提供了 Scheduler Extender 用于对调度器进行扩展,用于满足复杂场景下的调度需求。扩展后的调度器会在调用内置预选策略和优选策略之后通过 HTTP 协议调用扩展程序再次进行预选和优选,最后选择一个合适的 Node 进行 Pod 的调度。
在 TKE Elastic GPU Scheduler(原 TKE qGPU Scheduler),我们结合了 GPU CRD 设计,在调度时首先会根据 status.state 过滤掉异常 GPU 设备,然后根据 status.allocatable 选择剩余资源满足需求的 GPU 设备,在最终完成调度时更新 status.allocatable 和 status.allocated 。
TKE GPU 分配过程

Kubernetes 提供了 Device Plugin 机制用于支持 GPU FPGA 等硬件设备,设备厂商只需要根据接口实现 Device Plugin 而不需要修改 Kubernetes 源码,Device Plugin 一般以 DaemonSet 的形式运行在节点上。
我们在 TKE Elastic GPU Device Plugin(原 TKE qGPU Device Plugin)启动时会根据节点上 GPU 设备的硬件信息创建 GPU 对象,同时会定期检查 GPU 设备的健康状态并同步到 GPU 对象的 status.state。
总结
为了解决目前 TKE 集群内 GPU 资源可观测性缺失的问题,我们引入了 GPU CRD,用户可以直观的统计和查询集群内 GPU 资源的使用情况,目前这套方案已和 qGPU 完成整合,在 TKE 控制台安装 qGPU 插件时选择使用 CRD 即可开启。
目前 TKE qGPU 已全量上线,详情请戳:https://cloud.tencent.com/document/product/457/61448
关于我们
更多关于云原生的案例和知识,可关注同名【腾讯云原生】公众号~
福利:
①公众号后台回复【手册】,可获得《腾讯云原生路线图手册》&《腾讯云原生最佳实践》~
②公众号后台回复【系列】,可获得《15个系列100+篇超实用云原生原创干货合集》,包含Kubernetes 降本增效、K8s 性能优化实践、最佳实践等系列。
③公众号后台回复【白皮书】,可获得《腾讯云容器安全白皮书》&《降本之源-云原生成本管理白皮书v1.0》
④公众号后台回复【光速入门】,可获得腾讯云专家5万字精华教程,光速入门Prometheus和Grafana。
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!
TKE qGPU 通过 CRD 管理集群 GPU 卡资源的更多相关文章
- 管理集群中的 crs 管理员
管理集群中的 crs 管理员 oracle Managing CRS Administrators in the Cluster Use the following commands to ma ...
- 四十.创建Redis集群 管理集群
环境准备 准备 6台(51-56) redis服务器 以默认配置运行redis服务即可 一.创建Redis集群 1.启用集群功能( 51-56 都要配置) ]# netstat -antupl ...
- 通过memberlist库实现gossip管理集群以及集群数据交互
通过memberlist库实现gossip管理集群以及集群数据交互 概述 memberlist库的简单用法如下,注意下面使用for循环来执行list.Join,原因是一开始各节点都没有runing,直 ...
- 049.Kubernetes集群管理-集群监控Metrics
一 集群监控 1.1 Metrics Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的 ...
- mesos+marathon+zookeeper的docker管理集群亲手搭建实例(环境Centos6.8)
资源:3台centos6.8虚拟机 4cpu 8G内存 ip 10.19.54.111-113 1台centos6.8虚拟机2cpu 8G ip 10.19.53.55 1.System Requir ...
- 用Go造轮子-管理集群中的配置文件
写在前面 最近一年来,我都在做公司的RTB广告系统,包括SSP曝光服务,ADX服务和DSP系统.因为是第一次在公司用Go语言实现这么一个大的系统,中间因为各种原因造了很多轮子.现在稍微有点时间,觉着有 ...
- kubernetes---kubectl 管理集群资源
由于我现在的集群是把虚拟机的master文件直接拷贝过来的,所以之前的node节点是不存在的,只有k8s-ubuntu-1是新加入的,所以我要把上面之前创建的资源删除 删除deployment--&g ...
- 安装rancher以及使用rancher倒入kubernetes集群和添加及管理集群
1.docker安装rancher [root@rancher ~]# docker run -d --name rancher --restart=unless-stopped -p : -p : ...
- kafka能做什么?kafka集群配置 (卡夫卡 大数据)
什么是Kafka 官网介绍: 几个概念: 详细介绍 : 操作kafka: kafka集群 消息测试 问题检测 什么是Kafka 官网介绍: ApacheKafka是一个分布式流媒体平台.这到底是什么意 ...
随机推荐
- (1/2)Canvas的交互&存为图片-基本篇
前言 公司的产品同学看到朋友圈疯传的这张图后.一拍脑袋,决定做个H5版本的来推广一波. 需求如下: 文字变成可以点击的,而且还要能够变色(闪瞎有木有) 中间的姓名换成用户的微信头像 点击button后 ...
- 小程序刷新webview小结
场景 在小程序其它页面做了操作,数据发生改变,回到webview页面时需要更新webview里面的数据.由于小程序没有提供与webview的实时通信能力,因此刷新页面是个可考虑的做法. 方法一 最常见 ...
- 如何监控微信小程序HTTP请求错误
摘要: Fundebug的微信小程序错误监控插件更新至0.5.0,支持监控HTTP请求错误. 接入插件 接入Fundebug的错误监控插件非常简单,只需要下载fundebug.0.5.0.min.js ...
- php运用validate+ajax检测用户名是否已存在
前提:如果还不知道什么是validate,请前往这里 一.remote rules: username:{ required:true, minlength:8, maxlength:8, remot ...
- 【Android开发】jarsigner重新打包apk
签名(sign):在应用程序的特定字段写入特定的标记信息,表示该软件已经通过了签署者的审核. 过程:使用私有密钥数字地签署一个给定的应用程序. 作用: 识别应用程序作者: 检測应用程序是否发生改变: ...
- 关于表达式&& 和 || 有多项的时候的取值
&& 表达式只有两项的时候,如果表达式为false, 返回为false 的那一个 ,为true的时候 返回最后一个值 || 只有两项的时候,返回为true 的那一个;都为fal ...
- vue项目中返回之前页面数据不刷新的问题
利用vue做项目的时候会有让用户选择当前页面的某些数据,然后再跳到下一页,而下一页是根据上一页的数据来的,有时候选择了上一页的不同选项,下一页的数据可能还是之前的 这个就属于vue的数据获取问题 解决 ...
- upsource 配置git仓库时的 rsa 问题
在使用 upsource 时,当 通过 SSH-key 需要配置一个 git 仓库代码时,在使用本机已有配置的 rsa 是出现无法连接的问题.这是需要看下具体的提示,如下图的显示 其实关键的地方看这个 ...
- 2021.07.20 CF1477A Nezzar and Board(最大公因数,未证)
2021.07.20 CF1477A Nezzar and Board(最大公因数,未证) CF1477A Nezzar and Board - 洛谷 | 计算机科学教育新生态 (luogu.com. ...
- 关于Jupyter Notebook无法自动补全(Autocompletion),报错TypeError: __init__() got an unexpected keyword argument 'column' 的解决方案
关于Jupyter Notebook无法自动补全(Autocompletion),报错TypeError: __init__() got an unexpected keyword argument ...
