K8S引入了一組叫做Persistent Volume Claim(PVC)和Persistent Volume(PV)的API對象,大大下降了用戶聲明和使用持久化Volume的門檻。
在Pod的Volumes中,只要聲明類型是persistentVolumeClaim,指定PVC的名字,當建立這個PVC對象,k8s就自動爲它綁定一個符合條件的Volume,這個Volume,從PV來html
PVC和PV的設計,相似「接口」和「實現」的思想,開發者只知道使用「接口」PVC,運維人員負責給「接口」綁定具體的實現PV,說白了PVC就是一種特殊的Volumenode
PVC和PV的實現原理
PVC:描述 Pod想要使用的持久化屬性,好比存儲大小、讀寫權限等
PV:描述一個具體的Volume屬性,好比Volume的類型、掛載目錄、遠程存儲服務器地址等
StorageClass:充當PV的模板,自動爲PVC建立PV
nginx
大多數狀況,持久化Volume的實現,依賴於遠程存儲服務,如遠程文件存儲(NFS、GlusterFS)、遠程塊存儲(公有云提供的遠程磁盤)等。
K8s須要使用這些存儲服務,來爲容器準備一個持久化的宿主機目錄,以供之後掛載使用,建立這個目錄分爲兩階段:ubuntu
由Volume Controller負責維護,不斷地檢查 每一個Pod對應的PV和所在的宿主機的掛載狀況。能夠理解爲建立了一塊NFS磁盤,至關於執行api
gcloud compute instances attach-disk < 虛擬機名字 > --disk < 遠程磁盤名字 >
爲了使用這塊磁盤,還須要掛載操做服務器
將遠程磁盤掛載到宿主機上,發生在Pod對應的宿主機上,是kubelet組件一部分,利用goroutine執行,不會阻塞主我看一下
至關於執行運維
mount -t nfs <NFS 服務器地址 >:/ /var/lib/kubelet/pods/<Pod 的 ID>/volumes/kubernetes.io~<Volume 類型 >/<Volume 名字 >
經過這個掛載操做,Volume的宿主機目錄就成爲了一個遠程NFS目錄的掛載點,之後寫入的全部文件,都會被保存在NFS服務器上
若是是已經有NFS磁盤,第一步能夠省略.ui
一樣,刪除PV的時候,也須要Umount和Dettach兩個階段處理spa
apiVersion: v1 kind: PersistentVolume metadata: name: cqh labels: cqh: chenqionghe spec: capacity: storage: 100Mi volumeMode: Filesystem accessModes: ["ReadWriteMany"] persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /data/pv nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: cqh operator: In values: - chenqionghe
建立後查看設計
root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE cqh 100Mi RWX Delete Bound default/cqh local-storage 4m
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: cqh spec: storageClassName: local-storage accessModes: - ReadWriteMany resources: requests: storage: 100Mi selector: matchLabels: cqh: chenqionghe
AccessModes爲ReadWriteMany,表示這個Volume是可讀寫的,而且能掛載在多個節點上(官方支持的AccessMode)
執行建立後查看
root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cqh Bound cqh 100Mi RWX local-storage 4m
apiVersion: v1 kind: Pod metadata: name: cqh spec: containers: - name: cqh-container image: nginx ports: - containerPort: 80 name: "http-server" volumeMounts: - mountPath: "/usr/share/nginx/html" name: pv-storage volumes: - name: pv-storage persistentVolumeClaim: claimName: cqh
建立後查看
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE cqh 1/1 Running 0 4m 10.244.0.46 vm-0-8-ubuntu <none> root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl describe po cqh Name: cqh Namespace: default ... Volumes: pv-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: cqh ReadOnly: false default-token-gqfrx: Type: Secret (a volume populated by a Secret) SecretName: default-token-gqfrx Optional: false ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m default-scheduler Successfully assigned default/cqh to vm-0-8-ubuntu Normal Pulling 4m kubelet, vm-0-8-ubuntu pulling image "nginx" Normal Pulled 4m kubelet, vm-0-8-ubuntu Successfully pulled image "nginx" Normal Created 4m kubelet, vm-0-8-ubuntu Created container Normal Started 4m kubelet, vm-0-8-ubuntu Started container