k8s筆記五(存儲卷及數據持久化)

1、kubernetes存儲卷

(1)存儲卷

        Kubernetes提供的存儲卷屬於pod資源級別,共享於Pod內的所有容器,可用於在容器的文件系統之外存儲應用存儲的相關數據,也可獨立pod生命週期之外實現數據的持久化。

(2)kubernetes支持的存儲卷類型

        Kubernetes支持非常豐富的出處卷類型,包括本地儲存及各種網絡存儲,同時還支持Secret和ConfigMap這樣的特殊存儲資源。

        由於網絡存儲配置使用複雜,對此,kubernetes設計了一種集羣級別的資源PersistentVolume(PV)並由管理員配置存儲系統,然後通過persistentVolumeClain(PVC)存儲卷直接申請使用的機制簡化了存儲的使用配置過程。

(3)存儲卷的使用方式

        在pod中定義配置存儲卷由兩部分組成,一是通過pod.spec.volumes字段定義在Pod之上的存儲卷列表;然後通過pod.spec.containers.volumeMount字段在容器上定義存儲卷掛載列表,在容器中只能掛載在當前Pod資源中定義的具體存儲卷。

        在容器中定義掛載卷時的主要字段:

            name:必選字段,指定要掛載的存儲的名稱,

            mountPath:必選字段,掛載路徑,即掛載容器的那個路徑下

            readOnly:是否掛載爲只讀卷

           subPath:掛載存儲卷時時使用的子路徑

2、臨時存儲卷

(1)emptyDir

         emptyDir是pod生命週期中的一個臨時目錄,生命週期跟隨pod的生命週期;emptyDir存儲卷通過pod.spec.volumes.emptyDir字段定義,主要的字段如下:

            medium:存儲介質的類型,值有”default”和“memory”,默認爲default。

            SizeLimit:當前存儲卷的空間限額,默認值爲nil,不限制。

# 定義一個自助式pod,定義一個emptyDir存儲,定義兩個容器並共享存儲
[root@master01 volumes]# cat test-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-emptydir-dir
spec:
  volumes:
  - name: html
    emptyDir: {}
  containers:
  - name: nginx
    image: nginx:1.12
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  - name: busybox
    image: busybox
    volumeMounts:
    - name: html
      mountPath: /html
    command: ["/bin/sh", "-c"]
    args: 
    - echo $(date) >> /html/index.html

(2)gitRepo存儲卷

       gitRepo存儲卷可以看作是emptyDir存儲卷的一種實際應用,但是該存儲卷從kubernetes1.12開始已經被廢棄。在創建使用gitRepo存儲卷的pod時,首先會創建一個空目錄(emptyDir)並克隆一份指定的git倉庫中的數據至該目錄下,然後再創建容器並掛載該存儲卷。

       創建gitRepo類型的存儲卷時,主要的字段如下:

              repository:必選字段,爲Git倉庫的URL

              directory:目標目錄的名稱

              revision:特定revision的提交哈希碼

3、節點存儲卷

       hostPath類型的存儲卷是指將工作節點上的某文件系統的目錄或文件掛載於Pod中的一種存儲卷,它可獨立於Pod資源的生命週期,因而具有持久性,但是它是工作在本地節點的存儲空間,僅適用於特定情況下的存儲卷使用要求。

      定義配置hostPath類型的存儲卷時,主要是通過pod.spec.volumes.hostPath字段嵌套的path(用於指定工作節點上的目錄路徑)字段及type(用於指定存儲卷的類型)字段來定義的,type值有:

           DirectoryOrCreate:指定的路徑不存在時自動創建

           Directory:必須存在的目錄路徑

           FileOrCreate:指定的路徑不存在時自動將其創建爲空文件

           File:必須存在的文件路徑

           Socket:必須存在的Socket文件路徑

           CharDevice:必須存在的字符設備文件路徑

           BlockDevice:必須存在的塊設備文件路徑

# 定義一個使用hostpath存儲卷的自助式pod
[root@master01 volumes]# cat test-hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-hostpath-vol
spec:
  volumes:
  - name: html
    hostPath:
      path: /data/test/html
      type: DirectoryOrCreate
  containers:
  - name: nginx
    image: nginx:1.12
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
# 創建並查看該pod的詳細信息
[root@master01 volumes]# kubectl apply -f test-hostpath.yaml 
pod/test-hostpath-vol created
[root@master01 volumes]# kubectl get pods -o wide test-hostpath-vol
NAME                READY   STATUS    RESTARTS   AGE     IP            NODE                 NOMINATED NODE   READINESS GATES
test-hostpath-vol   1/1     Running   0          2m49s   10.244.2.46   node02.dayi123.com   <none>           <none>
# 在該pod所在的節點上創建測試文件並測試
[root@node02 ~]# echo "$(date +%F-%T) test-volumes-hostpath" > /data/test/html/index.html
[root@node02 ~]# curl 10.244.2.46
2019-01-24-00:51:00 test-volumes-hostpath

4、網絡存儲器

       Kubernetes支持衆多類型的網絡存儲卷,包括傳統的NAS或SAN設備(如NFS、Iscsi、fc)、分佈式存儲(如RDB、GlusterFS)、雲端存儲(如cinder、awsElasticBlockStore、azureDisk)及構建在各類存儲系統之上的抽象管理層。

(1)NFS存儲卷

       Kubernetes的NFS存儲卷用於將某實現存放的NFS服務器上的存儲空間掛載到Pod中以供容器使用,NFS存儲卷在pod對象終止後會被卸載並不會被刪除。

       NFS存儲卷的定義是通過pod.spec.volumes.nfs地段定義,主要的嵌套字段有:

              server:NFS服務器的IP地址或主機名

              path:NFS服務器導出的文件系統路徑

              readOnly:是否以制度方式掛載

       在使用nfs存儲卷之前首先得有一個nfs服務器;先搭建一個nfs服務器,IP地址爲192.168.17.195,主機名爲nfs01.dayi123.com,並在各節點主機hosts文件中做解析。

# 安裝nfs服務
[root@nfs01 ~]# yum install nfs-utils
# 配置nfs服務
[root@nfs01 ~]# cat /etc/exports
/data/volums/data01 192.168.17.0/24(rw,no_root_squass)
# 創建nfs掛載目錄
[root@nfs01 ~]# mkdir /data/volums/data01/ -p
# 啓動服務
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl enable rpcbind
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
# 查看nfs狀態
[root@nfs01 ~]# showmount -e 192.168.17.195
Export list for 192.168.17.195:
/data/volums/data01 192.168.17.0/24

       存在nfs網絡文件系統後,就可以在各pod中使用nfs存儲卷,nfs是文件系統級的共享服務,它支持同時存在的多路徑掛載請求,但在使用nfs時需要在各節點安裝nfs客戶端工具(只需安裝nfs-utils,不需要啓動)

# 創建一個使用nfs存儲卷的自助式運行nginx的pod
[root@master01 volumes]# cat test-nginx-nfsvol.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx-nfsvol
spec:
  volumes:
  - name: html
    nfs:
      server: nfs01.dayi123.com
      path: /data/volums/data01
      readOnly: false
  containers:
  - name: nginx
    image: nginx:1.12
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
# 創建並查看pod的詳細信息
[root@master01 volumes]# kubectl apply -f test-nfs-vol.yaml
[root@master01 volumes]# kubectl get pods test-nginx-nfsvol -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
test-nginx-nfsvol   1/1     Running   0          14m   10.244.2.52   node02.dayi123.com   <none>           <none>
# 在nfs服務掛載的目錄上寫入數據通過nginx測試
[root@master01 volumes]# kubectl exec -it test-nginx-nfsvol -- /bin/sh
# echo "$(date +%F-%T) $(hostname) - TEST-NGINX-NFSVOLMS" >/usr/share/nginx/html/index.html
[root@master01 volumes]# curl 10.244.2.52
2019-01-24-07:45:46 test-nginx-nfsvol - TEST-NGINX-NFSVOLMS

       由於nfs存儲卷保存的數據是永久性的,所以刪除使用nfs存儲卷的pod重新創建後數據不會丟失。

# 刪除並重新創建該pod並進行測試
[root@master01 volumes]# kubectl delete -f test-nginx-nfsvol.yaml 
[root@master01 volumes]# kubectl apply -f test-nginx-nfsvol.yaml 
[root@master01 volumes]# kubectl get pods test-nginx-nfsvol -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
test-nginx-nfsvol   1/1     Running   0          16s   10.244.2.53   node02.dayi123.com   <none>           <none>
[root@master01 volumes]# curl 10.244.2.53
2019-01-24-07:45:46 test-nginx-nfsvol - TEST-NGINX-NFSVOLMS

(2)RBD存儲卷的使用

       Kubernetes支持通過RBD卷類型使用ceph存儲系統爲Pod提供存儲卷,要配置Pod資源使用RBD存儲卷,需要滿足以下的條件:

       1)存在可用的ceph集羣

       2)需要在ceph rbd集羣中創建一個能滿足Pod資源需求數據存儲需要的存儲映像

       3)在kubernetes集羣內的各節點上安裝ceph客戶端程序包

       RBD類型的存儲卷是通過explain pod.spec.volumes.rbd字段定義的,主要的內嵌字段有:

              monitors:必選字段,爲ceph存儲監視器,使用逗號分隔的字符串列表

              image:必選字段,爲rados image的名稱

              pool:rados存儲池的名稱,默認爲RBD

              user:rados用戶名,默認爲admin

              keyring:RBD用戶認證時使用的keyring文件路徑,默認爲/etc/ceph/keyring

              secretRef:RBD用戶認證時使用的保存有相應認證信息的Secret對象,會覆蓋由keyring字段提供的祕鑰信息

              readOnly:是否以只讀方式進行訪問

              fsType:要掛載的存儲卷的文件系統類型

5、持久存儲卷

       直接使用自助式pod直接連接存儲的方式與kubernetes向用戶和開發隱藏底層架構的目標相背離;對此,kubernetes使用PersistentVolume(簡稱PV)子系統在系統和管理員之間添加一個自系統,解決了這種問題。

       PersistentVolume是由集羣管理員配置提供的某存儲系統上的一段存儲空間,是對底層共享存儲的抽象,將共享存儲作爲一種可由用戶申請使用的資源。用戶對pv資源的使用是通過PersistentVolumeClaim(簡稱PVC)提出使用申請來完成綁定,它向PV申請特定大小的空間及訪問模式,從而創建出PVC存儲卷,再由pod資源通過PVC存儲卷關聯使用。

(1)PV的創建

      PV對存儲系統的創建可通過插件來實現,kubernetes可支持的插件可通過” kubectl explain PersistentVolume.spec”命令查看。Pv的資源定義清單中PersistentVolume.spec字段除了定義存儲插件外,還可以定義的通用字段有:

       1)Capacity:當前pv的容量

       2)accessModes:定義訪問模式,常用的值有:ReadWriteOnce(僅可被單個節點讀寫掛載,簡寫爲RWO)、       ReadOnlyMany(可被多個節點制度掛載,簡寫爲ROX)、ReadWriteMany(可悲多個節點只讀掛載,簡寫爲RWX)

       3)persistentVolumeReclaimPolicy:PV空間被釋放時的處理機制,選項有Retain(默認值,由管理員手動回收)、Recycle(空間回收,刪除存儲卷下所有文件,目前僅NFS和hostPath支持)、Delete(刪除從存儲卷)

       4)volumeMode:卷模型,用於此卷可被用作文件系統還是塊設備,默認爲filesystem

       5)storageClassName:當前pv所屬的StorageClass的名稱,默認空值。

       6)mountOptions:掛載選項組成的列表,值有ro、soft、hard等

# 在創建愛你pv資源之前,查看可掛載的nfs存儲目錄
[root@master01 volumes]# showmount -e nfs01.dayi123.com
Export list for nfs01.dayi123.com:
/data/volums/vol03  192.168.17.0/24
/data/volums/vol02  192.168.17.0/24
/data/volums/vol01  192.168.17.0/24
/data/volums/data01 192.168.17.0/24
# 定義pv資源配置清單
[root@master01 volumes]# cat test-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv01
  labels:
    name: pv01
spec:
  nfs:
    server: nfs01.dayi123.com
    path: /data/volums/vol01
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 2Gi
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv02
  labels:
    name: pv02
spec:
  nfs:
    server: nfs01.dayi123.com
    path: /data/volums/vol02
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv03
  labels:
    name: pv03
spec:
  nfs:
    server: nfs01.dayi123.com
    path: /data/volums/vol03
  accessModes: ["ReadWriteMany","ReadWriteMany"]
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
# 創建並查看pv
[root@master01 volumes]# kubectl apply -f test-pv.yaml 
[root@master01 volumes]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
test-pv01   2Gi        RWX            Retain           Available                                   5s
test-pv02   5Gi        RWO            Retain           Available                                   5s
test-pv03   10Gi       RWX            Retain           Available                                   5s

(2)創建PVC

       PVC是存儲卷類型的資源,它通過申請佔用某個pv而創建,它與pv是一對一的關係,創建pvc申請pv時用戶需要指定目標空間大小,訪問模式,pv標籤選擇器和StoreClass等信息,pvc的spec字段嵌套的字段有:

       accessMode:當前pvc的訪問模式,可用模式與PV相同

       resources:當前PVC存儲卷需要佔用的資源量的最小值

       selector:綁定時對PV應用的標籤選擇器或匹配條件表達式,用於挑選要綁定的pv

       storageClassVolume:所依賴的存儲類的名稱

       volumeMode:卷模型,默認爲Filesystem

       volumeName:用於直接指定要綁定的PV的卷名

# 定義一個pvc資源,讓它自動找合適的pv綁定
[root@master01 volumes]# cat test-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc01
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 5Gi
# 創建並查看創建的PVC
[root@master01 volumes]# kubectl apply -f test-pvc.yaml
[root@master01 volumes]# kubectl get pvc
NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-pvc01   Bound    test-pv03   10Gi       RWX                           85s
# 查看pv的綁定狀態
[root@master01 volumes]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                STORAGECLASS   REASON   AGE
test-pv01   2Gi        RWX            Retain           Available                                                38m
test-pv02   5Gi        RWO            Retain           Available                                                38m
test-pv03   10Gi       RWX            Retain           Bound       default/test-pvc01                           38m

(3)在pod中使用PVC

       創建好PVC資源後,可在Pod中通過” pod.spec.volumes.persistentVolumeClaim”字段去調用PVC,調用pvc時只要有以下的嵌套字段:

       claimName:要調用的PVC的存儲卷的名稱,pvc要與pod在同一名稱空間中

       readOnly:是否將存儲卷強制掛載爲制度模式,默認爲false。

# 定義一個pod資源調用pvc存儲
[root@master01 volumes]# cat test-pod-pvc.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-pod-pvc
spec:
  containers:
  - name: pvc-nginx
    image: nginx:1.12
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: test-pvc01

(4)存儲類

       Storage class(存儲類)是kubernetes資源類型的一種,是由管理員爲管理PV之便而按需創建的類別(邏輯組)。存儲類支持PV的動態創建,當用戶用到持久性存儲時,需要創建pvc來綁定匹配的pv,當管理員手動創建的pv無法滿足pvc的所有需求時,系統會按pvc的需求標準動態創建適配的pv。

1)存儲類的創建

       存儲類資源的定義除了名稱外,還需要定義的以下的三個關鍵字:

           provisioner(供給方):提供給存儲資源的存儲系統

parameters:存儲類使用參數描述要關聯到的存儲卷,不同的provisioner可用的參數各不相同

           reclaimPolicy:爲當前存儲類活動動態創建的PV指定回收策略,可用值爲Delete(默認值)和Retain

           volumeBindingMode:定義如何爲PVC完成供給和綁定

           mountOptions:由當前類動態創建的PV的掛載選項列表

2)動態pv的供給

      存儲類創建完成後,在PVC的定義中指定使用的存儲類資源的方式有兩種,一是通過spec.storageClassName字段定義,另一種是使用volume.beta.kubernetes.io/storage-class註解信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章