PV 用來定義持久化存儲卷,可將外部存儲如 NFS/GFS/CFS 等定義爲一個 K8S 內部對象,是一個服務提供者。html
PVC 會尋找合適的 PV 進行綁定,綁定成功後,PVC 就能夠提供給 pod 使用。node
定義一個 PVlinux
[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"
定義一個 PVCnginx
[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 上。web
若是沒有符合條件的 PV,PVC 會處於 pending 狀態。K8S 的一個名叫 PersistentVolumeController 的控制器會不斷檢查是否有 pending 的 PVC,以及是否有符合條件的 PV 出現,一旦有符合條件的 PV 出現,即將 pending 中的 PVC 與 PV 綁定,而後 PVC 狀態變爲 Bound。後端
建立 Podapi
[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 文件spa
kubectl exec -it mypod -- touch /usr/share/nginx/html/index.html
在遠程 NFS 上能夠看到新建的文件code
[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