一堆废话
是这样,我们有个电力物联的项目是跑在本地内网的,用的是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
,那接下来的问题就是将该设备挂载到容器中了,怎么挂载呢?
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
答案是不行,挂载是可以挂载进去,问题是会报错operation not permitted
直接导致Pod崩溃
首先确认一下kube-apiserver参数已开启支持特权模式(没有的话可能需要修改kube-apiserver的manifests资源清单文件),然后在Pod的资源清单中给它加上特权模式
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
参考:
1、免费mongodb可视化客户端nosqlbooster
2、.AppImage是什么、怎么使用
3、怎么在Ubuntu上怎么安装Postman
4、docker挂载设备到容器中
5、Docker选项与K8S的Yaml
6、官方 Pod 安全策略
7、k8s之Pod安全策略