一、volume介紹
volume是Pod中能夠唄多個容器訪問的共享目錄。Kubernetes的Volume概念、用途和目的與Docker的Volume比較類似,但兩者不能等價。首先,Kubernetes中的Volume定義在Pod上,然后被一個Pod里的多個容器掛載到具體的文件目錄下;其次,Kubernetes中的Volume與Pod的生命周期相同,但與容器的生命周期不相關,當容器中止或者啟動時,Volume中的數據也不會丟失。Kubernetes支持多種類型的Volume,例如GlusterFS、Ceph等先進的分布式文件存儲。Volume的使用也比較簡單,在大多數情況下,先在Pod上聲明一個Volume,然后在容器里引用Volume并Mount到容器里某個目錄上
總結來說:
為了保證數據的持久性,必須保證數據在外部存儲不在docker容器中,為了實現數據的持久性存儲,在宿主機和容器內做映射,可以保證在容器的生命周期結束,數據依舊實現持久性存儲。但是在k8s中,由于pod分布在各個不同的節點之上,并不能實現不同節點之間持久性數據的共享,并且,在節點故障時,可能會導致數據的永久性丟失。為此,k8s就引入了外部存儲卷的功能
k8s volume支持的類型
kubectl explain pod.spec.volumes
常用分類
emptyDir(臨時目錄):pod刪除,數據也會被清除,這種存儲成為emptyDIr,用于數據的臨時存儲
hostPath(宿主機目錄映射):可以持久化,但不可以跨主機
本地的SAN(ISCSI,FC)、NAS(nfs,cifs,http)存儲
分布式存儲(glusterfs,rbd,cephfs)
云存儲(EBS,Azure,Disk)
總結:
k8s要使用存儲卷,需要2步:
1.在pod定義volume,并指明關聯到那個存儲設備
2.在容器使用volume mount進行掛載
二、emptyDir存儲卷
一個emptyDir第一次創建是在一個pod被指定到具體node的時候,并且會一直存在pod的生命周期當中,正如它的名字一樣,它初始化是一個空目錄,pod中的容器都可以讀寫這個目錄,這個目錄可以被掛到各個容器相同或者不相同的路勁下。當一個pod因為任何原因被一尺的時候,這些數據會被永久刪除。注意:一個容器崩潰了不會導致數據的丟失,因為容器的崩潰并不移除pod。
emptyDir