為什么要用volume?
首先。容器崩潰或重啟時,所有的數據都會丟失,我們可以把數據保存到容器的外部,比如硬盤nfs,這樣,即使容器沒了,數據還在;第二就是容器之間是隔離的。我們如果想共享數據的話,就要使用volume,第三就是讓容器能夠使用外部的存儲資源,比如公司的NAS存儲、云硬盤
EmptyDir卷
EmptyDir,它是一個臨時工作目錄,Pod里的容器可以一起在上面放文件,交換數據,但是當pod被刪除后,它就會被清空,它的生命周期跟pod是一致的,他提供給了應用一個臨時緩存空間,比如下載臨時文件,計算中間結果,他也讓pod中的不同容器間實現了數據共享
HostPath卷
Host path,它是節點的本地存儲,他將宿主機的文件掛載到pod中,但是要盡量少用,因為它會影響pod的可遷移性,Host path卷中的數據不會隨著pod 刪除而刪除,因為它實實在在的存儲在節點的磁盤中。比如運行kube-proxy 、CNI插件等系統守護進程的時候,需要訪問/lib/models等主機目錄,監控代理需要訪問節點上的/proc或/sys文件系統來收集系統的指標。
PV/PVC
PV會為集群提供一塊與pod和節點生命周期完全無關的持久化的網絡存儲,PV它由集群管理員預先配置,或者由storage class動態創建,它本身就是存儲資源,比如一塊nfs硬盤,PVC (persistent volume claim)是用戶對存儲的聲明,用戶在申領存儲資源的時候需要聲明,需要多大容量,需要什么訪問模式,PVC會向系統申請合適的pv來綁定
工作原理就是:
管理員創建一批pv(或者配置一個storage class來實現動態供給)
用戶在pod配置里定義一個PVC說明需要什么樣的存儲
K8s系統會為這個PVC找到一個匹配的pv,并與之綁定
用戶在pod中通過引用PVC來掛載存儲
pod刪除后,PVC和PV依然存在,數據得以保留PV可以被回收,以備后續使用
Empty Dir的生命周期與pod同步,host path的生命周期與node同步,PV或PVC的生命周期是獨立的
PV的訪問方式
PV 的訪問模式有四種:
- ReadWriteOnce:卷可以被一個節點以讀寫方式掛載。該訪問模式也允許運行在同一節點上的多
個 Pod 訪問卷。
- ReadOnlyMany:卷可以被多個節點以只讀方式掛載。
- ReadWriteMany:卷可以被多個節點以讀寫方式掛載。
- ReadWriteOncePod:卷可以被單個 Pod 以讀寫方式掛載
PV的回收策略
K8s的PV主要支持三種回收策略,分別是retain delete和recycle 。
Return(保留)它的核心作用,是手動回收。當PVC被刪除的時候,PV對象和其對應的外部存儲資源以及其中的數據都會被保留下來,用戶刪除PVC時,與之綁定的PV不會被自動刪除,它的狀態會變成released在released狀態下,這個PV不能再被新的PVC綁定。這時候我們可以將它掛載到某個pod上來查看其中的數據或者手動刪除這個PV,但是這僅僅刪除了k8s中的PV對象,外部的存儲資源依然存在,所以我們還需要清理外部存儲手動刪除對應的外部存儲卷才真正的釋放空間,這適用于數據非常重要的場景,確保不會誤刪數據,是很多數據庫生產環境中默認和推薦的策略,因為它提供了最高的數據安全性
第二種delete(刪除)自動回收,當PVC被刪除時,k8s會自動刪除PV對象,并調用后端存儲的接口釋放并刪除外部存儲資源,這時候,存儲空間被自動釋放,數據會永久丟失。一般當存儲緩存數據臨時處理文件時,可以這樣刪除,及時釋放存儲資源,節省成本。
第三種是recycle,這種策略不安全且效率低,已經被取代,所以這里我們不做介紹。