**本文首发于“雨夜随笔”公众号,欢迎关注。**
问题的根源
通过网上查询和搜索,发现原因是挂载s3fs需要挂载 /dev/fuse, 而挂载这个容器需要设置 `privileged=true`,这个导致容器变成了特权容器,从而可以访问到宿主机上的GPU资源。这样容器实际能够使用的GPU卡数和自己观察到的GPU卡数并不一致,从而可能会导致一系列错误。同时这个也违背了容器的隔离性原则,相当于容器可以访问主机内核的所有功能,容器中运行的恶意代码可能导致整个主机出问题。
解决方法
1) 使用相关的 API,不同于直接运行s3fs的命令, 通过调用API来访问远程对象,这样首先不太友好,代码也会变得比较复杂。
2)使用kernel的安全方案来做具体的粒度控制,通过kernel自带的功能可以做到不使用特权容器就能使用s3fs。
Device Plugin - Kubernetes中更加优雅的使用方式
而在Kubernetes中,则拥有更加优雅的方式,因为Kubernetes也考虑到了相关的情形,提供了Device Plugin这种方式。我们总体的思路是:
1)把 /dev/fuse 设备注入到容器中。
2)给予容器尽可能少的权限,比如可以执行mount命令挂载文件系统,避免使用privileged访问到所有的GPU。
而Kubernetes中的Device Plugin就可以完全满足这个需求,那么在开始之前我们来看看Device Plugin究竟是什么吧?
然后我们将这个资源注册到Kubelet中,之后将自己管理的设备列表发布出去,Kubernetes会根据我们上报的健康设备数目来更新节点的状态。
这样通过我们的定义,当容器需要使用devfuse资源时,只需要向Kubernetes申请github.com/fuse资源,并添加少量的权限,就可以正常使用s3fs了。具体流程如下:
至于具体的Device Plugin实现代码,已经上传到 Github
欢迎关注
网友评论