一個運作中的容器對檔案系統的寫入都是發生在其分層檔案系統的可寫層。一旦容器運作結束,所有寫入都會被丢棄。如果資料需要長期存儲,那就需要對容器資料做持久化支援。
Kubernetes 和 Docker 類似,也是通過 Volume 的方式提供對存儲的支援。Volume 被定義在 Pod 上,可以被 Pod 裡的多個容器挂載到相同或不同的路徑下。 Kubernetes 中 Volume 的 概念與Docker 中的 Volume 類似,但不完全相同。具體差別如下:
Kubernetes 中的 Volume 與 Pod 的生命周期相同,但與容器的生命周期不相關。當容器終止或重新開機時,Volume 中的資料也不會丢失。
當 Pod 被删除時,Volume 才會被清理。并且資料是否丢失取決于 Volume 的具體類型,比如:emptyDir 類型的 Volume 資料會丢失,而 PV 類型的資料則不會丢失。
Kubernetes 目前支援多種 Volume 類型,大緻如下:
emptyDir
nfs
hostPath
gitRepo
persistentVolumeClaim
projected
portworxVolume
等等
下面對常見的做一下基本介紹
emptryDir
如果Pod配置了EmpyDir資料卷,在Pod的生命周期内都會存在,當Pod被配置設定到 Node上的時候,會在Node上建立EmptyDir資料卷,并挂載到Pod的容器中。隻要Pod 存在,EmpyDir資料卷都會存在(容器删除不會導緻EmpyDir資料卷丟失資料),但是如果Pod的生命周期終結(Pod被删除),EmpyDir資料卷也會被删除,并且永久丢失。
示例示範:
kubectl create -f emptyDir2.yaml
kubectl describe test-pod2

k8s 叢集會在 node 節點上 建立EmptyDir資料卷
/var/lib/kubelet/pods/61691e55-6740-11e9-b7fc-0050569360ba/volumes/kubernetes.io~empty-dir/data-volume2
在k8s-node1 上添加檔案
、
進入pod 容器中檢視
删除pod
kubectl delete -f emptyDir2.yaml
k8s-node1 臨時目錄就會被删除
進入原來的目錄,臨時目錄已經被删除
hostPath類型則是映射node檔案系統中的檔案或者目錄到pod裡。在使用hostPath類型的存儲卷時,也可以設定type字段,支援的類型有檔案、目錄、File、Socket、CharDevice和BlockDevice。
kubectl create -f host_path.yaml
進入挂載的/test-data目錄中,建立個測試檔案
建立測試檔案
在pod 運作的節點上檢視
ps 在node 節點的目錄裡建立,容器裡面也會自動生成
删除 pod 容器 kubectl delete -f host_path.yaml
檢視 node 節點上的 檔案還在