kubernetes實現數據卷的方式是PV & PVC
PV有很多持久卷插件可以實現,例如:GCEPersistentDisk
,AWSElasticBlockStore
,NFS
,ISCSI
,RDB
,Glusterfs
,HostPath(單節點測試使用)
,本地持久卷
我們本次使用NFS
方式,先介紹一下NFS。
NFS卷能將 NFS (網絡文件系統) 掛載到您的 Pod 中。 不像 emptyDir 那樣會在刪除 Pod 的同時也會被刪除,nfs 卷的內容在刪除 Pod 時會被保存,卷只是被卸載掉了。 這意味着 nfs 卷可以被預先填充數據,並且這些數據可以在 Pod 之間”傳遞”。
NFS 是Network File System 的縮寫,即網絡文件系統,NFS是FreeBSD支持的文件系統中的一種。NFS基於RPC遠程掉用實現,其允許一個系統在網絡上與他人共享目錄和文件,通過使用NFS,程序可以像使用本地文件一樣使用遠端系統上的文件。NFS是一個非常穩定的, 可移植的網絡文件系統,具備可擴展和高性能特性,達到了企業級應用質量標準。由於網絡速度的增加延時降低,NFS一直是通過網絡系統提供文件系統服務的有競爭力選擇
NFS原理
NFS的工作原理是使用客戶端/服務器架構,由一個客戶端程序和服務器程序組成。 從客戶端的角度來說,NFS 中的第一個操作稱爲 mount。Mount 代表將遠程文件系統加載到本地文件系統空間中。該流程以對 mount(Linux 系統調用)的調用開始,它通過 VFS 路由到 NFS 組件。確認了加載端口號之後(通過 get_port 請求對遠程服務器 RPC 調用),客戶端執行 RPC mount 請求。這一請求發生在客戶端和負責 mount 協議(rpc.mountd)的特定守護進程之間。這一守護進程基於服務器當前導出文件系統來檢查客戶端請求;如果所請求的文件系統存在,並且客戶端已經訪問了,一個 RPC mount 響應爲文件系統建立了文件句柄。客戶端這邊存儲具有本地加載點的遠程加載信息,並建立執行 I/O 請求的能力。這一協議表示一個潛在的安全問題;因此,NFSv4 用內部 RPC 調用替換這一輔助 mount 協議,來管理加載點
由於VFS的存在,客戶端可以像使用其他普通文件系統一樣使用NFS文件系統
安裝NFS服務端
-
安裝NFS服務端
# ubuntu apt-get install -y nfs-kernel-server # centos yum -y install nfs-utils rpcbind
-
創建共享文件目錄,並給目錄添加讀寫權限
mkdir -p /kubernetes/volumes chmod a+rw /kubernetes/volumes
-
配置NFS服務目錄-打開文件
/etc/exports
在尾部添加內容/kubernetes/volumes *(rw,sync,no_subtree_check,no_root_squash)
-
配置生效
exportfs -r
-
啓動rpcbind、nfs服務
systemctl start rpcbind systemctl start nfs
-
在 server 端先自我測試一下是否可以聯機,展示出連接目錄
showmount -e localhost
命令解釋
配置項 含義 * 任何ip都可以訪問 rw 讀寫權限 sync 同步權限 no_subtree_check 如果輸出目錄是一個子目錄,NFS服務器不檢查其父目錄的權限 no_root_squash 客戶端連接服務端如果使用的也是root,那麼也擁有對服務端分享目錄的root權限
安裝NFS客戶端
我們找一個新的機器進行測試
-
安裝客戶端
yum -y install nfs-utils
-
掛載
# 創建掛載目錄 mkdir /testnfs # 掛載服務端 mount -t nfs 10.10.103.80:/kubernetes/volumes /testnfs # 查看掛載結果 df -h
掛載之後,我們在客戶端的
/testnfs
文件夾下創建文件,會發現服務端的/kubernetes/volumes
文件夾下的文件創建成功了。 -
取消掛載(非必須)
# 取消掛載命令 umount /testnfs
kubernetes 中使用數據卷
PV(Persistent Volume)是集羣中的一塊網絡存儲,和node一樣也是集羣的資源,PV和Volume類似,不過會有獨立與Pod的生命週期,這一API對象包含了存儲的實現細節,例如NFS,ISCSI或者其他雲服務商提供的存儲系統,PVC(Persistent Volume Claim)是用戶的一個請求,跟pod類似,pod消費node資源,PVC消費PV資源。Pod能夠申請特定的資源(CPU和內存),PVC能夠請求特定的尺寸和訪問模式(例如加載一個讀寫,以及多個只讀實例)
PV 與PVC
PV是集羣的資源。PVC對這一資源的請求,也是對資源的所有權檢驗,PV和PVC之間的互動遵循如下的生命週期:
供應: 集羣管理員會創建一系列的PV,這些PV包含了爲集羣用戶提供的真是存儲資源,他們可利用kubernetes API 來消費。
綁定: 用戶創建一個包含了容量可訪問模式的持久卷申請,master會監聽PVC的產生,並嘗試根據請求內容查找匹配的PV,並把PV和PVC綁定,用戶能夠獲取滿足需要的資源, 並且在使用過程中可能超出請求數量,如果找不到合適的卷,這一申請就會持續處於綁定狀態,一直到出現合適的PV,例如一個集羣準備了很多的40G的持久卷,也無法響應41G的申請,除非把超過41G的PV加入集羣
使用: pod把申請作爲捲來使用。集羣會通過PVC查找綁定的PV,並Mount給pod,對於支持多種訪問方式的卷,用戶在使用PVC作爲卷的時候可以指定需要的訪問方式,一旦用戶擁有了一個已經綁定的PVC,被綁定的PV就歸該用戶所有了,用戶的pod能夠在pod的卷中包含PVC來訪問他們佔有的PV
釋放: 當用戶完成對卷的使用是,就可以利用API刪除對應的PVC對象了。 而且他還可以重新申請,刪除PVC後,對應的卷被視爲“被釋放”,但是這時還不能給其他的PVC使用,之前的PVC數據還保存在卷中,要根據策略來進行後續處理。
回收策略: PV的回收策略向集羣闡述了在PVC釋放卷的時候應如何進行後續工作,目前可以採用三種策略:Retain、Recycle、Delete
- Retain:保留策略允許重新申請這一資源。
- Recycle:基礎擦除(rm -rf /thevolume/*)
- Delete:同時刪除持久卷以及卷中存儲的內容。如果插件支持。
創建PV
創建一個nfs-pv-logs.yml的配置文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-logs
spec:
# 設置容量
capacity:
storage: 5Gi
volumeMode: Filesystem
# 訪問模式
accessModes:
# ReadWriteOnce:單節點加載讀寫
# ReadWriteMany:多節點加載讀寫
- ReadWriteMany
# 回收策略,這裏是人工重新申請
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
# NFS服務端配置的路徑
path: /kubernetes/volumes
# NFS服務端ip
server: 10.10.103.80
readOnly: false
創建之前在所有的node節點上安裝nfs客戶端
創建PVC
創建文件nfs-pvc-logs-login.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc-log-all
spec:
accessModes:
# 要和PV一致的訪問模式,
- ReadWriteMany
# 按需分配資源
resources:
requests:
storage: 1Gi
參考文檔
kubernetes 官網-volumes
kubernetes 官網-persistent-volumes
github中的示例
百度詞條