存儲對于一個集群很重要冰啃,沒有可靠的存儲集群的就不能通供持續(xù)有狀態(tài)的服務(wù)。
今天我要講的是K8S中exmptydir,nfs,pv+pvc(推薦)區(qū)別和用法刘莹。
emptyDir:
emptydir存儲方式是在節(jié)點(diǎn)上創(chuàng)建一個空間用于存儲Pod數(shù)據(jù)亿笤,需要注意的是如果Pod掛了數(shù)據(jù)會被刪除一般用于臨時(shí)存儲,支持把節(jié)點(diǎn)上的內(nèi)存空間分配給Pod使用栋猖。
例子:
apiVersion: v1
kind: Pod
mentadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
volumeMounts:
- name: www-db
mountPath: /data/www/
- name: date
image: busybox
volumeMounts:
- name: www-db
mountPath: /data/
command: ["/bin/sh","while true; do echo $(date) > /data/index.html; done"]
volumes:
- name: www-db
emptyDir: {}
#emptyDir:沒加字段需要“{}”
date容器為nginx容器創(chuàng)造index.html內(nèi)容净薛,從中可以看出雖然他們是連個獨(dú)立的容器但使用了一個存儲。
hostPath:
如果你需要Pod掛掉后數(shù)據(jù)不被清空你可以使用hostPath蒲拉,hostPath和emptyDir類似只是他不會在Pod掛掉后請數(shù)據(jù)肃拜。
例子:
apiVersion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
volumeMounts:
- name: db
mountPath: /data/www/
volumes:
- name: db
hostPath:
path: /data/www/
type: DirectoryOrCrate
#type:如果/data/www/不存在會自動創(chuàng)建,如果是Directory的話就不會自動創(chuàng)建(file&fileOrCreate)雌团。
nfs:
上面兩個存儲方式都有一個弊端就是如果節(jié)點(diǎn)掛了數(shù)據(jù)怎么辦呢燃领?更為安全的方式是把數(shù)據(jù)放在集群外保管。我們用nfs來實(shí)現(xiàn)這個功能锦援。
例子:
yum install -y nfs-utils
#需要在節(jié)點(diǎn)上和存儲服務(wù)上安裝nfs-utils軟件包
mkdir /data/v1 -p
#創(chuàng)建你想共享的文件夾猛蔽,并寫進(jìn)配置文件中(/etc/exports)
#在/etc/exports添加
/data/v1 192.168.1.0/24(rw,no_root_squash)
#你可以下節(jié)點(diǎn)上先掛載,看nfs是否正常
mount -t nfs 192.168.1.1:/data/v1 /data
#掛載成功就可以用umount卸載,開始編寫Pod
apiVersion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
volumeMounts:
- name: db
mountPath: /data/www/
volumes:
- name: db
nfs:
server: 192.168.1.1
path: /data/v1
這樣子我們就把Pod的存儲外置了。
注:簡單介紹gitRepo存儲方式曼库,這種是把數(shù)據(jù)存儲在git倉庫中節(jié)點(diǎn)上要有g(shù)it工具区岗,需要注意的是這種方式只會在創(chuàng)建Pod的時(shí)候會從git倉庫獲取最新數(shù)據(jù),如果Pod正在運(yùn)行倉庫有更新也不會更新到Pod中毁枯。
pvc&pv
其實(shí)上面這幾種存儲方式在生產(chǎn)環(huán)境中都是不可用的慈缔,nfs雖好但他沒有冗余如果nfs服務(wù)器炸了是不是數(shù)據(jù)就沒了?但我有冗余功能的存儲系統(tǒng)又不是很容易就可以搭建起來种玛,所以K8S給這種情況準(zhǔn)備了pvc&pv藐鹤。
PersistentVolume (PV) :是外部存儲系統(tǒng)中的一塊存儲空間,由管理員創(chuàng)建和維護(hù)赂韵。與 Volume 一樣娱节,PV 具有持久性,生命周期獨(dú)立于 Pod祭示。
PersistentVolumeClaim (PVC) :是對 PV 的申請 (Claim)括堤。PVC 通常由普通用戶創(chuàng)建和維護(hù)。需要為 Pod 分配存儲資源時(shí)绍移,用戶可以創(chuàng)建一個 PVC悄窃,指明存儲資源的容量大小和訪問模式(比如只讀)等信息,Kubernetes 會查找并提供滿足條件的 PV蹂窖。
PV和PVC是一對一的關(guān)系轧抗,PVC和Pod可以一對多具體需要看配置。
PV例子:
apiVersion: v1
kind: PersistentVolume
metadata:
name: db-pv1
spec:
capacity:
storage: 1Gi #有i表示1000MB=1GB瞬测,無i表示1024MB=1GB
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/v1
server: 192.168.1.1
#capacity 指定 PV 的容量為 1G横媚。
#accessModes 指定訪問模式為 ReadWriteOnce,支持的訪問模式有:
#ReadWriteOnce – PV 能以讀寫模式一對一月趟。
#ReadOnlyMany – PV 能以只讀模式一對多灯蝴。
#ReadWriteMany – PV 能以讀寫模式一對多。
#persistentVolumeReclaimPolicy指定當(dāng) PV 的回收策略為 Recycle孝宗,支持的策略有:
#Retain – 需要管理員手工回收穷躁。
#Recycle – 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*因妇。
#Delete – 刪除 Storage Provider 上的對應(yīng)存儲資源问潭,例如 AWS EBS、GCE PD婚被、Azure Disk狡忙、#OpenStack Cinder Volume 等。
PVC例子:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
#accessModes:需要什么類型的PV
#storage:多大的空間
Pod例子:
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1,12
volumeMounts:
- name: db
mountPath: "/data/www"
volumes:
- name: db
persistentVolumeClaim:
claimName: db-pv1