kubernetes數(shù)據(jù)卷主要解決了兩方面問
1、 數(shù)據(jù)持久性: 通常情況,容器運行起來后,寫入到其文件系統(tǒng)的文件是暫時性的处渣。當容器崩潰后,kubelet 將容器kill掉后,然后生成一個新的容器,此時,新容器將沒有原來容器的文件,因容器是重新從鏡像創(chuàng)建的
2、數(shù)據(jù)共享: 同一個pod中運行的容器之間,經(jīng)常會存在共享文件或者文件夾需求
kubernetes中咱旱,Volume(數(shù)據(jù)卷)存在明確的生命周期(與包含數(shù)據(jù)卷的容器組(pod)相同)确丢。因此Volume的生命周期比同一容器組(POD)中任意容器的生命周期更長,不管容器重啟了多少次吐限,數(shù)據(jù)都會被保留;如果POD 不存在,數(shù)據(jù)卷自然退出鲜侥。此時根據(jù)POD 所使用的數(shù)據(jù)卷類型不同,數(shù)據(jù)可能隨著數(shù)據(jù)的退出而刪除,也可能被真正持久化,并在下次容器組重啟時仍然可以使用。
從根本上來說,一個數(shù)據(jù)卷僅僅是一個可以被pod訪問的目錄或者文件,這個目錄取決于數(shù)據(jù)卷的類型(不同類型的數(shù)據(jù)卷使用不同的存儲介質(zhì))诸典。同一個pod中的兩個容器可以將一個數(shù)據(jù)卷掛載到不同的目錄下描函。
Emptydir
emptyDir 類型的數(shù)據(jù)卷在創(chuàng)建POD時分配給該pod,并且直到pod 被移除,該數(shù)據(jù)卷才被釋放。該數(shù)據(jù)卷初始分配是,始終是一個空目錄狐粱。同一個pod中的不同容器都可以對該目錄執(zhí)行讀寫操作,并且共享其中的數(shù)據(jù)(盡管不同容器可能將該數(shù)據(jù)卷掛載到容器中的不同路徑)舀寓。當pod被刪除后,Emptydir 數(shù)據(jù)中的數(shù)據(jù)將永久刪除
(PS: 容器崩潰是,kubelet并不會刪除pod脑奠,而僅僅是將容器重啟,因此emptydir中的數(shù)據(jù)在容器崩潰并重啟后,然后存在)
emptydir 使用場景
1. 空白的初始空間,例如合并/排序算法中,臨時將數(shù)據(jù)保存在磁盤上
2. 長時間計算中存儲檢查點(中間結(jié)果),以便容器崩潰是基公,可以從上一次存儲的檢查點(中間結(jié)果)繼續(xù)進行,而不是從頭開始
3. 作為兩個容器的共享存儲,使得第一個內(nèi)容管理的容器可以將生產(chǎn)的數(shù)據(jù)存入其中,同事一個webserver容器對外提供這些頁面
4. 默認情況, emptydir數(shù)據(jù)存儲在node節(jié)點的存儲介質(zhì)上
Emptydir使用示例
[apps@k8s-node-001 ~]cat emtydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: read-write
spec:
containers:
- name: write #定義一個名為write的容器
image: busybox
volumeMounts:
- mountPath: /write #當數(shù)據(jù)持久化類型為emtydir時幅慌,這里的路徑指的是容器內(nèi)的路徑
name: share-volume #指定本地的目錄名
args: #容器運行后宋欺,進行寫操作
- /bin/sh
- -c
- echo "emtydir test" > /write/hello;sleep 30000
- name: read #定義一個名為read的容器
image: busybox
volumeMounts:
- mountPath: /read
name: share-volume #指定本地的目錄名
args: #容器運行后,進行讀操作
- /bin/sh
- -c
- cat /read/hello; sleep 30000
volumes: #這里的volumes是指對上面掛載的進行解釋
- name: share-volume #這里的名字必須和上面pod的mountPath下的name值對應(yīng)
emptyDir: {} #這里表示是個空目錄胰伍,主要是定義了一個數(shù)據(jù)持久化的類型
[apps@k8s-node-001 ~]# kubectl apply -f emtydir.yaml #執(zhí)行yaml文件
[apps@k8s-node-001 ~]# kubectl exec -it read-write -c write /bin/sh #進入第一個pod
# cat /write/hello #確認yaml文件執(zhí)行的命令是否生效
emtydir test
[apps@k8s-node-001 ~]# kubectl exec -it read-write -c read /bin/sh #進入第二個容器名為read的容器查看
# cat /read/hello #查看指定掛載的目錄下是否和write容器中的內(nèi)容一致
emtydir test
#至此齿诞,起碼可以確認這兩個pod是掛載了同一個本地目錄,文件內(nèi)容都一致骂租。
#那么祷杈,現(xiàn)在看看具體掛載的是本地哪個目錄?
[root@k8s-master-001 ~]# kubectl get pod -o wide #先通過此命令查看pod是運行在哪個節(jié)點上的
#我這里是運行在node01節(jié)點的渗饮,所以接下來需要到node01節(jié)點上進行查看
#node01節(jié)點操作如下:
[apps@k8s-node-001 ~]# docker ps #通過此命令查看出運行的容器ID號
CONTAINER ID IMAGE #省略部分內(nèi)容
6186a08c6d5f busybox
5f19986f0879 busybox
[apps@k8s-node-001 ~]# docker inspect 6186a08c6d5f #查看第一個容器的詳細信息
"Mounts": [ #找到mount字段
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/86b67ff4-9ca0-4f40-86d8-6778cfe949ec/volumes/kubernetes.io~empty-dir/share-volume",
#上面的source就是指定的本地目錄
"Destination": "/read",
"Mode": "Z",
"RW": true,
"Propagation": "rprivate"
[apps@k8s-node-001 ~]# docker inspect 5f19986f0879 #查看第二個容器的詳細信息
"Mounts": [ #同樣定位到mount字段
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/86b67ff4-9ca0-4f40-86d8-6778cfe949ec/volumes/kubernetes.io~empty-dir/share-volume",
#可以看到但汞,上面指定的本地目錄和第一個容器指定的是同一個目錄
"Destination": "/write",
"Mode": "Z",
"RW": true,
"Propagation": "rprivate"
},
#至此,已經(jīng)可以確定這兩個容器的掛載目錄共享的是同一個本地目錄
[apps@k8s-node-001 ~]# cat /var/lib/kubelet/pods/86b67ff4-9ca0-4f40-86d8-6778cfe949ec/volumes/kubernetes.io~empty-dir/share-volume/hello
#查看本地該目錄下的內(nèi)容互站,和pod中的一致
emtydir test
驗證k8s-node-001上刪除一個POD 并再次查看本地目錄:
[apps@k8s-node-001 ~]docker rm -f 6186a08c6d5f #刪除一個pod
6186a08c6d5f
[apps@k8s-node-001 ~]# cat /var/lib/kubelet/pods/86b67ff4-9ca0-4f40-86d8-6778cfe949ec/volumes/kubernetes.io~empty-dir/share-volume/hello
#查看本地目錄私蕾,發(fā)現(xiàn)文件還在
emtydir test
在k8S master 端刪除pod,再次k8s-node-001 上驗證查看本地目錄是否存在
[apps@k8s-master-001 ~]# kubectl delete -f emtydir.yaml
#在node01上再次查看本地目錄,會提示不存在這個目錄
[apps@k8s-master-001 ~]## cat /var/lib/kubelet/pods/86b67ff4-9ca0-4f40-86d8-6778cfe949ec/volumes/kubernetes.io~empty-dir/share-volume/hello
cat: /var/lib/kubelet/pods/86b67ff4-9ca0-4f40-86d8-6778cfe949ec/volumes/kubernetes.io~empty-dir/share-volume/hello: 沒有那個文件或目錄
emptyDir 總結(jié)
在同一個POD里不同的容器中胡桃,共享同一個持久化目錄踩叭,當pod 節(jié)點刪除時,volume 的內(nèi)容也會被刪除。但如果僅僅是容器被銷毀翠胰,pod還在,則volume 不會受到任何影響.emptydir的數(shù)據(jù)持久化的生命周期和使用的pod一致,一般是作為臨時存儲使用容贝。