K8s环境中部署各种开发应用服务(二)有状态服务的准备工作——NFS

直接开始

本章我们要给树莓派集群部署一个网络存储服务——NFS

首先从硬盘开始搞
选择硬盘作为存储机制而不是选择SD卡的原因很明显,SD卡的IO读写效率太低,而且反复读写过程中容易造成损坏

刚好手里有一块吃灰的120G固态硬盘

image.png

看了一下是SATA接口,于是又从京东上买了一根硬盘线

image.png

4台树莓派中的零号机做了K8s(K3s)的主节点,初号机做了Rancher的服务,所以就顺次把贰号机作为NFS服务节点了。

通过USB3.0接上硬盘之后,成功点亮,说明PoE供电还是很靠得住的
其实在翻出来这块SSD之前,在网上还看到了一个好东西

Geekworm的小板子
image.png
image.png
有支持 M.2 (NGFF)的,也有支持 mSATA的
最新的x872还支持M.2 (NVMe)

装好之后的整机效果是这样

image.png

轻薄透气,美观优雅上档次

但是最终还是忍住了没烧包

除了贫穷以外的其他原因主要是
1.性能过剩:NVMe M.2动辄3000MB/s的传输速度用在我们的树莓派集群里完全发挥不出来
2.传输瓶颈:我们的集群中存在的传输瓶颈主要是USB3.0接口(625MB/s)以及千兆网口(125MB/s),因此2.5寸的SSD实际上已经远远够用了 (其实还是因为没有钱)

格式化和分区

回到我们的旧硬盘这里

硬盘接上USB3.0之后,成功点亮

下面执行命令查看硬盘设备

fdisk -l

image.png
能看到上面的设备是树莓派的SD卡

下面这个Disk /dev/sda 就是我们的新硬盘了
接下来我们使用cfdisk工具给这块硬盘分个区(这里就分了一个区,毕竟能用就得了)

分区

 cfdisk /dev/sda

image.png
选择 NEW 然后 回车
image.png
输入分区大小之后 继续 回车
image.png
选择 primary 接着 回车
image.png
选择 Write 再次 回车
image.png
输入 yes 还得 回车
image.png
分区完成 选择 Quit 最后 回车 退出
下面给分好的区进行格式化

格式化

将硬盘 /dev/sda 的第一分区 /dev/sda1 格式化为Ext4格式
执行命令

mkfs -t ext4 /dev/sda1

中间输入一次 y
image.png
格式化完成

挂载硬盘

先在找个地方新建一个文件夹,用来挂载这块硬盘

mkdir /mnt/data/

然后将刚才硬盘分好的区(/dev/sda1)挂载到这个文件夹下

mount /dev/sda1 /mnt/data/

设置开机自动挂载硬盘

这里需要设置 /etc/fstab 下面的参数来给系统配置开机自动挂载硬盘
详细的 /etc/fstab 参数说明可以参考下面的文章
/etc/fstab 参数详解及如何设置开机自动挂载

我们先执行命令 查看当前硬盘挂载情况

blkid

image.png
可以看到刚才我们手动通过 mount 命令挂载好的硬盘

接下来进入 /etc/fstab 查看开机自动挂载的硬盘

vi /etc/fstab

image.png
能看到SD卡的两个区就是开机自动挂载状态

我们在下面加上 /dev/sda1 的挂载参数
/dev/sda1 /mnt/data ext4 defaults 0 0
image.png

:wq

保存之后,重启系统的时候就能看到效果了

reboot

等系统重启之后,再执行 blkid 来查看一下
image.png
可以看到 /dev/sda1 开机后已经自动挂载上了
image.png


坑坑坑

值得提一下,上面用的挂载方式是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

image.png

效果显著
这说明我们以上的工作是意义深远的,成果是喜人的

部署NFS服务

终于来到了这里
一切准备就绪,下面我们来正式开始部署NFS服务了

我们要做的是将树莓派集群中的贰号机(挂载了硬盘的这台),做成nfs的服务端
同时还要将另外三台主机,做成nfs的客户端

来到nfs服务端的这台机器上
同时下载安装两个软件包(客户端/服务端)
nfs-commonnfs-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)

image.png

:wq

保存退出
这样就把nfs的服务目录指定到这块硬盘上了

接下来可以重启(reboot)这台机器来启动nfs服务
当然也可以直接启动服务

sudo systemctl start nfs-server.service

但是通过重启可以完整检查一下硬盘自启动挂载之后nfs服务是否成功启动

启动完成后查看nfs服务状态

sudo systemctl status nfs-server.service

image-20210716233934648

nfs服务启动成功

继续使用showmount命令来查看一下nfs服务的节点
IP地址就是贰号机 (nfs的服务端)

showmount -e 192.168.31.83

image-20210716234001865
一切正常

此时,如果另外3台机器也已经启动了 nfs-common 客户端服务的话
客户端主机去执行上面的命令是可以看到一样的结果的
别忘了启动 nfs-common 服务

sudo systemctl start nfs-common.service

至此,树莓派集群中的NFS服务搭建完成


坑坑坑的回溯之一

最后这里我们在回头看一下前面提到的硬盘开机自动挂载那件事

如果当时的配置有问题,导致开机时nfs服务比硬盘挂载动作提前进行了
那么就会出现下面的错误,导致nfs服务启动失败
image-20210716234108090
就相当于硬盘没还插上,nfs服务就启动了,当然找不到路径
这个时候 restart 一下nfs服务,就又能成功启动了
是因为此时硬盘已经挂载上了

所以最终解决办法还是得老老实实用Linux的方式去做开机挂载


坑坑坑的回溯之二

在折腾nfs的过程中,出现了来来回回重复 start restart nfs-common.service 的情况
之后就冒出来了这个错误 Unit nfs-common.service is masked.
image-20210716234246793
(居然还能被玩儿坏了)

找了一些解决办法 比如unmask命令

systemctl unmask  nfs-common.service

然而并没有什么效果
image-20210716234325423

最后从Stack Overflow上面找到了一条
image-20210716234413072

于是来到 /lib/systemd/system/ 下面
找到 nfs-common.service 看到果然link到了/dev/null
image-20210716234446119

赶紧干掉

rm /lib/systemd/system/nfs-common.service

再重新daemon-reload

systemctl daemon-reload

再来启动 nfs-common.service
image-20210716234756547
一切正常了


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注