本插件是基于intel-device-plugin实现,由于设备的挂载、调⽤等接⼝与设备类型⽆关,所以只需修改scan接⼝即可。
部署过程:
1. 下载intel-device-plugin
$ mkdir -p $GOPATH/src/github.com/intel/
$ cd $GOPATH/src/github.com/intel/
$ git clone https://github.com/intel/intel-device-plugins-for-kubernetes.git
2. 验证kubelet是否已经安装
$ ls /var/lib/kubelet/device-plugins/kubelet.sock
/var/lib/kubelet/device-plugins/kubelet.sock
3. 修改的⽂件为: intel-device-plugins-for-kubernetes/cmd/gpu_plugin/gpu_plugin.go
// 需要修改的⽂件为: intel-device-plugins-forkubernetes/cmd/gpu_plugin/gpu_plugin.go
const (
devfsDriDirectory = "/dev" //设备⽬录
gpuDeviceRE = `^cambricon_c10Dev[0-9]+$` //设备名称的正则表达式
// Device plugin settings.
namespace = "mlu100.com" //设备注册的域名
deviceType = "i915" //设备注册的类型
)
4. 实现scan接⼝供 func (dp *devicePlugin) Scan(notifier dpapi.Notifier) error ⽤,该接⼝的功能是扫描系统/dev⽬录下符合上述正则表达式的设备,并返回设备列表
// 需要修改的⽂件为: intel-device-plugins-forkubernetes/cmd/gpu_plugin/gpu_plugin.go
func (dp *devicePlugin) scan() (dpapi.DeviceTree, error) {
files, err := ioutil.ReadDir(dp.devfsDir)
if err != nil {
fmt.Println("something error")
return nil, err
}
i := 0
devTree := dpapi.NewDeviceTree()
for _, f := range files {
var nodes []pluginapi.DeviceSpec
if dp.gpuDeviceReg.MatchString(f.Name()) {
devPath := path.Join(dp.devfsDir, f.Name()) //设备的绝对路径
fmt.Printf("%s\n", devPath)
nodes = append(nodes, pluginapi.DeviceSpec{ //一个设备对应一个node
HostPath: devPath,
ContainerPath: devPath,
Permissions: "rw",
})
devID := fmt.Sprintf("%s-%d", f.Name(), i)
devTree.AddDevice(deviceType, devID, dpapi.DeviceInfo{ //添加设备到设备列表
State: pluginapi.Healthy, //设备健康状态
Nodes: nodes,
})
i += 1
}
}
return devTree, nil
}
修改部分无效的内容
5. 部署GPU设备插件作为主机进程用于开发目的(此步骤可以省略)
5.1 编译
cd $GOPATH/src/github.com/intel/intel-device-plugins-for-kubernetes
make gpu_plugin # 编译代码
5.2 以管理员身份运行
$ sudo $GOPATH/src/github.com/intel/intel-device-plugins-for-kubernetes/cmd/gpu_plugin/gpu_plugin
device-plugin start server at: /var/lib/kubelet/device-plugins/gpu.intel.com-i915.sock
device-plugin registered
6. 以DaemonSet方式部署插件
6.1 编译
cd $GOPATH/src/github.com/intel/intel-device-plugins-for-ku
make gpu_plugin # 编译代码
make intel-gpu-plugin # ⽣成镜像intel-gpu-plugin
docker tag SOURCE_IMAGE[:TAG] yumingc/intel-gpu-plugin:v2 #更改镜像的名字
docker push yumingc/intel-gpu-plugin:v2 #上传docker hub便于下载使用
6.2 编写yaml文件gpu_plugin.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: intel-gpu-plugin
namespace: kube-system
labels:
app: intel-gpu-plugin
spec:
selector:
matchLabels:
app: intel-gpu-plugin
template:
metadata:
labels:
app: intel-gpu-plugin
spec:
containers:
- name: intel-gpu-plugin
env:
- name: archlab-sys-7048gr-tr
valueFrom:
fieldRef:
fieldPath: spec.nodeName
image: yumingc/intel-gpu-plugin:v2 #更改为上述更名的镜像
imagePullPolicy: IfNotPresent
volumeMounts:
- name: devfs
mountPath: /dev
- name: sysfs
mountPath: /sys
- name: kubeletsockets
mountPath: /var/lib/kubelet/device-plugins
volumes:
- name: devfs
hostPath:
path: /dev
- name: sysfs
hostPath:
path: /sys
- name: kubeletsockets
hostPath:
path: /var/lib/kubelet/device-plugins
6.3 运行yaml
kubectl create -f gpu_plugin.yaml
参考文献: