使用 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
创建 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 地址做了域名映射。
可以使用 SwitchHosts 来做域名映射,如图:
到目前为止,就可以手动使用基于 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 以支持对象存储一文。
参考: