深入玩轉K8S之存儲資源管理

本篇我們來看下K8S中的存儲資源管理,說到K8S的存儲資源管理分爲幾個概念:Vloume、PV、PVC等,本篇我們主要側重於PV和PVC。

 

下面簡單說下幾個概念:

Volume 的生命週期獨立於容器,Pod 中的容器可能被銷燬和重建,但 Volume 會被保留。Kubernetes Volume 實際上就是一個目錄,這一點與 Docker Volume 類似。當 Volume 被 mount 到 Pod,Pod 中的所有容器都可以訪問這個 Volume。Kubernetes Volume 也支持多種 backend 類型,包括 emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等,完整列表可參考 https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

 

Volume 提供了非常好的數據持久化方案,不過在可管理性上還有不足。

拿前面 AWS EBS 的例子來說,要使用 Volume,Pod 必須事先知道如下信息:

1.     當前 Volume 來自 AWS EBS。

2.     EBS Volume 已經提前創建,並且知道確切的 volume-id。

 

Pod 通常是由應用的開發人員維護,而 Volume 則通常是由存儲系統的管理員維護。開發人員要獲得上面的信息:

1.     要麼詢問管理員。

2.     要麼自己就是管理員。

 

這樣就帶來一個管理上的問題:應用開發人員和系統管理員的職責耦合在一起了。如果系統規模較小或者對於開發環境這樣的情況還可以接受。但當集羣規模變大,特別是對於生成環境,考慮到效率和安全性,這就成了必須要解決的問題。


Kubernetes 給出的解決方案是 PersistentVolume 和 PersistentVolumeClaim。

 

PersistentVolume (PV) 是外部存儲系統中的一塊存儲空間,由管理員創建和維護。與 Volume 一樣,PV 具有持久性,生命週期獨立於 Pod。

PersistentVolumeClaim (PVC) 是對 PV 的申請 (Claim)。PVC 通常由普通用戶創建和維護。需要爲 Pod 分配存儲資源時,用戶可以創建一個 PVC,指明存儲資源的容量大小和訪問模式(比如只讀)等信息,Kubernetes 會查找並提供滿足條件的 PV。

 

有了 PersistentVolumeClaim,用戶只需要告訴 Kubernetes 需要什麼樣的存儲資源,而不必關心真正的空間從哪裏分配,如何訪問等底層細節信息。這些 Storage Provider 的底層信息交給管理員來處理,只有管理員才應該關心創建 PersistentVolume 的細節信息。

 

Kubernetes 支持多種類型的 PersistentVolume,比如 AWS EBS、Ceph、NFS 等,完整列表請參考 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes


下面我們用 NFS 來看下PersistentVolume 的使用方法。

 

首先在各個節點安裝nfs-utils以及rpcbind,不然後續會報錯。

yum install –y nfs-utils rpcbind

 

安裝完之後設置共享目錄以及權限。

vi /etc/exports
/mnt * (rw,no_root_squash,no_all_squash,sync)
 
systemctl restart nfs

systemctl restart rpcbind

完事之後重啓nfs和各節點的rpcbind服務,使用showmount –e來檢查是否成功。

 

下面創建一個 PV mypv1,配置文件 nfs-pv1.yml 如下:

博客01.png

kubectl apply -f nfs-pv1.yml

文件解釋:

① capacity 指定 PV 的容量爲 1G。

② accessModes 指定訪問模式爲 ReadWriteOnce,支持的訪問模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到單個節點。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多個節點。
ReadWriteMany – PV 能以 read-write 模式 mount 到多個節點。

③ persistentVolumeReclaimPolicy 指定當 PV 的回收策略爲 Recycle,支持的策略有:
Retain – 需要管理員手工回收。
Recycle – 清除 PV 中的數據,效果相當於執行 rm -rf /thevolume/*。
Delete – 刪除 Storage Provider 上的對應存儲資源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

④ storageClassName 指定 PV 的 class 爲 nfs。相當於爲 PV 設置了一個分類,PVC 可以指定 class 申請相應 class 的 PV。

指定 PV 在 NFS 服務器上對應的目錄。

 

接下來創建 PVC mypvc1,配置文件 nfs-pvc1.yml 如下:

博客02.png

kubectl apply -f nfs-pvc.yml

PVC 就很簡單了,只需要指定 PV 的容量,訪問模式和 class。

 

從 kubectl get pvc 和 kubectl get pv 的輸出可以看到 mypvc1 已經 Bound 到 mypv1,申請成功。

博客03.png

 

接下來就可以在 Pod 中使用存儲了,Pod 配置文件 pod1.yml 如下:

博客04.png

kubectl apply -f pod1.yml


博客05.png

 

下面來驗證下PV是否可用:

 

博客06.png

 

OK,到這裏本章就結束了,可以看到,在 Pod 中創建的文件 /mydata/devin 已經保存到了 NFS 服務器目錄 /mnt/k8s/pv1 中。


本文參考鏈接:

http://blog.51cto.com/goome/2133827

https://www.cnblogs.com/DaweiJ/articles/8618317.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章