跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

category

  • 概述
  • 安装和配置NFS服务器
    • 设置新磁盘
    • 安装NFS服务器
    • 配置导出
    • 配置防火墙
    • 从容器测试装载
    • 权限和用户映射
  • 对静态内容使用NFS
  • 持久卷
     

在这篇文章中,我将了解如何在Ubuntu上设置一个简单的NFS服务器,并在Kubernetes集群上运行的nginx容器中使用它

NFS是一种允许通过网络共享文件和目录的文件系统协议。它已经存在很长时间了,出于许多目的,它已经被其他更现代的存储解决方案所取代,但它和使用它的组织仍有使用案例。

NFS的设置非常简单,您可以安装服务器,导出共享,然后离开。然而,似乎在权限方面有很多困难,我自己也遇到了一些问题,所以我想写一篇简短的文章,主要是供我自己参考。

让我们从服务器设置开始

如果您已经拥有NFS服务器,并且只想了解如何将NFS装载到容器,请跳到本节

安装和配置NFS服务器


我在这个设置中使用了一个新安装的Ubuntu 20.04服务器

服务器有两个(虚拟)磁盘,第一个用于安装操作系统,第二个用于nfs提供的数据。请注意,这是完全可选的

设置新磁盘


首先我会设置第二个磁盘

sudo fdisk -l
sudo gdisk /dev/sdb


按照默认设置设置新的主分区


创建分区

让我们列出分区,以验证我们的分区是否已创建

sudo fdisk -l

已创建新分区

现在我们将在分区上创建一个文件系统

sudo mkfs.ext4 /dev/sdb1

我们将在根目录上创建一个目录,将磁盘装载到该目录

sudo mkdir /nfs

为了使这种持久的重新启动,我们将编辑/etc/fstab文件以包括装载。首先,我们将使用blkid命令检索磁盘的UUID

sudo blkid


分区的UUID

sudo vi /etc/fstab


FSTab文件

现在,让我们最后将磁盘装载到装载点,并使用df命令进行验证

sudo mount -a 2

sudo df -h


装载磁盘并验证

安装NFS服务器


sudo apt-get update 2

sudo apt-get install nfs-kernel-server
 

配置导出


我们将在/etc/exports文件中将目录添加到服务器的导出中。有关不同选项的解释,请参阅本文


出口

现在我们需要告诉服务器导出目录

sudo exportfs -ar

我们可以验证目录是否已与-v参数共享

sudo exportfs -v


验证导出

在客户端上,我可以使用showmounts命令进行验证


显示从客户端装载

配置防火墙


如果防火墙处于活动状态,我们需要通知它允许NFS流量

sudo ufw allow from 192.168.2.0/24 to any port nfs

从容器测试装载


要测试从容器装载该目录,我们首先在该目录中创建一个文件。


在目录中创建的文本文件

现在,让我们尝试从容器/容器装载nfs共享。

我有一个TCE Kubernetes集群,我在这里已经写过了,我们使用nginx映像来部署一个带有装载nfs目录的容器的pod。请注意,我们在yaml规范中添加了一个卷和一个volumeMount

apiVersion: v1
kind: Pod
metadata:
 labels:
   run: nginx
 name: nginx
spec:
 containers:
 - image: nginx
   name: nginx
   volumeMounts:
   - name: nfs-vol
     mountPath: /var/nfs # The mountpoint inside the container
 volumes:
 - name: nfs-vol
   nfs:
     server: 192.168.200.90 # IP to our NFS server
     path: /nfs # The exported directory


YAML

在容器中装载目录

太好了,它起作用了!

权限和用户映射


NFS的一个重要注意事项是权限和用户映射,这给用户带来了问题。通常,NFS共享不会与root访问(root_squash)共享,并且需要访问该共享的用户需要存在于NFS服务器上。

有关详细信息,请参阅本NFS操作指南

对静态内容使用NFS


既然我们知道可以在容器中装载NFS共享,让我们看看是否可以使用它来承载静态html文件

默认情况下,nginx提供/usr/share/nginx/html目录中的文件,我们可以从运行的容器中验证这些文件


nginx默认

有了这些知识,让我们为NFS创建一个新的导出目录,向该目录添加一个静态html文件,并将该目录装载到容器内的目录中


NFS上的静态文件

使用装入点将pod重新创建到正确的目录


挂载目录到nginx默认html目录

正如我们所看到的,我们的容器看到了html文件,现在让我们试着看看是否也可以通过http让它工作。

首先,我们将公开我们的pod,以便我们可以从集群外部访问它,然后让我们在浏览器中打开它


将吊舱暴露在外部


NFS提供的HTML

如果我们在nfs服务器上编辑页面,让我们看看它是否会更新页面


已将内容添加到NFS服务器上的html文件

并刷新浏览器


刷新浏览器中的内容

持久卷


最后,让我们尝试将Persistent Volumes和Persistent Volume Claims引入到混合中,它们是用于处理文件和目录的Kubernetes对象。

我们将创建一个指向NFS共享的持久卷

apiVersion: v1
kind: PersistentVolume
metadata:
 name: nfs-www
spec:
 storageClassName: ""
 capacity:
   storage: 1Gi
 accessModes:
   - ReadWriteMany
 persistentVolumeReclaimPolicy:
 mountOptions:
   - hard
   - nfsvers=4.1
 nfs:
   path: /nfs/www
   server: 192.168.200.90
   readOnly: false


YAML

创建永久卷

我们将创建一个持久卷声明,以绑定到我们刚刚创建的PV

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: nfs-www-pvc
spec:
 storageClassName: ""
 volumeName: nfs-www
 accessModes:
   - ReadWriteMany
 volumeMode: Filesystem
 resources:
   requests:
     storage: 1G

YAML

创建永久卷声明


验证PV和PVC

现在,让我们把Pod改为使用PVC

apiVersion: v1
kind: Pod
metadata:
 labels:
   run: nginx
 name: nginx
spec:
 containers:
 - image: nginx
   name: nginx
   ports:
   - containerPort: 80
   volumeMounts:
   - name: nfs-vol
     mountPath: /usr/share/nginx/html
 volumes:
 - name: nfs-vol
   persistentVolumeClaim:
     claimName: nfs-www-pvc


YAML

编辑吊舱规格以使用PVC

正如我们所看到的,我们唯一需要更改的是volumes部分,并将nfs节替换为这个persistentVolumeClaim节

有了这个,我们可以根据需要重用pod规范,例如,如果我们有多个具有不同NFS服务器的环境。然后唯一要更改的是指向NFS服务器的PV

本文地址
最后修改
星期三, June 5, 2024 - 21:44
Article