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
- 登录 发表评论
- 5 次浏览
Tags
最新内容
- 1 day 5 hours ago
- 1 day 7 hours ago
- 1 day 8 hours ago
- 3 days 23 hours ago
- 4 days 7 hours ago
- 4 days 7 hours ago
- 4 days 8 hours ago
- 4 days 8 hours ago
- 1 week 1 day ago
- 1 week 1 day ago