使用 NFS 作为容器存储插件

对于一个玩具来说,NFS 是一个非常好的选择。

安装 NFS 服务器

作者把该服务器安装在 master 节点。

通过 ssh 连接上我们的 k8s-master

安装 NFS 内核服务

首先,我们将在 Ubuntu 上安装 NFS 内核服务器包,这实际上会将其变成 NFS 服务器。但首先,让我们更新软件包列表,如图所示。

sudo apt update

之后,运行以下命令来安装 NFS 内核服务器包。

sudo apt install nfs-kernel-server

您可以验证 nfs-server 服务是否正在运行,如图所示

sudo systemctl status nfs-server

README-2023-06-05-15-11-16

创建 NFS 共享目录

创建 /mnt/nfs 文件目录,用于共享

sudo mkdir -p /mnt/nfs

由于我们希望所有客户端都可以访问所有文件,因此我们将分配以下目录所有权和权限。

sudo chown nobody:nogroup /mnt/nfs
sudo chmod -R 777 /mnt/nfs

这些权限是递归的,将应用于您将创建的所有文件和子目录。

设置访问权限

创建 NFS 目录共享并分配所需的权限和所有权后,我们需要允许客户端系统访问 NFS 服务器。我们将通过编辑在安装 nfs-kernel-server 软件包期间创建的 /etc/exports 文件来实现这一点。

因此,打开 /etc/exports 文件。

sudo vim /etc/exports

设置运行访问的 IP 范围, * 表示允许任意 ip 访问。

/mnt/nfs 192.168.32.0/24(rw,sync,no_root_squash,no_subtree_check)

导出共享目录

要导出目录并使其可用,请调用以下命令:

sudo exportfs -a

为了确定导出列表,您可以使用以下命令显示导出列表:

sudo exportfs -s
# /mnt/nfs  192.168.32.0/24(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

配置防火墙规则

如果您位于 UFW 防火墙后面,则需要使用所示语法允许 NFS 流量通过防火墙。

查看防火墙状态

sudo ufw status
# Status: inactive

提示防火墙未激活,很好,否则,我们需要添加如下规则

sudo ufw allow from 192.168.32.0/24 to any port nfs

安装 NFS 客户端

为了让所有的 Worker 节点都可以使用 NFS 服务器,我们需要在每个 Worker 节点上安装 NFS 客户端。

现在登录到 Worker 节点更新包索引并安装 nfs-common

sudo apt update
sudo apt install nfs-common

域名映射

为了方便使用,作者将 NFS 服务器的 IP 地址做了域名映射。

可以使用 SwitchHostsopen in new window 来做域名映射,如图:

README-2022-06-22-18-30-27

到目前为止,就可以手动使用基于 NFS 的 PV 对象了。

使用示例可以参考 部署 GitLab 并支持基于 22 端口的 SSH

安装 NFS Subdir External Provisioner

NFS Subdir External Provisioner 是一个 Kubernetes 的动态存储卷插件,它可以在 NFS 服务器上自动创建 PV 对象。

作者使用 Helm 来安装 NFS Subdir External Provisioner。

添加 Helm 仓库

添加 NFS Subdir External Provisioner 到 Helm Chart

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm repo update

生成配置文件

获取默认的 values 配置文件

helm show values nfs-subdir-external-provisioner/nfs-subdir-external-provisioner > values.yaml

修改 values.yaml 文件,配置 NFS 服务器 IP 地址和共享目录

nfs:
  server: nfs.todoit.tech
  path: /mnt/nfs
  mountOptions:
  volumeName: nfs-subdir-external-provisioner-root
  # Reclaim policy for the main nfs volume
  reclaimPolicy: Retain

部署

运行如下命令,可以看到最终生成的部署文件

helm install -f values.yaml nfs nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --dry-run

如果没有问题,则运行如下命令进行正式部署

# 先创建名称空间
kubectl create ns nfs-provisioner

helm install -f values.yaml nfs nfs-subdir-external-provisioner/nfs-subdir-external-provisioner -n nfs-provisioner

等待部署成功

kubectl get pods -n nfs-provisioner -w
# NAME                                                   READY   STATUS              RESTARTS   AGE
# nfs-nfs-subdir-external-provisioner-74d67dc47b-ttgdj   0/1     ContainerCreating   0          4s
# nfs-nfs-subdir-external-provisioner-74d67dc47b-ttgdj   1/1     Running             0          36s

默认情况下,NFS Subdir External Provisioner 会创建一个名为 nfs-client 的 StorageClass,可以通过如下命令查看

kubectl get sc
# NAME         PROVISIONER                                         RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
# nfs-client   cluster.local/nfs-nfs-subdir-external-provisioner   Delete          Immediate           true                   53s

关于如何使用 NFS 动态存储卷,可以参考部署 MinIO 以支持对象存储一文。


参考:

上次更新: