K8S實戰(十六)| 持久化存儲卷


前言

PV 用來定義持久化存儲卷,可將外部存儲如 NFS/GFS/CFS 等定義為一個 K8S 內部對象,是一個服務提供者。

PVC 會尋找合適的 PV 進行綁定,綁定成功后,PVC 就可以提供給 pod 使用。

更新歷史

定義 PV/PVC

定義一個 PV

[root@master01 ~]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
 name: nfs1-pv
spec:
 storageClassName: manual
 capacity:
   storage: 1Gi
 accessModes: 
   - ReadWriteMany
 nfs:
   server: 192.168.10.17
   path: "/data/nfs"

定義一個 PVC

[root@master01 ~]# cat pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: nfs1-pvc
spec:
 accessModes:
   - ReadWriteMany
 storageClassName: manual
 resources:
   requests:
     storage: 1Gi
# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM              STORAGECLASS   REASON   AGE
nfs1-pv   1Gi        RWX            Retain           Released   default/nfs1-pvc   manual                  118s
# kubectl get pvc
NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs1-pvc   Pending                                      manual         14s

PVC 會查找 storageClassName 名稱一致的 PV,然后在這些 PV 中查找滿足 spec.resources.requests.storage 條件的 PV,找到后就綁定 PVC 到該 PV 上。

如果沒有符合條件的 PV,PVC 會處於 pending 狀態。K8S 的一個名叫 PersistentVolumeController 的控制器會不斷檢查是否有 pending 的 PVC,以及是否有符合條件的 PV 出現,一旦有符合條件的 PV 出現,即將 pending 中的 PVC 與 PV 綁定,然后 PVC 狀態變為 Bound。

Pod 中使用 PVC/PV

創建 Pod

[root@master01 ~]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: web
      image: nginx
      volumeMounts:
        - name: nfs
          mountPath: "/usr/share/nginx/html"
  volumes:
    - name: nfs
      persistentVolumeClaim:
        claimName: nfs1-pvc

spec.volumes.persistentVolumeClaim 指定了卷使用哪個 PVC
spec.containers.volumeMounts 指定了掛載哪個卷(name)到容器哪個目錄(mountPath)中

在容器掛載目錄中寫入一個 index.html 文件

kubectl exec -it mypod -- touch /usr/share/nginx/html/index.html

在遠程 NFS 上可以看到新建的文件

[root@work03 ~]# ls /data/nfs/
index.html

說明掛載成功了。

在 Pod 運行的 node,即 work01 上

# df -h | grep nfs
192.168.10.107:/data/nfs   15G  6.7G  6.8G  50% /var/lib/kubelet/pods/6adcbab7-63cd-4c4e-8db7-7234b9b49999/volumes/kubernetes.io~nfs/nfs1-pv

運行 df 可以看到,K8S 把 NFS 目錄 mount 到了宿主機的 /var/lib/kubelet/pods/{pod id}/volumes/kubernetes.io~nfs/{PV名稱} ,這個本地目錄中,然后在容器中掛載該目錄。

結束語

PVC 不關心后端存儲提供者是 NFS 還是 GFS,具體使用哪種類型的存儲由 PV 來定義,PVC 只和隱藏了存儲實現細節的 PV 對接。

本方式為靜態分配,如果有一千個 Pod,每個 Pod 有一個 PVC,那么管理員需要人工開設一千個 PV,隨着集群規模的擴大,將導致無法有效管理。

K8S 提供了一種可以動態分配的工作機制,可以自動創建 PV,該機制依賴一個叫做 StorageClass 的 API 對象。

聯系我

微信公眾號:zuolinux_com

微信掃碼關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM