Kubernetes中的PV和PVC是啥

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

1、關於PV建立的流程

大多數狀況,持久化Volume的實現,依賴於遠程存儲服務,如遠程文件存儲(NFS、GlusterFS)、遠程塊存儲(公有云提供的遠程磁盤)等。
K8s須要使用這些存儲服務,來爲容器準備一個持久化的宿主機目錄,以供之後掛載使用,建立這個目錄分爲兩階段:ubuntu

1.建立一個遠程塊存儲,至關於建立了一個磁盤,稱爲Attach

由Volume Controller負責維護,不斷地檢查 每一個Pod對應的PV和所在的宿主機的掛載狀況。能夠理解爲建立了一塊NFS磁盤,至關於執行api

gcloud compute instances attach-disk < 虛擬機名字 > --disk < 遠程磁盤名字 >

爲了使用這塊磁盤,還須要掛載操做服務器

2.將這個磁盤設備掛載到宿主機的掛載點,稱爲Mount

將遠程磁盤掛載到宿主機上,發生在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

2、PV、PVC使用示例

1.建立PV

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

2.建立PVC

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

3.建立Pod,使用PVC

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

總結

  1. PVC和PV至關於面向對象的接口和實現
  2. 用戶建立的Pod聲明瞭PVC,K8S會找一個PV配對,若是沒有PV,就去找對應的StorageClass,幫它建立一個PV,而後和PVC完成綁定
  3. 新建立的PV,要通過Master節點Attach爲宿主機建立遠程磁盤,再通過每一個節點kubelet組件把Attach的遠程磁盤Mount到宿主機目錄
相關文章
相關標籤/搜索