GPU容器架构设计及难点重点
in with 0 comment

GPU容器架构设计及难点重点

in with 0 comment

GPU容器设计要点

1 GPU资源共享
2 网盘文件存储并能在容器进行访问
3 具备本地存储快速运行
模块.PNG

k8s 基本结构:

3425182-9c56c8034578b156.png

kube-scheduler: 负责容器调度  kube-api-server: 负责总体的对外命令的执行和请求
kubelet: 负责本地容器的管理 kube-proxy:负责端口管理

常见问题:
1 node is not ready

2 emphere-storage not enough

3 calico 节点无法分配ip

4 disk pressure

本地存储

k8s 本地存储具有Empty Dir、hostPath、static localPv 和rancher 提供的Dynamic Local pv。
Empty Dir: 无法进行持久化,docker 消失后文件随即消失
hostPath:需要手动管理操作不方便
k8s static localPv: 静态创建本地磁盘后与容器在同一台机上,但是不能修改容量的大小。
Dynamic: 除了static 的功能外,可以动态地修改本地存储大小。

网盘存储

网络存储有三个需求:
1 支持容器挂载访问
2 必须是文件系统文件可以单独访问
3  支持容量的限制
调研所有的k8s 存储下来能满足的非常少。除了Ceph
ceph 的架构如下:

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9BME8yUW1PZnhCbHF4R3NxUXBhd1ZQTGdIUmVSaE5Ta05aeFFHbmhpYnViQ05qTm5hd25pYXNWblVTMHZtWTZ0NHdFQ2pjY0FybmVrNlZSSUh6djFXekdRLzY0MA.png

osd: 负责响应客户端请求返回具体数据的进程

MDS: 全称 Ceph Metadata Server,是 CephFS 服务依赖的元数据服务

PG 全称 Placement Grouops,是一个逻辑的概念,一个 PG 包含多个 OSD。引入 PG 这一层其实是为了更好的分配数据和定位数据。

RADOS 实现用户实现数据分配、Failover 等集群操作

Libradio: 访问Rados的入口

提供的存储方案

RBD 全称 RADOS block device,是 Ceph 对外提供的块设备服务。
RGW 全称 RADOS gateway,是 Ceph 对外提供的对象存储服务,接口与 S3 和 Swift 兼容。
CephFS 全称 Ceph File System,是 Ceph 对外提供的文件系统服务。

常见问题:
1 osd 发生抖动客户端无法连接
2 mds slow 数据读取变慢
3 挂载问题 can't not read super block
4 虽然设置多台主机共享cephfs 但是超过一定数量 无法mount
5 有节点发生osd 异常需要将节点重启

GPU 共享难点

1 兼容系统内核和cuda 版本
2 尽可能使用通用docker 而不使用nvidia-docker
3 保证gpu-manager-controller 平稳运行m

gpu---.PNG

GPUmanager 常见的遇到的问题如下:

  1. cannot find /dev/nvidia-uvm
    处理方法: modprobe nvidia-uvm

mknod -m 666 /dev/nvidia-uvm c grep nvidia-uvm /proc/devices | awk '{print $1}' 0

  1. in-sufficient gpu memory

端口暴露和提供对外访问

基本需求:

1 满足jupyter 8888对外访问需求

2 满足ssh 远程访问需求

方案: 1 nodeport 2 traefik 3 loadbalance

1 trafik 提供http和tcp 访问但是无论ingress还是traefik 配置tcp 都比较复杂

2 nodeport 提供集群的所有该接口都对外允许访问,虽然满足需求但是对外暴露ip过多

3 采用metalb 2层网络loadbalance 可以有效解决暴露ip问题同时的也解决了访问某一台

主机挂掉的问题
metalb_o.png

container 的创建过程

------.PNG
容器创建的过程如下:

1 前端发起调用创建容器

2 查看部署名称是否在运行队列

3 发起异步请求创建本地磁盘

4 本地磁盘创建成功,发起异步创建deployment

5 申请cpu memory gpu 拉取docker 创建容器

6 挂载本地磁盘

7 挂载网络磁盘

8 检查创建容器成功

9 创建service 获取的ip和端口

10 将IP端口和deployment name 放入运行队列和待发送消息队列

问题与挑战

1 如何保证分布式文件存储的稳定性 稳定提供网络存储

2 保证k8s 组件的稳定性包括calico kubelet kube-scheduler

3 gpu-manager确保gpu运行调度资源

4 及时监控,包括磁盘网盘,gpu网络资源确保第一时间发现问题并对告警进行处理

Responses