概念
PV 的全稱是:PersistentVolume(持久化卷),是對底層的共享存儲的一種抽象,PV 由管理員進行創建和配置,它和具體的底層的共享存儲技術的實現方式有關,比如 Ceph、GlusterFS、NFS 等,都是通過插件機制完成與共享存儲的對接。
PVC 的全稱是:PersistentVolumeClaim(持久化卷聲明),PVC 是用戶存儲的一種聲明,PVC 和 Pod 比較類似,Pod 消耗的是節點,PVC 消耗的是 PV 資源,Pod 可以請求 CPU 和內存,而 PVC 可以請求特定的存儲空間和訪問模式。對於真正使用存儲的用戶不需要關心底層的存儲實現細節,只需要直接使用 PVC 即可。
但是通過 PVC 請求到一定的存儲空間也很有可能不足以滿足應用對於存儲設備的各種需求,而且不同的應用程序對於存儲性能的要求可能也不盡相同,比如讀寫速度、並發性能等,為了解決這一問題,Kubernetes 又為我們引入了一個新的資源對象:StorageClass,通過 StorageClass 的定義,管理員可以將存儲資源定義為某種類型的資源,比如快速存儲、慢速存儲等,用戶根據 StorageClass 的描述就可以非常直觀的知道各種存儲資源的具體特性了,這樣就可以根據應用的特性去申請合適的存儲資源了。
NFS
我們這里為了演示方便,決定使用相對簡單的 NFS 這種存儲資源,接下來我們在節點10.151.30.57上來安裝 NFS 服務,數據目錄:/data/k8s/
關閉防火牆
1 $ systemctl stop firewalld.service 2 $ systemctl disable firewalld.service
安裝配置 nfs
1 $ yum -y install nfs-utils rpcbind
共享目錄設置權限:
1 $ chmod 755 /data/k8s/
配置 nfs,nfs 的默認配置文件在 /etc/exports 文件下,在該文件中添加下面的配置信息:
1 $ vi /etc/exports 2 /data/k8s *(rw,sync,no_root_squash)
配置說明:
/data/k8s:是共享的數據目錄
*:表示任何人都有權限連接,當然也可以是一個網段,一個 IP,也可以是域名
rw:讀寫的權限
sync:表示文件同時寫入硬盤和內存
no_root_squash:當登錄 NFS 主機使用共享目錄的使用者是 root 時,其權限將被轉換成為匿名使用者,通常它的 UID 與 GID,都會變成 nobody 身份
當然 nfs 的配置還有很多,感興趣的同學可以在網上去查找一下。
啟動服務 nfs 需要向 rpc 注冊,rpc 一旦重啟了,注冊的文件都會丟失,向他注冊的服務都需要重啟
注意啟動順序,先啟動 rpcbind
1 $ systemctl start rpcbind.service 2 $ systemctl enable rpcbind 3 $ systemctl status rpcbind
看到上面的 Started 證明啟動成功了。
然后啟動 nfs 服務:
1 $ systemctl start nfs.service 2 $ systemctl enable nfs 3 $ systemctl status nfs
同樣看到 Started 則證明 NFS Server 啟動成功了。
另外我們還可以通過下面的命令確認下:
1 $ rpcinfo -p|grep nfs 2 100003 3 tcp 2049 nfs 3 100003 4 tcp 2049 nfs 4 100227 3 tcp 2049 nfs_acl 5 100003 3 udp 2049 nfs 6 100003 4 udp 2049 nfs 7 100227 3 udp 2049 nfs_acl
查看具體目錄掛載權限:
1 $ cat /var/lib/nfs/etab 2 /data/k8s *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,no_root_squash,no_all_squash)
到這里我們就把 nfs server 給安裝成功了,接下來我們在節點10.151.30.62上來安裝 nfs 的客戶端來驗證下 nfs
安裝 nfs 當前也需要先關閉防火牆:
1 $ systemctl stop firewalld.service 2 $ systemctl disable firewalld.service
然后安裝 nfs
1 $ yum -y install nfs-utils rpcbind
安裝完成后,和上面的方法一樣,先啟動 rpc、然后啟動 nfs:
1 $ systemctl start rpcbind.service 2 $ systemctl enable rpcbind.service 3 $ systemctl start nfs.service 4 $ systemctl enable nfs.service
掛載數據目錄 客戶端啟動完成后,我們在客戶端來掛載下 nfs 測試下:
首先檢查下 nfs 是否有共享目錄:
1 $ showmount -e 10.151.30.57 2 Export list for 10.151.30.57: 3 /data/k8s *
然后我們在客戶端上新建目錄:
1 $ mkdir -p /root/course/kubeadm/data
將 nfs 共享目錄掛載到上面的目錄:
1 $ mount -t nfs 10.151.30.57:/data/k8s /root/course/kubeadm/data
掛載成功后,在客戶端上面的目錄中新建一個文件,然后我們觀察下 nfs 服務端的共享目錄下面是否也會出現該文件:
1 $ touch /root/course/kubeadm/data/test.txt
然后在 nfs 服務端查看:
1 $ ls -ls /data/k8s/ 2 3 total 4 4 5 4 -rw-r--r--. 1 root root 4 Jul 10 21:50 test.txt
如果上面出現了 test.txt 的文件,那么證明我們的 nfs 掛載成功了。
有了上面的 NFS 共享存儲,下面我們就可以來使用 PV 和 PVC 了。PV 作為存儲資源,主要包括存儲能力、訪問模式、存儲類型、回收策略等關鍵信息,下面我們來新建一個 PV 對象,使用 nfs 類型的后端存儲,1G 的存儲空間,訪問模式為 ReadWriteOnce,回收策略為 Recyle,對應的 YAML 文件如下:(pv1-demo.yaml)
1 apiVersion: v1 2 3 kind: PersistentVolume 4 5 metadata: 6 7 name: pv1 8 9 spec: 10 11 capacity: 12 13 storage: 1Gi 14 15 accessModes: 16 17 - ReadWriteOnce 18 19 persistentVolumeReclaimPolicy: Recycle 20 21 nfs: 22 23 path: /data/k8s 24 25 server: x.x.x.x
Kubernetes 支持的 PV 類型有很多,比如常見的 Ceph、GlusterFs、NFS,甚至 HostPath也可以,不過 HostPath 我們之前也說過僅僅可以用於單機測試,更多的支持類型可以前往 Kubernetes PV 官方文檔進行查看,因為每種存儲類型都有各自的特點,所以我們在使用的時候可以去查看相應的文檔來設置對應的參數。
然后同樣的,直接使用 kubectl 創建即可:
1 $ kubectl create -f pv1-demo.yaml 2 3 persistentvolume "pv1" created 4 5 $ kubectl get pv 6 7 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 8 9 pv1 1Gi RWO Recycle Available 12s
我們可以看到 pv1 已經創建成功了,狀態是 Available,表示 pv1 就緒,可以被 PVC 申請。我們來分別對上面的屬性進行一些解讀。
Capacity(存儲能力)
一般來說,一個 PV 對象都要指定一個存儲能力,通過 PV 的 capacity屬性來設置的,目前只支持存儲空間的設置,就是我們這里的 storage=1Gi,不過未來可能會加入 IOPS、吞吐量等指標的配置。
AccessModes(訪問模式)
AccessModes 是用來對 PV 進行訪問模式的設置,用於描述用戶應用對存儲資源的訪問權限,訪問權限包括下面幾種方式:
ReadWriteOnce(RWO):讀寫權限,但是只能被單個節點掛載
ReadOnlyMany(ROX):只讀權限,可以被多個節點掛載
ReadWriteMany(RWX):讀寫權限,可以被多個節點掛載
注意:一些 PV 可能支持多種訪問模式,但是在掛載的時候只能使用一種訪問模式,多種訪問模式是不會生效的。
persistentVolumeReclaimPolicy(回收策略)
我這里指定的 PV 的回收策略為 Recycle,目前 PV 支持的策略有三種:
Retain(保留)- 保留數據,需要管理員手工清理數據
Recycle(回收)- 清除 PV 中的數據,效果相當於執行 rm -rf /thevoluem/*
Delete(刪除)- 與 PV 相連的后端存儲完成 volume 的刪除操作,當然這常見於雲服務商的存儲服務,比如 ASW EBS。
不過需要注意的是,目前只有 NFS 和 HostPath 兩種類型支持回收策略。當然一般來說還是設置為 Retain 這種策略保險一點。
狀態
一個 PV 的生命周期中,可能會處於4中不同的階段:
Available(可用):表示可用狀態,還未被任何 PVC 綁定
Bound(已綁定):表示 PVC 已經被 PVC 綁定
Released(已釋放):PVC 被刪除,但是資源還未被集群重新聲明
Failed(失敗): 表示該 PV 的自動回收失敗
這就是 PV 的聲明方法,下節課我們來和大家一起學習下 PVC 的使用方法。