K8s
部署GaiaGPU
前置工作
- 配置好GPU环境
- 配置好k8s集群环境
gpu-admission
部署deployment
创建文件gpu-quota-admission.yaml
---
apiVersion:
apiVersion: v1
kind: ServiceAccount
metadata:
name: gpu-admission
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gpu-admission-as-kube-scheduler
subjects:
- kind: ServiceAccount
name: gpu-admission
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:kube-scheduler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gpu-admission-as-volume-scheduler
subjects:
- kind: ServiceAccount
name: gpu-admission
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:volume-scheduler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gpu-admission-as-daemon-set-controller
subjects:
- kind: ServiceAccount
name: gpu-admission
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:controller:daemon-set-controller
apiGroup: rbac.authorization.k8s.io
---
# 创建控制器
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: gpu-quota-admission
name: gpu-quota-admission
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
k8s-app: gpu-quota-admission
template:
metadata:
labels:
k8s-app: gpu-quota-admission
namespace: kube-system
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: node-role.kubernetes.io/master
operator: Exists
weight: 1
containers:
- env:
- name: LOG_LEVEL
value: "4"
- name: EXTRA_FLAGS
value: --incluster-mode=true
image: ccr.ccs.tencentyun.com/tkeimages/gpu-quota-admission:latest
imagePullPolicy: IfNotPresent
name: gpu-quota-admission
ports:
- containerPort: 3456
protocol: TCP
resources:
limits:
cpu: "2"
memory: 2Gi
requests:
cpu: "1"
memory: 1Gi
volumeMounts:
- mountPath: /root/gpu-quota-admission/
name: config
dnsPolicy: ClusterFirstWithHostNet
initContainers:
- command:
- sh
- -c
- ' mkdir -p /etc/kubernetes/ && cp /root/gpu-quota-admission/gpu-quota-admission.config
/etc/kubernetes/'
image: busybox
imagePullPolicy: Always
name: init-kube-config
securityContext:
privileged: true
volumeMounts:
- mountPath: /root/gpu-quota-admission/
name: config
priority: 2000000000
priorityClassName: system-cluster-critical
restartPolicy: Always
serviceAccount: gpu-admission
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
volumes:
- configMap:
defaultMode: 420
name: gpu-quota-admission
name: config
---
# 创建configMap
apiVersion: v1
kind: ConfigMap
metadata:
name: gpu-quota-admission
namespace: kube-system
data:
gpu-quota-admission.config: |
{
"QuotaConfigMapName": "gpuquota",
"QuotaConfigMapNamespace": "kube-system",
"GPUModelLabel": "gaia.tencent.com/gpu-model",
"GPUPoolLabel": "gaia.tencent.com/gpu-pool"
}
---
# 创建service
apiVersion: v1
kind: Service
metadata:
name: gpu-quota-admission
namespace: kube-system
spec:
ports:
- port: 3456
protocol: TCP
targetPort: 3456
selector:
k8s-app: gpu-quota-admission
type: ClusterIP
kubectl apply -f gpu-quota-admission.yaml
创建自定义调度文件
创建文件/etc/kubernetes/scheduler-policy-config.json

《GaiaGPU:Sharing GPUs in Container Clouds》论文笔记
Abstract
- 对于云服务的提供商, 如何在容器间共享GPU, 是一个有吸引力的问题
- 容器的轻量与伸缩性
- GPU强大的并行计算能力
- 在云环境,容器需要使用一个或多个GPU来满足资源需要的同时, 容器独占式的GPU往往使用率很低
- 我们提出GaiaGPU,能够在容器间共享显存和算力
- 将物理GPU划分为多个虚拟GPU
- 采用弹性资源分配和动态资源分配来提高资源利用率
- 实验结果显示, 有效的实现了容器间资源的分配和隔离的同时,平均只增加了1.015%的开销。
Introduction
- 容器化是一种虚拟化技术
- 涉及到量身定制一个标准操作系统,方便它在一个物理机上运行由多个用户处理的不同应用程序
- 与VM模拟底层硬件不同
- 容器模拟的是操作系统
- 轻量,可伸缩,易部署
- 微服务打包与发布应用的事实标准
- 云服务提供商整合容器编排框架(如k8s)到基础架构中来提供容器云
- GPU 图像处理单元
- 有很强的并行处理能力
- 因为一个芯片上集成了数以千计的计算核
- GPU被广泛用于计算密集型任务,以加快计算
- 随着技术的发展趋势,现代GPU内将集成入越来越多的计算资源
- CUDA是多功能GPU最流行的平台,提供了API方便GPU的使用
- 卓越的性能吸引了很多云提供商将GPU引入云环境
- 在云环境中,部署在容器中的一个应用程序可能需要一个或多个GPU才能执行,
- 而另一方面,应用程序的专用GPU资源导致资源不足。
- 因此,如何在不同的容器中共享GPU对大多数云提供商都非常感兴趣
- 有很强的并行处理能力
- GPU虚拟化技术是在隔离的虚拟环境(例如VM, 容器)之间共享GPU的技术
- 多数的GPU虚拟化技术应用于VM, 容器间的虚拟化技术还在起始阶段
- 现阶段的基于容器的GPU虚拟化技术有以下局限性
- 需要特定的硬件设备(NVIDIA GRID)
- 将一整个GPU分配给单个容器, 不能共享 (NVIDIA Docker)
- 容器间只能共享GPU显存 (ConvGPU)
- 只支持单个GPU (ConvGPU)
- 我们提出GaiaGPU,能够在容器间透明地共享显存和算力
- 用户不用修改容器镜像来共享底层GPU
- 我们使用k8s的device plugin 框架将物理GPU划分为多个虚拟GPU
- 每个镜像可以按需分配一个或者多个vGPU
- 提供了两者方式在运行时更改镜像资源
- 弹性资源分配:暂时改变资源
- 动态资源分配:永久改变资源
- 用户不用修改容器镜像来共享底层GPU
- vGPU包括GPU显存和计算资源
- 共享显存
- 容器包含GPU显存的一小部分
- vGPU分配的是GPU的物理内存
- 共享计算资源
- 共享计算资源意味着每个容器都拥有GPU线程的一部分以并行执行计算。
- VGPU的计算资源由GPU的利用率衡量(采样时段内, 容器使用GPU的时间比例)
- 共享显存
- 总结:本文做了如下贡献
- 提出了GaiaGPU:一种在容器间透明共享显存与算力的方法
- 采用弹性分配和动态分配的方式提高了资源的利用率
- 进行了四个实验来验证GaiaGPU的性能。结果:实现了容器间资源的分配和隔离的同时,平均只增加了1.015%的开销。
Related Work
GPU虚拟化
被应用于在多个虚拟环境之间分享GPU, 极大地提高了应用性能

在ubuntu上k8s集群部署实践
centos 上安装建议看 后端 - CentOS 搭建 K8S,一次性成功,收藏了!_个人文章 - SegmentFault 思否
一、机器配置
配置主机名
sudo hostnamectl set-hostname "k8s-master" // Run this command on masternode
cat /etc/hostname
sudo hostnamectl set-hostname "k8s-node1" // Run this command on node-0
sudo hostnamectl set-hostname "k8s-node2" // Run this command on node-1
配置/etc/hosts
sudo vi /etc/hosts
10.1.13.106 k8s-master
#10.1.13.107 k8s-node1
#10.1.13.108 k8s-node1
配置免密登录(可以省略)
想让机器 A 访问机器 B,就把机器 A 的公钥放到机器 B 的~/.ssh/authorized_keys 文件里就行了。