目錄
- 1、NFS介紹
- 2、NFS服務部署
- 2.1安裝nfs服務 (服務端配置)
- 2.2啟動NFS服務
- 2.3 服務檢查
- 2.4 客戶端配置
- 3、nfs作為存儲卷使用
- 3.1 nfs作為volume
- 3.2 nfs存儲的缺點
- 3.3 nfs作為PersistentVolum
- 4、nfs作為動態存儲提供
- 5、總結
1、NFS介紹
NFS(Network File System)是一種分布式文件系統協議,允許客戶端遠程訪問服務器上的文件,實現數據共享。它整合多個存儲設備為統一文件系統,方便數據存儲和管理,支持負載均衡和故障轉移,確保服務高可用和可擴展。但需注意,NFS依賴網絡環境,網絡狀況影響其性能,且配置管理需技術經驗。
nfs端口:2049
RPC端口:111w
nfs原理
工作原理主要基于客戶端-服務器架構。在NFS環境中,服務器端運行NFS服務,將本地文件系統中的文件共享給網絡上的其他計算機。客戶端通過掛載遠程NFS共享,可以像訪問本地文件系統一樣訪問這些共享文件。
NFS 使用RPC(Remote Procedure Call)的機制進行實現,RPC使得客戶端可以調用服務端的函數。同時,由于有 VFS 的存在,客戶端可以像使用其它普通文件系統一樣使用 NFS 文件系統。經由操作系統的內核,將 NFS 文件系統的調用請求通過 TCP/IP 發送至服務端的 NFS 服務。NFS服務器執行相關的操作,并將操作結果返回給客戶端。
1.首先服務器端啟動RPC服務,并開啟111端口
2.服務器端啟動NFS服務,并向RPC注冊端口信息
3.客戶端啟動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4.服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5.客戶端通過獲取的NFS端口來建立和服務端的NFS連接并進行數據的傳輸。
NFS服務主要進程包括:
- rpc.nfsd:最主要的NFS進程,管理客戶端是否可登錄
- rpc.mountd:掛載和卸載NFS文件系統,包括權限管理
- rpc.lockd:非必要,管理文件鎖,避免同時寫出錯
- rpc.statd:非必要,檢查文件一致性,可修復文件
nfs的關鍵工具包括:
- 主要配置文件:/etc/exports;
- NFS文件系統維護命令:/usr/bin/exportfs;
- 共享資源的日志文件: /var/lib/nfs/*tab;
- 客戶端查詢共享資源命令: /usr/sbin/showmount;
- 端口配置: /etc/sysconfig/nfs。
2、NFS服務部署
在NFS服務器端的主要配置文件為/etc/exports時,通過此配置文件可以設置共享文件目錄。每條配置記錄由NFS共享目錄、NFS客戶端地址和參數這3部分組成,格式如下:
[NFS共享目錄] [NFS客戶端地址1(參數1,參數2,參數3……)]
NFS共享目錄:服務器上共享出去的文件目錄;
NFS客戶端地址:允許其訪問的NFS服務器的客戶端地址,可以是客戶端IP地址,也可以是一個網段(192.168.64.0/24);
訪問參數:括號中逗號分隔項,主要是一些權限選項。
訪問權限參數
選項 | 描述 |
---|---|
ro | 客戶端對于共享文件目錄為只讀權限。(默認設置) |
rw | 客戶端對共享文件目錄具有讀寫權限。 |
Kubernetes的NFS存儲用于將某事先存在的NFS服務器導出export的存儲空間掛載到Pod中來供Pod容器使用。與emptyDir不同的是,NFS存儲在Pod對象終止后僅是被卸載而非刪除。另外,NFS是文件系統及共享服務,它支持同時存在多路掛載請求。定義NFS存儲時,常用到以下字段。
2.1安裝nfs服務 (服務端配置)
#ubuntu部署
sudo apt install nfs-kernel-server#centos部署
yum -y install rpcbind nfs-util#創建要共享的目錄
mkdir /data/redis -p #/data/redis:NFS服務要共享的目錄#編輯NFS配置并加入以下內容
vim /etc/exports #NFS的配置文件,默認文件內容為空(無任何共享)
/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check,no_root_squash)
#載入配置
exportfs -rv
/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check,no_root_squash)
/data/redis 192.168.31.0/24(rw,no_root_squash) #兩者效果一樣
#設置/redis為共享目錄,允許192.168.31.0/24網段的IP地址主機訪問,也可以寫 * ,表示所有地址都可以訪問NFS服務
#rw:訪問到此目錄的服務器都具備讀寫權限
#sync:數據同步寫入內存和硬盤 默認同步,可不寫入
#no_all_squash:所有用戶對根目錄具備完全管理訪問權限 默認禁用all_squash,可不寫入
#no_subtree_check:不檢查父目錄的權限 默認禁用subtree_check,可不寫入
#root_squash選項會將這個root用戶映射成一個非特權用戶,此處禁用 no_root_squash
2.2啟動NFS服務
#ubuntu啟動
systemctl start nfs-kernel-server#centos啟動
systemctl start rpcbind //一定要先開啟rpcbind服務
systemctl start nfs //如服務已啟動,更改完配置信息后需要重啟服務
設置開機自啟
systemctl enable rpcbindsystemctl enable nfs-server
2.3 服務檢查
showmount -e localhost
exportfs -v
可以看到redis共享目錄信息
2.4 客戶端配置
1.1.檢查并安裝軟件
rpm -q rpcbind nfs-utils
yum install -y rpcbind nfs-utils
systemctl start rpcbind && systemctl start nfs
systemctl enable rpcbind && systemctl enable nfs-server
2.將共享目錄掛載到本地
mount -t nfs 服務端地址:/共享目錄 /mnt
showmount -e 服務端地址
2.5 服務測試
在服務端共享目錄創建文件,在客戶端掛載目錄可以看到
cd /data/redis
echo "hello world" >>hello.txt
cd /mnt/ && cat hello.txt
注:也可以客戶端寫入,服務端查看 (客戶端需要有權限)
3、nfs作為存儲卷使用
3.1 nfs作為volume
nfs可以直接作為存儲卷使用
下面是一個redis部署的YAML配置文件。在此示例中,redis在容器中的持久化數據保存在/data目錄下;存儲卷使用nfs,nfs的服務地址為:192.168.8.150,存儲路徑為:/k8s-nfs/redis/data。容器通過volumeMounts.name的值確定所使用的存儲卷。
vi redis.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:name: redis
spec:selector:matchLabels:app: redisrevisionHistoryLimit: 2template:metadata:labels:app: redisspec:containers:# 應用的鏡像- image: redisname: redisimagePullPolicy: IfNotPresent# 應用的內部端口ports:- containerPort: 6379name: redis6379env:- name: ALLOW_EMPTY_PASSWORDvalue: "yes"- name: REDIS_PASSWORDvalue: "redis" # 持久化掛接位置,在docker中 volumeMounts:- name: redis-persistent-storagemountPath: /datavolumes:# 宿主機上的目錄- name: redis-persistent-storagenfs:path: /data/redisserver: 192.168.200/30
kubectl apply -f redis.yaml
3.2 nfs存儲的缺點
基于上述過程可以發現用戶在使用nfs或者其他類似的存儲時,要求較高:
1、需要了解底層存儲用的是什么
2、需要存儲服務器的地址,以及因此帶來的安全問題
3、在存儲服務器創建相應的存儲目錄
因此,為了能夠屏蔽底層存儲實現的細節,方便用戶使用, kubernetes引入PV和PVC兩種資源對象。
3.3 nfs作為PersistentVolum
在Kubernetes當前版本的中,可以創建類型為nfs的持久化存儲卷,用于為PersistentVolumClaim提供存儲卷。在下面的PersistenVolume YAML配置文件中,定義了一個名為nfs-pv的持久化存儲卷,此存儲卷提供了5G的存儲空間,只能由一個PersistentVolumClaim進行可讀可寫操作。此持久化存儲卷使用的nfs服務器地址為192.168.5.150,存儲的路徑為/tmp。
vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata: name: nfs-pv
spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1# 此持久化存儲卷使用nfs插件 nfs:# nfs共享目錄為/data/redis path: /data/redis# nfs服務器的地址server: 192.168.200.30
通過執行如下的命令可以創建上述持久化存儲卷:
kubectl create -f nfs-pv.yaml
存儲卷創建成功后將處于可用狀態,等待PersistentVolumClaim使用。PersistentVolumClaim會通過訪問模式和存儲空間自動選擇合適存儲卷,并與其進行綁定。
4、nfs作為動態存儲提供
部署nfs-provisioner 實現PV 動態供給(StorageClass)直通車
5、總結
1.NFS服務多用于局域網內
2.共享目錄權限要適應實際生產環境
3.搭建服務時一定要先啟動rpc后啟動nfs
4.配置文件中的信息格式一定要對,否則報錯
參考資料
1.《Persistent Volumes》地址:https://kubernetes.io/docs/concepts/storage/persistent-volumes/
2.《Storage Classes》地址:https://kubernetes.io/docs/concepts/storage/storage-classes/
3.《Dynamic Volume Provisioning》地址:https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/
4.《Volums》地址:
https://kubernetes.io/docs/concepts/storage/volumes/
5.《nfs》地址:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs