今天就跟大家聊聊有關(guān)怎么進(jìn)行Kubernetes靜態(tài)持久卷的探索學(xué)習(xí),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司是專業(yè)的日土網(wǎng)站建設(shè)公司,日土接單;提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行日土網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
Volume
Volume是Pod的掛載接口,生命周期同Pod,可以在Pod內(nèi)的各個Container之間進(jìn)行共享,主要用于存儲Pod生命周期內(nèi)的臨時數(shù)據(jù),當(dāng)然,也可以掛在在Host主機或者其他后端存儲介質(zhì)上實現(xiàn)永久存儲,根據(jù)選用的Volume Type可以實現(xiàn)不同的存儲需求,下邊是Volume支持的類型:
emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
azureFileVolume
azuredisk
vsphereVolume
Quobyte
此處不作一一介紹,可以參考文檔:Volume Docs。
PersistentVolume(PV)
假如有一個獨立的存儲后端,底層實現(xiàn)可以是NFS、GlusterFS、Cinder、HostPath等等,可以使用PV從中劃撥一部分資源用于kubernetes的存儲需求,其生命周期不依賴于Pod,是一個獨立存在的虛擬存儲空間,但是不能直接被Pod的Volume掛載,此時需要用到PVC。
PV支持的后端存儲插件:
GCEPersistentDisk
AWSElasticBlockStore
AzureFile
AzureDisk
FC (Fibre Channel)
NFS
iSCSI
RBD (Ceph Block Device)
CephFS
Cinder (OpenStack block storage)
Glusterfs
VsphereVolume
HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
PersistentVolumeClaim(PVC)
Pod使用PV資源是通過PVC來實現(xiàn)的,PVC可以理解為資源使用請求,一個Pod需要先明確使用的資源大小、訪問方式,創(chuàng)建PVC申請?zhí)峤坏絢ubernetes中的PersistentVolume Controller,由其調(diào)度合適的PV來與PVC綁定,然后Pod中的Volume就可以通過PVC來使用PV的資源。
StorageClasse
用于定義動態(tài)PV資源調(diào)度,相比起靜態(tài)PV資源來說,動態(tài)PV不需要預(yù)先創(chuàng)建PV,而是通過PersistentVolume Controller動態(tài)調(diào)度,根據(jù)PVC的資源請求,尋找StorageClasse定義的符合要求的底層存儲來分配資源。
定義PersistentVolume
,這里使用hostPath
作為存儲底層。
kind: PersistentVolume apiVersion: v1 metadata: name: pv001 labels: release: stable spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle hostPath: path: /tmp/data
也可以使用NFS或者其他插件作為存儲底層,需要提前準(zhǔn)備好NFS Server:
Yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv002 labels: release: stable spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /tmp/data server: 172.17.0.2
capacity
用于定義PV的存儲容量,當(dāng)前只支持定義大小,未來會實現(xiàn)其他能力如:IOPS、吞吐量。
accessModes
用于定義資源的訪問方式,受限于存儲底層的支持,訪問方式包括以下幾種:
ReadWriteOnce – 被單個節(jié)點mount為讀寫rw模式
ReadOnlyMany – 被多個節(jié)點mount為只讀ro模式
ReadWriteMany – 被多個節(jié)點mount為讀寫rw模式
下邊途中列舉了k8s支持的存儲插件的訪問方式:
persistentVolumeReclaimPolicy
用于定義資源的回收方式,也首先與存儲底層的支持,現(xiàn)有的回收策略:
Retain – 手動回收
Recycle – 刪除數(shù)據(jù) (“rm -rf /thevolume/*”)
Delete – 通過存儲后端刪除卷,后端存儲例如AWS EBS, GCE PD或Cinder等。
目前只有NFS和HostPath支持Recycle策略,AWS EBS、GCE PD、Azure Disk、Cinder支持Delete策略。
注意:Recycle策略會通過運行一個busybox容器來執(zhí)行數(shù)據(jù)刪除命令,默認(rèn)定義的busybox鏡像是:gcr.io/google_containers/busybox:latest
,并且imagePullPolicy: Always
,如果需要調(diào)整配置,需要增加kube-controller-manager 啟動參數(shù):--pv-recycler-pod-template-filepath-hostpath=/etc/kubernetes/manifests/recycler.yml
Yaml apiVersion: v1 kind: Pod metadata: name: pv-recycler- namespace: default spec: restartPolicy: Never volumes: - name: vol hostPath: path: [Path of Persistent Volume hosted] containers: - name: pv-recycler image: "gcr.io/google_containers/busybox" imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/* && test -z \"$(ls -A /scrub)\" || exit 1"] volumeMounts: - name: vol mountPath: /scrub
定義PersistentVolumeClaim
。
Yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim-1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: release: stable
accessModes
與PersistentVolume的訪問方式一致,PersistentVolume Controller調(diào)度訪問方式一致PV資源與PVC綁定。
resources
用于定義申請使用的存儲資源大小,適用于kubernetes的resource模型,具體信息可以查看Resource Model docs。
selector
定義PVC申請過濾PV卷集,搭配label定義使用,同kubernetes中其他的selector概念一致,用法上稍有不同,增加了匹配選項:
matchLabels – 匹配標(biāo)簽,卷標(biāo)簽必須匹配某個值
matchExpressions – 匹配表達(dá)式,由鍵值對,操作符構(gòu)成,操作符包括 In,NotIn,Exists,和 DoesNotExist。
此外還有volume.beta.kubernetes.io/storage-class
定義,具有相同定義的PV和PVC才會綁定,具體用法可以查看PersistentVolume docs。
PV和PVC創(chuàng)建并綁定之后,類似這樣:
Bash NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pv/pv001 5Gi RWO Recycle Bound default/myclaim-1 11m NAME STATUS VOLUME CAPACITY ACCESSMODES AGE pvc/myclaim-1 Bound pv001 5Gi RWO 3s
PersistentVolume有四種狀態(tài):
Available – 可用狀態(tài)
Bound – 綁定到PVC
Released – PVC被刪掉,但是尚未回收
Failed – 自動回收失敗
掛載創(chuàng)建好的PVC:myclaim-1到Pod上:
Bash kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: myfrontend image: dockerfile/nginx volumeMounts: - mountPath: "/var/www/html" name: mypd volumes: - name: mypd persistentVolumeClaim: claimName: myclaim-1
掛載成功后,Pod所在的Host上會自動創(chuàng)建/tmp/data
用于存儲數(shù)據(jù),HostPath Volume便于測試調(diào)試,但是只適用于單節(jié)點環(huán)境,多節(jié)點環(huán)境中如果Pod漂移或者重建后不在原先節(jié)點,則無法訪問原來的數(shù)據(jù)。
看完上述內(nèi)容,你們對怎么進(jìn)行Kubernetes靜態(tài)持久卷的探索學(xué)習(xí)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。