helm部署nfs provisioner
- github release: nfs-subdir-external-provisioner - GitHub
- artifacthub: nfs-subdir-external-provisioner - ArtifactHub
NFS 服务器部署
- 安装 NFS 服务端软件包
yum install nfs-utils -y
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
- 创建共享数据目录
#给nfs-provisioner配置空间
mkdir /data/nfs_pro -p
echo "/data/nfs_pro *(rw,no_root_squash)" >> /etc/exports
# 注:这里如果配置可访问的网段,要写宿主机网段而非pod网段,因为pv本质是挂载到宿主机上再挂载到pod上。
exportfs -arv
客户端挂载测试
找一台额外的机器作为客户端验证测试
- 创建测试挂载点
mkdir /mnt/nfs
- 安装 NFS 软件包(一定要安装,否则无法识别 nfs 类型的存储)
yum install nfs-utils -y
- 挂载 NFS 共享目录
mount -t nfs 192.168.40.180:/data/nfs_pro /mnt/nfs/
- 增删改查测试
# 创建测试目录、创建测试文件、测试文件写入内容、查看写入目录和文件权限、删除目录和文件
cd /mnt/nfs/
mkdir nfs-test
touch nfs-test.txt
echo "nfs-test" > nfs-test.txt
ll
total 4
drwxr-xr-x 2 nfsnobody nfsnobody 6 Nov 29 16:56 nfs-test
-rw-r--r-- 1 nfsnobody nfsnobody 9 Nov 29 16:56 nfs-test.txt
rmdir nfs-test
rm nfs-test.txt
安装NFS Provisioner
-
想要 Kubernetes 支持 NFS 存储,我们需要安装 nfs-subdir-external-provisioner ,它是一个存储资源自动调配器,它可将现有的 NFS 服务器通过持久卷声明来支持 Kubernetes 持久卷的动态分配。该组件是对 Kubernetes NFS-Client Provisioner 的扩展, nfs-client-provisioner 已经不提供更新,而且 Github 仓库 也已经处于归档状态,已经迁移到 nfs-subdir-external-provisioner 的仓库。
-
官方提供的安装方式有三种:
-
使用 Helm 的方式比较简单,也是现在官方推荐的、使用率最高的方式,本文仅实战演示 Helm 部署方式,其他方式请参考官方文档。
-
集群节点安装 NFS Client
所有 Kubernetes 集群节点需要提前安装 nfs-utils,否则在部署过程中会报错.
yum install nfs-utils
- 添加 Helm 源
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
- 创建 NameSpace(可选配置,主要是方便资源管理。)
kubectl create ns nfs-system
Option1:命令行快速安装NFS Provisioner
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set storageClass.name=nfs-sc --set nfs.server=192.168.40.180 --set nfs.path=/data/k8s -n nfs-system
参数说明
--set storageClass.name=nfs-sc:指定 storageClass 的名字--set nfs.server=192.168.40.180:指定 NFS 服务器的地址--set nfs.path=/data/k8s:指定 NFS 导出的共享数据目录--set storageClass.defaultClass=true:指定为默认的 sc,本示例没使用-n nfs-system:指定命名空间
Option2:自定义values安装 NFS Provisioner
有更多定制化需求时可以选择自定义 values.yaml 的方式进行安装,实际使用中与命令行安装 NFS Subdir External Provisioner 的方式二选一即可。
# 下载解压Charts
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm repo update nfs-subdir-external-provisioner
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --version 4.0.18
tar xvf nfs-subdir-external-provisioner-4.0.18.tgz
- 根据实际情况修改
nfs-subdir-external-provisioner/values.yaml
replicaCount: 1
nfs:
server: 192.168.40.180
path: /data/nfs_pro/
storageClass:
create: true
defaultClass: falsep
name: sc-nfs
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
- 安装 NFS Subdir External Provisioner
helm upgrade -i nfs-subdir-external-provisioner -n nfs-system . -f values.yaml -f values.dev.yaml --create-namespace
验证pod挂载
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-nfs-pvc
spec:
storageClassName: nfs-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
kind: Pod
apiVersion: v1
metadata:
name: test-nfs-pod
spec:
containers:
- name: test-nfs-pod
image: busybox:stable
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && sleep 3600"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-nfs-pvc
- 进入pod查看挂载情况
kubectl exec test-nfs-pod -n nfs-system -- df -h
NFS存储注意事项
- 在输出结果中我们可以看到挂载的 NFS 存储的可用空间是大于PVC中分配的 1G。
- 实际测试写入2G 的数据量,已经超过了我们创建的 PVC 1G 的限制。因此,要特别注意,使用 NFS 存储时无法限制存储使用量。
- PV 名称格式是 pv+随机字符串,所以,每次只要不删除 PVC,那么 Kubernetes 中 PV 与存储绑定将不会丢失,要是删除 PVC 也就意味着删除了绑定的文件夹,下次就算重新创建相同名称的 PVC,生成的文件夹名称也不会一致,因为 PV 名是随机生成的字符串,而文件夹命名又跟 PV 有关,所以删除 PVC 需谨慎。
- Kubernetes 删除 PVC 后,在 NFS 存储层并没有立即删除 PVC 对应的数据目录及已有数据,而是将原来的数据目录改名为 archived-+原有数据目录名称的形式。