基於NFS的PV動態供給(StorageClass)

渣渣輝發表於2019-05-12

一、簡介

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.獨立的掛載卷

 

相關文章