Pod 的生命周期是短暫的姜盈,會頻繁被銷毀和創(chuàng)建。由于沙盒機制,舊Pod 被銷毀后,會伴隨容器里的所有資源都被清空瓣窄。在服務(wù)運行過程奈附,或多或少有需要持久化存儲的資源(圖片、多媒體、文檔),我們都肯定不希望看到Pod沒了這些資源也跟著被銷毀。
另外同性質(zhì)的Pod捌归,資源之間應(yīng)該允許共享,而不是被當(dāng)獨作為服務(wù)來遠程訪問岭粤。
Volume使用
Volume的生命周期獨立于容器惜索,它是一個目錄,Volume會被mount到Pod剃浇,Pod中的所有容器都可以訪問這個Volume巾兆,和Docker Volume類似。
Volume支持的類型:emptyDir虎囚、hostPath角塑、AWS Elastic Block Store、NFS淘讥、Ceph等圃伶。
emptyDir(臨時存儲卷)
emptyDir屬于Pod內(nèi)的臨時掛載的目錄。 當(dāng)Volume 選擇類型為emptyDir時,它的特性只是一個臨時掛載的目錄窒朋,Pod刪除后搀罢,該目錄也會在node節(jié)點上被刪除;但是如果容器崩潰或者Kubenetes 重啟炼邀,該目錄仍然存在魄揉,通過Pod 關(guān)聯(lián)的容器均能訪問該目錄。
1)創(chuàng)建示例應(yīng)用
#本地終端拭宁,進入server節(jié)點容器的命令
multipass shell server
#進入容器后,先創(chuàng)建文件:volume-test.yml
sudo vi volume-test.yml
#volume-test.yml 的內(nèi)容
apiVersion: v1
kind: Pod
metadata:
name: shared-pod
spec:
containers:
- image: busybox
name: write-container
volumeMounts:
- mountPath: /write_directory
name: shared-volume
args:
- /bin/sh
- -c
- echo "hello K3s" >/write_directory/test; sleep 120000
- image: busybox
name: read-container
volumeMounts:
- mountPath: /read_directory
name: shared-volume
args:
- /bin/sh
- -c
- cat /read_directory/test; sleep 120000
volumes:
- name: shared-volume
emptyDir: {}
2)示例講解
所有的示例均在Multipass內(nèi)執(zhí)行瓣俯。
上述代碼杰标,首先聲明一個叫shared-volume 的volume。同時為了方便下面對pod 的目錄共享的驗證彩匕,示例在Pod 內(nèi)創(chuàng)建了兩個容器腔剂,均通過volumeMounts 指向shared-volume 的shared_directory目錄。
容器:write-container 負(fù)責(zé)在shared_directory 目錄寫入test文件(內(nèi)容:hello K3s)驼仪,read-container 則在啟動后掸犬,讀取/shared_directory 的test 文件。
2)示例驗證
#先通過kubectl 引入volume-test.yml 文件
ubuntu@server:~/$ sudo kubectl apply -f volume-test.yml
pod/shared-pod created
#驗證pod 是否成功創(chuàng)建
ubuntu@server:~/$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
shared-pod 2/2 Running 0 37s
#驗證 read-container 容器讀取結(jié)果
ubuntu@server:~/demo-volume$ sudo kubectl logs shared-pod read-container
#驗證成功
hello K3s
上述顯示容器read-container成功讀到了write-container容器寫入的數(shù)據(jù)绪爸,驗證了兩個容器共享emptyDir Volume,其效果相當(dāng)于執(zhí)行了docker run -v /write_directory 和/docker run -v /read_directory湾碎。
HostPath(節(jié)點存儲卷)
hostPath類型的存儲卷是指將工作節(jié)點上某個文件系統(tǒng)的目錄或文件掛載于Pod中的一種存儲卷,它獨立于Pod資源的生命周期奠货,因而具有持久性介褥。但由于這樣的特征增加了了Pod與工作節(jié)點的耦合,在實際的場景應(yīng)用中都不會選擇此項递惋。作為分布式的應(yīng)用部署柔滔,更應(yīng)該把持久化的目標(biāo)獨立于工作節(jié)點之外。
HostPath 與emptyDir 的使用方法相似萍虽,同時網(wǎng)上的資料也較多睛廊,這里就不再做示例演示。
PV & PVC
使用外部存儲作為資源持久化目標(biāo)是最理想方案杉编,如果kubenetes部署在阿里云超全、AWS、Azure等公有云上王财,可以直接使用云盤作為Volume卵迂。 同樣我們也可以創(chuàng)建NFS(網(wǎng)絡(luò)文件系統(tǒng)),使用PV把NFS引入到Pod去绒净。
①NFS for PV
先準(zhǔn)備NFS網(wǎng)絡(luò)盤见咒,NFS服務(wù)具體部署請參照:http://www.reibang.com/p/a5d5d9afa1eb
在此,筆者已經(jīng)準(zhǔn)備好NFS服務(wù)器:挂疆,可分享目錄路徑:改览。
②部署示例應(yīng)用
#本地終端下翎,進入server節(jié)點容器的命令
multipass shell server
#進入容器后,先創(chuàng)建文件:nfs-pv.yml
sudo vi nfs-pv.yml
#nfs-pv.yml 的內(nèi)容
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 1Gi #指定PV的容量為1GB
accessModes:
- ReadWriteOnce #表示PV能為read-write模式mount到單個節(jié)點宝当,ReadOnlyMany表示只讀视事,mount到多個節(jié)點,ReadWriteMany表示讀寫可以mount到多節(jié)點
persistentVolumeReclaimPolicy: Recycle #PV的回收策略庆揩,清除PV中的數(shù)據(jù)俐东,Retain表示管理員手工回收
storageClassName: nfs-storage #指定PV的class為nfs-storage,相當(dāng)于為PV設(shè)置了一個分類订晌,PVC可以指定class申請相應(yīng)的PV
nfs:
path: /nfsdata/share #指定PV在NFS服務(wù)器上對應(yīng)的目錄
server: 192.168.64.12
引用PV虏辫,并且驗證。
#引入
ubuntu@server:~$ sudo kubectl apply -f nfs-pv.yml
#輸出成功結(jié)果
persistentvolume/nfs-pv created
#驗證
ubuntu@server:~$ sudo kubectl get pv -o wide
#輸出結(jié)果
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
nfs-pv 1Gi RWO Recycle Available nfs-storage 36s Filesystem
創(chuàng)建PVC
sudo vi nfs-pvc.yml
#nfs-pvc.yml 的內(nèi)容
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pv
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-storage #與之前PV的storageClassName 一致
引用PVC锈拨,并且驗證砌庄。
#引入
ubuntu@server:~$ sudo kubectl apply -f nfs-pvc.yml
#輸出成功結(jié)果
persistentvolumeclaim/nfs-pvc created
#驗證
ubuntu@server:~$ sudo kubectl get pvc -o wide
#輸出結(jié)果
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
nfs-pv Bound nfs-pv 1Gi RWO nfs-storage 38s Filesystem
那么,可以創(chuàng)建新的Pod 進行驗證了奕枢。
③在Pod 中使用PVC
sudo vi nfs-pod.yml
#nfs-pod.yml 的內(nèi)容
apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- name: pv-pod
image: busybox
args:
- /bin/sh
- -c
- sleep 180000
volumeMounts:
- mountPath: "/pod_data"
name: nfs-storage
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: nfs-pv
最后測試驗證
#引入
ubuntu@server:~$ sudo kubectl apply -f nfs-pod.yml
#輸出結(jié)果
pod/pv-pod created
[root@k8s-node1 nfs-pv]# sudo kubectl get pod -o wide
#輸出結(jié)果
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pv-pod 0/1 Running 0 34s <none> <none> <none> <none>
#類似docker exec 的執(zhí)行操作娄昆,直接進入pod 的sh
ubuntu@server:~$ sudo kubectl exec -it pv-pod /bin/sh
#在容器中,執(zhí)行如下命令
/ # cat /pod_data/text.txt
#輸出結(jié)果
Hello NFS缝彬!
#在部署NFS網(wǎng)絡(luò)文件系統(tǒng)一章
#地址:http://www.reibang.com/p/a5d5d9afa1eb
#筆者已在NFS服務(wù)器:192.168.64.12 的目錄/nfsdata/share創(chuàng)建了text.txt文件萌焰。
不需要使用PV時,可用刪除PVC回收PV
ubuntu@server:~$# kubectl delete pvc pv-pod
persistentvolumeclaim "pv-pod" deleted
因PV的回收策略設(shè)置為Recycle跌造,所以數(shù)據(jù)會被清除杆怕,如想保存數(shù)據(jù),可以將策略設(shè)置為Retain壳贪。
本章結(jié)束陵珍!