一、簡介
PersistentVolume(PV)是指由叢集管理員配置提供的某儲存系統上的段儲存空間,它是對底層共享儲存的抽象,將共享儲存作為種可由使用者申請使的資源,實現了“儲存消費”機制。通過儲存外掛機制,PV支援使用多種網路儲存系統或雲端儲存等多種後端儲存系統,例如,NFS、RBD和Cinder等。PV是叢集級別的資源,不屬於任何名稱空間,使用者對PV資源的使需要通過PersistentVolumeClaim(PVC)提出的使申請(或稱為宣告)來完成繫結,是PV資源的消費者,它向PV申請特定大小的空間及訪問模式(如rw或ro),從建立出PVC儲存卷,後再由Pod資源通過PersistentVolumeClaim儲存卷關聯使,如下圖:
儘管PVC使得使用者可以以抽象的方式訪問儲存資源,但很多時候還是會涉及PV的不少屬性,例如,由於不同場景時設定的效能引數等。為此,叢集管理員不得不通過多種方式提供多種不同的PV以滿不同使用者不同的使用需求,兩者銜接上的偏差必然會導致使用者的需求無法全部及時有效地得到滿足。Kubernetes從1.4版起引入了一個新的資源物件StorageClass,可用於將儲存資源定義為具有顯著特性的類(Class)而不是具體的PV,例如“fast”“slow”或“glod”“silver”“bronze”等。使用者通過PVC直接向意向的類別發出申請,匹配由管理員事先建立的PV,或者由其按需為使用者動態建立PV,這樣做甚至免去了需要先建立PV的過程。
PV對儲存系統的支援可通過其外掛來實現,目前,Kubernetes支援如下型別的外掛。
官方地址:https://kubernetes.io/docs/concepts/storage/storage-classes/
由上圖我們可以看到官方外掛是不支援NFS動態供給的,但是我們可以用第三方的外掛來實現,下面就是本文要講的。
二、安裝NFS外掛
GitHub地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs/deploy/kubernetes
2.1建立RBAC授權
[root@master storage-class]# cat rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: default roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io
2.2 建立Storageclass類
[root@master storage-class]# cat storageclass-nfs.yaml apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: managed-nfs-storage provisioner: fuseim.pri/ifs
2.3 建立nfs的deployment,修改相應的nfs伺服器ip及掛載路徑即可。
[root@master storage-class]# cat deployment-nfs.yaml apiVersion: apps/v1beta1 kind: Deployment metadata: name: nfs-client-provisioner spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: imagePullSecrets: - name: registry-pull-secret serviceAccount: nfs-client-provisioner containers: - name: nfs-client-provisioner image: lizhenliang/nfs-client-provisioner:v2.0.0 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: fuseim.pri/ifs - name: NFS_SERVER value: 172.31.182.145 - name: NFS_PATH value: /u01/nps/volumes volumes: - name: nfs-client-root nfs: server: 172.31.182.145 path: /u01/nps/volumes
三、建立一個PV動態供給應用例項
下面是一個StatefulSet應用動態申請PV的示意圖:
例如:建立一個nginx動態獲取PV
[root@master storage-class]# cat nginx-demo.yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "managed-nfs-storage" resources: requests: storage: 1Gi
啟動後我們可以看到以下資訊:
這時我們在nfs伺服器上也會看到自動生成3個掛載目錄,當pod刪除了資料還會存在。
StatefulSet應用有以下特點:
1.唯一的網路標識
2.域名訪問(<statefulsetName-index>.<service-name>.svc.cluster.local) 如:web-0.nginx.default.svc.cluster.local
3.獨立的持久儲存
4.有序的部署和刪除