k8s存儲數據持久化,emptyDir,hostPath,基於Nfs服務的PV,PVC

在docker和K8S中都存在容器是有生命週期的,所以數據卷能夠實現數據持久化。docker

數據卷解決的主要問題:vim

1.數據持久性:當咱們寫入數據時,文件都是暫時性的存在,當容器崩潰後,host就會將這個容器殺死,而後從新從鏡像建立容器,數據就會丟失。api

2.數據共享:在同一個Pod中運行容器,會存在共享文件的需求。服務器

數據卷的類型:app

1.emptyDir
emptyDir數據卷相似於docker數據持久化的docker manager volume,該數據卷初分配時,是一個空目錄,同一個Pod中的容器能夠對該容器中的目錄具備執行讀寫操做,而且共享數據。
場景特色:一個相同的pod,不一樣的容器,共享數據卷
若是容器被刪除,數據仍然存在,若是Pod被刪除,數據也會被刪除ide

測試:測試

**vim  emptyDir.yaml**
apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
  - image: busybox
    name: producer
    volumeMounts:
    - mountPath: /producer_dir#這裏的路徑指的是容器內的路徑
      name: shared-volume#指定本地的目錄名
    args:#定義容器運行後,會進行的操做
    - /bin/sh
    - -c
    - echo "hello k8s" > /producer_dir/hello; sleep 30000

  - image: busybox
    name: consumer
    volumeMounts:
    - mountPath: /consumer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - cat /consumer_dir/hello; sleep 30000

  volumes:
  - name: shared-volume#這裏的值須要與上面Pod的mountPath的name值對應
    emptyDir: {}#定義數據持久化的類型,即表示空目錄

kubectl apply -f emptyDir.yaml #執行文件
docker inspect (查看容器的詳細信息):Mount掛載點
k8s存儲數據持久化,emptyDir,hostPath,基於Nfs服務的PV,PVC
能夠進入目錄在宿主機查看數據。
k8s存儲數據持久化,emptyDir,hostPath,基於Nfs服務的PV,PVC
kubectl get pod -o wide (-w):能夠詳細的查看pod信息
加上-w:能夠實時查看。而且知道容器運行在那個節點。
k8s存儲數據持久化,emptyDir,hostPath,基於Nfs服務的PV,PVC
kubectl logs {pod名} consumer能夠查看目錄中的數據。3d

根據測試能夠查看節點上的容器,掛載目錄是否相同。相同則環境正確。能夠刪除容器查看數據是否丟失,在刪除master節點pod查看數據是否還在。
根據測試,emptyDir數據持久化通常只能做爲臨時存儲使用。code

2.hostPath Volume
1》將Pod所在節點的文件系統上某一個文件或目錄掛載進容器內。
2》相似於docker數據持久化的bind mount。若是Pod被刪除,數據會保留。相比較emptyDir要好一些,不過一但host崩潰,hostPath也沒法訪問了。
3》使用這種數據持久化的場景很少,由於會增長Pod與節點之間的耦合性。server

3.Persistent  Volume :pv (持久卷) 提早作好的,數據持久化的存放目錄。
    persistentVolumeClaim: PVC (持久卷使用聲明 | 申請)
    pvc是用戶存儲的請求。相似於pod。pod消耗節點資源,pvc消耗存儲資源。pod能夠請求特定級別的資源(cpu,內存)。pvc根據權限能夠請求特定的大小和訪問模式。

基於NFS服務來作PV:

安裝NFS服務及rpcbind服務:
1.[root@master yaml]# yum install -y nfs-utils rpcbind  #這裏注意三臺都要安裝NFS服務。
2.[root@master yaml]# vim /etc/exports  
文件中添加/nfsdata  *(rw,sync,no_root_squash)  
4.[root@master yaml]# mkdir /nfsdata  
5.[root@master yaml]# systemctl start rpcbind  
6.[root@master yaml]# systemctl start nfs-server.service   
7.[root@master yaml]# showmount -e  
Export list for master:  
/nfsdata *  

建立PV資源對象:

vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test
spec:
  capacity:#給予的容量大小
    storage: 1Gi
  accessModes:#PV支持的訪問模式
    - ReadWriteOnce#這裏表示只能以讀寫的方式掛載到單個節點
  persistentVolumeReclaimPolicy: Recycle#pv的回收策略:表示自動清楚數據
  storageClassName: nfs#定義的存儲類名字
  nfs:#這裏要和上面定義的存儲類名字一致
    path: /nfsdata/pv1#指定NFS的目錄
    server: 192.168.1.1#指定NFS服務器的IP
執行nfs-pv.yaml文件:
**` kubectl apply -f nfs-pv.yaml  ` **
persistentvolume/test created  
**` kubectl get pv  `**
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE  
test   1Gi        RWO            Recycle         ** Available **          nfs                     7s  
**這裏注意STATUS狀態爲Available纔可以使用。**

pv支持的訪問模式:
ReadWriteOnce:訪問模式爲只能以讀寫的方式掛載到單個節點
ReadWriteMany:訪問模式爲只能以讀寫的方式掛載到多個節點
ReadOnlyMany:訪問模式爲只能以只讀的方式掛載到多個節點
PV存儲空間的回收策略
Recycle:自動清除數據。
Retain:須要管理員手動回收。
Delete:雲存儲專用。
PV和PVC相互的關聯:經過的是storageClassName與accessModes

建立PVC:
 vim nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test
spec:
  accessModes:
    - ReadWriteOnce#定義訪問模式,這裏必須與Pv定義一致
  resources:
    requests:
      storage: 1Gi#請求容量的大小
  storageClassName: nfs#存儲類的名字,必須與pv定義的一致。

運行,並查看PVC和PV:
kubectl apply -f nfs-pvc.yaml   
關聯後會看見,Bound:
k8s存儲數據持久化,emptyDir,hostPath,基於Nfs服務的PV,PVC
k8s存儲數據持久化,emptyDir,hostPath,基於Nfs服務的PV,PVC

相關文章
相關標籤/搜索