在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掛載點
能夠進入目錄在宿主機查看數據。
kubectl get pod -o wide (-w):能夠詳細的查看pod信息
加上-w:能夠實時查看。而且知道容器運行在那個節點。
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: