K8s环境中部署各种开发应用服务(二)有状态服务的准备工作——NFS
直接开始
本章我们要给树莓派集群部署一个网络存储服务——NFS
首先从硬盘开始搞
选择硬盘作为存储机制而不是选择SD卡的原因很明显,SD卡的IO读写效率太低,而且反复读写过程中容易造成损坏
刚好手里有一块吃灰的120G固态硬盘
看了一下是SATA接口,于是又从京东上买了一根硬盘线
4台树莓派中的零号机做了K8s(K3s)的主节点,初号机做了Rancher的服务,所以就顺次把贰号机作为NFS服务节点了。
通过USB3.0接上硬盘之后,成功点亮,说明PoE供电还是很靠得住的
其实在翻出来这块SSD之前,在网上还看到了一个好东西
Geekworm的小板子
有支持 M.2 (NGFF)的,也有支持 mSATA的
最新的x872还支持M.2 (NVMe)
装好之后的整机效果是这样
轻薄透气,美观优雅上档次
但是最终还是忍住了没烧包
除了贫穷以外的其他原因主要是
1.性能过剩:NVMe M.2动辄3000MB/s的传输速度用在我们的树莓派集群里完全发挥不出来
2.传输瓶颈:我们的集群中存在的传输瓶颈主要是USB3.0接口(625MB/s)以及千兆网口(125MB/s),因此2.5寸的SSD实际上已经远远够用了 (其实还是因为没有钱)
格式化和分区
回到我们的旧硬盘这里
硬盘接上USB3.0之后,成功点亮
下面执行命令查看硬盘设备
fdisk -l
能看到上面的设备是树莓派的SD卡
下面这个Disk /dev/sda 就是我们的新硬盘了
接下来我们使用cfdisk工具给这块硬盘分个区(这里就分了一个区,毕竟能用就得了)
分区
cfdisk /dev/sda
选择 NEW 然后 回车
输入分区大小之后 继续 回车
选择 primary 接着 回车
选择 Write 再次 回车
输入 yes 还得 回车
分区完成 选择 Quit 最后 回车 退出
下面给分好的区进行格式化
格式化
将硬盘 /dev/sda 的第一分区 /dev/sda1 格式化为Ext4格式
执行命令
mkfs -t ext4 /dev/sda1
中间输入一次 y
格式化完成
挂载硬盘
先在找个地方新建一个文件夹,用来挂载这块硬盘
mkdir /mnt/data/
然后将刚才硬盘分好的区(/dev/sda1)挂载到这个文件夹下
mount /dev/sda1 /mnt/data/
设置开机自动挂载硬盘
这里需要设置 /etc/fstab 下面的参数来给系统配置开机自动挂载硬盘
详细的 /etc/fstab 参数说明可以参考下面的文章
/etc/fstab 参数详解及如何设置开机自动挂载
我们先执行命令 查看当前硬盘挂载情况
blkid
可以看到刚才我们手动通过 mount 命令挂载好的硬盘
接下来进入 /etc/fstab 查看开机自动挂载的硬盘
vi /etc/fstab
能看到SD卡的两个区就是开机自动挂载状态
我们在下面加上 /dev/sda1 的挂载参数
/dev/sda1 /mnt/data ext4 defaults 0 0
:wq
保存之后,重启系统的时候就能看到效果了
reboot
等系统重启之后,再执行 blkid 来查看一下
可以看到 /dev/sda1 开机后已经自动挂载上了
坑坑坑
值得提一下,上面用的挂载方式是Linux的自动挂载硬盘的方法。
如果使用其他一些方式(例如autofs)做自动挂载,一定要考虑硬盘挂载与使用硬盘的服务启动的优先顺序问题。
我一开始做开机自动挂载的时候,是通过修改 /etc/rc.local 在最下面加了一行挂载命令
mount /dev/sda1 /mnt/data/
开机后硬盘挂的稳稳的,看起来也没有任何问题
但是到了后面部署完nfs服务之后,发现每次开机nfs都自动启动失败。
原因就是nfs在启动服务的时候, mount 命令还没有执行,自然就找不到硬盘了。
放松一下,来测一测硬盘的速度
首先安装磁盘测试工具
sudo apt-get install hdparm
然后分别执行下面的命令
测试本地SD卡的读写速度
hdparm -Tt /dev/mmcblk0
测试挂载硬盘的读写速度
hdparm -Tt /dev/sda1
效果显著
这说明我们以上的工作是意义深远的,成果是喜人的
部署NFS服务
终于来到了这里
一切准备就绪,下面我们来正式开始部署NFS服务了
我们要做的是将树莓派集群中的贰号机(挂载了硬盘的这台),做成nfs的服务端
同时还要将另外三台主机,做成nfs的客户端
来到nfs服务端的这台机器上
同时下载安装两个软件包(客户端/服务端)
nfs-common和nfs-kernel-server
sudo apt-get install nfs-common nfs-kernel-server
安装好之后,执行命令将两个服务设置为开机自启动
sudo systemctl enable nfs-common.service
sudo systemctl enable nfs-server.service
最后不要忘记 daemon-reload 一下
sudo systemctl daemon-reload
随后 来到nfs客户端的3台机器上
下载安装客户端软件包 nfs-common
sudo apt-get install nfs-common
执行命令将服务设置开机自启动
sudo systemctl enable nfs-common.service
同样要 daemon-reload 一下
sudo systemctl daemon-reload
准备工作还没结束
回到nfs服务端这台机器上
继续配置nfs服务的挂载目录
先去硬盘路径下给nfs服务新建一个文件夹 nfsdata
mkdir /mnt/data/nfsdata
要是担心后面K8s下使用nfs服务读写的时候出现权限问题的话
那就现在顺便赋个权
chmod 777 -R /mnt/data/nfsdata
接下来开始配置nfs的目录
vi /etc/exports
在最下面加上这行内容
/mnt/data/nfsdata *(rw,sync,no_root_squash,no_all_squash)
:wq
保存退出
这样就把nfs的服务目录指定到这块硬盘上了
接下来可以重启(reboot)这台机器来启动nfs服务
当然也可以直接启动服务
sudo systemctl start nfs-server.service
但是通过重启可以完整检查一下硬盘自启动挂载之后nfs服务是否成功启动
启动完成后查看nfs服务状态
sudo systemctl status nfs-server.service
nfs服务启动成功
继续使用showmount命令来查看一下nfs服务的节点
IP地址就是贰号机 (nfs的服务端)
showmount -e 192.168.31.83
一切正常
此时,如果另外3台机器也已经启动了 nfs-common 客户端服务的话
在客户端主机去执行上面的命令是可以看到一样的结果的
别忘了启动 nfs-common 服务
sudo systemctl start nfs-common.service
至此,树莓派集群中的NFS服务搭建完成
坑坑坑的回溯之一
最后这里我们在回头看一下前面提到的硬盘开机自动挂载那件事
如果当时的配置有问题,导致开机时nfs服务比硬盘挂载动作提前进行了
那么就会出现下面的错误,导致nfs服务启动失败
就相当于硬盘没还插上,nfs服务就启动了,当然找不到路径
这个时候 restart 一下nfs服务,就又能成功启动了
是因为此时硬盘已经挂载上了
所以最终解决办法还是得老老实实用Linux的方式去做开机挂载
坑坑坑的回溯之二
在折腾nfs的过程中,出现了来来回回重复 start restart nfs-common.service 的情况
之后就冒出来了这个错误 Unit nfs-common.service is masked.
(居然还能被玩儿坏了)
找了一些解决办法 比如unmask命令
systemctl unmask nfs-common.service
然而并没有什么效果
最后从Stack Overflow上面找到了一条
于是来到 /lib/systemd/system/ 下面
找到 nfs-common.service 看到果然link到了/dev/null
赶紧干掉
rm /lib/systemd/system/nfs-common.service
再重新daemon-reload
systemctl daemon-reload
再来启动 nfs-common.service
一切正常了