侧边栏壁纸
博主头像
枕头下放双臭袜子博主等级

今我何功德,曾不事农桑

  • 累计撰写 162 篇文章
  • 累计创建 30 个标签
  • 累计收到 0 条评论
k8s

k8s Pod 如何连接 USB 设备

枕头下放双臭袜子
2022-03-29 / 0 评论 / 0 点赞 / 56 阅读 / 1,921 字 / 正在检测是否收录...

一堆废话

是这样,我们有个电力物联的项目是跑在本地内网的,用的是k8s环境,需求不大,要是给它单独配置一台服务器多少有点浪费,就用一台电脑(可访问公网)部署了单master节点的k8s集群。

该项目由 nginx-ingress-controller、mongodb、mysql、go、httpd、nfs、emqx 组成,其中除了nfs之外都是以Pod的形式部署在了k8s上。

mongodb因为要使用阿里开源的MongoShake同步数据,所以部署形式是单节点的副本集模式,至于怎么解决MongoDB重启IP更换的问题可参考这里

部署k8s的宿主机操作系统是ubuntu 20.4,为了前期调试方便(不用来回切换网络啥的问题),所以想要在该ubuntu上装一个Postman 和 MongoDB可视化客户端

其中MongoDB可视化客户端为了方便和省事,最终选择了免费版的nosqlbooster,该软件下载Linux版本之后,是一个.AppImage的软件包,至于.AppImage是什么和怎么使用可参考这里

至于怎么在Ubuntu上怎么安装Postman可以参考这里,别TM跟我扯snap,snap速度奇慢还不能更换源,算了算了,惹不起还不能不用了嘛?

二堆废话

又因为 物理设备产生的数据 需要通过go程序存入到mongodb中之后做相应处理,所以物理设备要能和go程序联通,go程序是部署在k8s的pod中的。

那想要连通,首先设备需要用一个console线连接到k8s宿主机(小插曲,实验室网线口和大设备相差较远,反正是抉择之后找到一位王工,手动改线把console线延长了五六米),那这样设备和k8s宿主机ubuntu算是连接上了,ls /dev也能看到该设备ttyUSB0,那接下来的问题就是将该设备挂载到容器中了,怎么挂载呢?

image.png

docker容器是有一个参数--device可以将设备挂载到容器当中,那设备可以挂载到Pod中吗?答案当然是可以的。有两种方法将设备挂载到Pod中,一是把Pod设置为特权模式,然后使用hostpath把设备挂载进去;二是自行开发device-plugin,比如GPU。这两种方法我只能考虑第一种,别问我为啥,第二种我是没有能力去现场开发插件去,臣妾做不到。

那就只能考虑第一种方法将设备挂载到Pod当中了,首先我先尝试一下只将设备通过hostPath挂载进容器,看看能不能行

containers:
      - name: submonitorbusiness
        image: xxxxx
        imagePullPolicy: Always
        ports:
        - containerPort: 8405
        volumeMounts:
        - name: submonitorbusinessconf
          mountPath: /conf/
        - name: dev-hostpath
          mountPath: /dev/ttyUSB0
      volumes:
      - name: submonitorbusinessconf
        configMap:
          name: submonitorbusiness-config 
      - name: dev-hostpath
        hostPath:
          path: /dev/ttyUSB0

image.png
答案是不行,挂载是可以挂载进去,问题是会报错operation not permitted直接导致Pod崩溃
image.png

首先确认一下kube-apiserver参数已开启支持特权模式(没有的话可能需要修改kube-apiserver的manifests资源清单文件),然后在Pod的资源清单中给它加上特权模式

image.png

containers:
      - name: submonitorbusiness
        image: xxx
        imagePullPolicy: Always
        ports:
        - containerPort: 8405
        securityContext:
          privileged: true
        volumeMounts:
        - name: submonitorbusinessconf
          mountPath: /conf/
        - name: dev-hostpath
          mountPath: /dev/ttyUSB0
      volumes:
      - name: submonitorbusinessconf
        configMap:
          name: submonitorbusiness-config 
      - name: dev-hostpath
        hostPath:
          path: /dev/ttyUSB0

image.png
image.png

参考:
1、免费mongodb可视化客户端nosqlbooster
2、.AppImage是什么、怎么使用
3、怎么在Ubuntu上怎么安装Postman
4、docker挂载设备到容器中
5、Docker选项与K8S的Yaml
6、官方 Pod 安全策略
7、k8s之Pod安全策略

0

评论