kubectl 创建pvc_k8s的持久化存储PVPVC
1.PV和PVC的引入
Volume 提供了非常好的數(shù)據(jù)持久化方案,不過(guò)在可管理性上還有不足。
拿前面 AWS EBS 的例子來(lái)說(shuō),要使用 Volume,Pod 必須事先知道如下信息:
當(dāng)前 Volume 來(lái)自 AWS EBS。
EBS Volume 已經(jīng)提前創(chuàng)建,并且知道確切的 volume-id。
Pod 通常是由應(yīng)用的開(kāi)發(fā)人員維護(hù),而 Volume 則通常是由存儲(chǔ)系統(tǒng)的管理員維護(hù)。開(kāi)發(fā)人員要獲得上面的信息:
要么詢問(wèn)管理員。
要么自己就是管理員。
這樣就帶來(lái)一個(gè)管理上的問(wèn)題:應(yīng)用開(kāi)發(fā)人員和系統(tǒng)管理員的職責(zé)耦合在一起了。如果系統(tǒng)規(guī)模較小或者對(duì)于開(kāi)發(fā)環(huán)境這樣的情況還可以接受。但當(dāng)集群規(guī)模變大,特別是對(duì)于生成環(huán)境,考慮到效率和安全性,這就成了必須要解決的問(wèn)題。
Kubernetes 給出的解決方案是 PersistentVolume 和 PersistentVolumeClaim。
PersistentVolume (PV) 是外部存儲(chǔ)系統(tǒng)中的一塊存儲(chǔ)空間,由管理員創(chuàng)建和維護(hù)。與 Volume 一樣,PV 具有持久性,生命周期獨(dú)立于 Pod。
PersistentVolumeClaim (PVC) 是對(duì) PV 的申請(qǐng) (Claim)。PVC 通常由普通用戶創(chuàng)建和維護(hù)。需要為 Pod 分配存儲(chǔ)資源時(shí),用戶可以創(chuàng)建一個(gè) PVC,指明存儲(chǔ)資源的容量大小和訪問(wèn)模式(比如只讀)等信息,Kubernetes 會(huì)查找并提供滿足條件的 PV。
有了 PersistentVolumeClaim,用戶只需要告訴 Kubernetes 需要什么樣的存儲(chǔ)資源,而不必關(guān)心真正的空間從哪里分配,如何訪問(wèn)等底層細(xì)節(jié)信息。這些 Storage Provider 的底層信息交給管理員來(lái)處理,只有管理員才應(yīng)該關(guān)心創(chuàng)建 PersistentVolume 的細(xì)節(jié)信息。
2.通過(guò)NFS實(shí)現(xiàn)持久化存儲(chǔ)
2.1配置nfs
k8s-master? nfs-server
k8s-node1? k8s-node2?nfs-client
所有節(jié)點(diǎn)安裝nfs
yum install -y nfs-common nfs-utils
在master節(jié)點(diǎn)創(chuàng)建共享目錄
[root@k8s-master k8s]# mkdir /nfsdata
授權(quán)共享目錄
[root@k8s-master k8s]# chmod 666 /nfsdata
編輯exports文件
[root@k8s-master k8s]# cat /etc/exports/nfsdata *(rw,no_root_squash,no_all_squash,sync)
配置生效
[root@k8s-master k8s]# export -r
啟動(dòng)rpc和nfs(注意順序)
[root@k8s-master k8s]# systemctl start rpcbind
[root@k8s-master k8s]# systemctl start nfs
作為準(zhǔn)備工作,我們已經(jīng)在 k8s-master 節(jié)點(diǎn)上搭建了一個(gè) NFS 服務(wù)器,目錄為?/nfsdata:
2.2創(chuàng)建PV
下面創(chuàng)建一個(gè) PV?mypv1,配置文件?nfs-pv1.yml?如下:
①?capacity?指定 PV 的容量為 1G。
②?accessModes?指定訪問(wèn)模式為?ReadWriteOnce,支持的訪問(wèn)模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到單個(gè)節(jié)點(diǎn)。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多個(gè)節(jié)點(diǎn)。
ReadWriteMany – PV 能以 read-write 模式 mount 到多個(gè)節(jié)點(diǎn)。
③?persistentVolumeReclaimPolicy?指定當(dāng) PV 的回收策略為?Recycle,支持的策略有:
Retain – 需要管理員手工回收。
Recycle – 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行?rm -rf /thevolume/*。
Delete – 刪除 Storage Provider 上的對(duì)應(yīng)存儲(chǔ)資源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。
④?storageClassName?指定 PV 的 class 為?nfs。相當(dāng)于為 PV 設(shè)置了一個(gè)分類,PVC 可以指定 class 申請(qǐng)相應(yīng) class 的 PV。
⑤ 指定 PV 在 NFS 服務(wù)器上對(duì)應(yīng)的目錄。
創(chuàng)建?mypv1:
STATUS?為?Available,表示?mypv1?就緒,可以被 PVC 申請(qǐng)。
2.3創(chuàng)建PVC
接下來(lái)創(chuàng)建 PVC?mypvc1,配置文件?nfs-pvc1.yml?如下:
PVC 就很簡(jiǎn)單了,只需要指定 PV 的容量,訪問(wèn)模式和 class。
執(zhí)行命令創(chuàng)建?mypvc1:
從?kubectl get pvc?和?kubectl get pv?的輸出可以看到?mypvc1?已經(jīng) Bound 到?mypv1,申請(qǐng)成功。
2.4創(chuàng)建pod
上面已經(jīng)創(chuàng)建好了pv和pvc,pod中直接使用這個(gè)pvc即可
與使用普通 Volume 的格式類似,在?volumes?中通過(guò)?persistentVolumeClaim?指定使用?mypvc1?申請(qǐng)的 Volume。
通過(guò)命令創(chuàng)建mypod1:
2.5驗(yàn)證
可見(jiàn),在 Pod 中創(chuàng)建的文件?/mydata/hello?確實(shí)已經(jīng)保存到了 NFS 服務(wù)器目錄?/nfsdata中。
如果不再需要使用 PV,可用刪除 PVC 回收 PV。
3.PV的回收
當(dāng) PV 不再需要時(shí),可通過(guò)刪除 PVC 回收。
未刪除pvc之前? pv的狀態(tài)是Bound
刪除pvc之后pv的狀態(tài)變?yōu)锳vailable,,此時(shí)解除綁定后則可以被新的 PVC 申請(qǐng)。
/nfsdata文件中的文件被刪除了
因?yàn)?PV 的回收策略設(shè)置為?Recycle,所以數(shù)據(jù)會(huì)被清除,但這可能不是我們想要的結(jié)果。如果我們希望保留數(shù)據(jù),可以將策略設(shè)置為?Retain。
通過(guò)?kubectl apply?更新 PV:
回收策略已經(jīng)變?yōu)?Retain,通過(guò)下面步驟驗(yàn)證其效果:
① 重新創(chuàng)建?mypvc1。
② 在?mypv1?中創(chuàng)建文件?hello。
③?mypv1?狀態(tài)變?yōu)?Released。
④?PV 中的數(shù)據(jù)被完整保留。
雖然?mypv1?中的數(shù)據(jù)得到了保留,但其 PV 狀態(tài)會(huì)一直處于?Released,不能被其他 PVC 申請(qǐng)。為了重新使用存儲(chǔ)資源,可以刪除并重新創(chuàng)建?mypv1。刪除操作只是刪除了 PV 對(duì)象,存儲(chǔ)空間中的數(shù)據(jù)并不會(huì)被刪除。
新建的?mypv1?狀態(tài)為?Available,已經(jīng)可以被 PVC 申請(qǐng)。
PV 還支持?Delete?的回收策略,會(huì)刪除 PV 在 Storage Provider 上對(duì)應(yīng)存儲(chǔ)空間。NFS 的 PV 不支持?Delete,支持?Delete?的 Provider 有 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。
4.PV的動(dòng)態(tài)供給
前面的例子中,我們提前創(chuàng)建了 PV,然后通過(guò) PVC 申請(qǐng) PV 并在 Pod 中使用,這種方式叫做靜態(tài)供給(Static Provision)。
與之對(duì)應(yīng)的是動(dòng)態(tài)供給(Dynamical Provision),即如果沒(méi)有滿足 PVC 條件的 PV,會(huì)動(dòng)態(tài)創(chuàng)建 PV。相比靜態(tài)供給,動(dòng)態(tài)供給有明顯的優(yōu)勢(shì):不需要提前創(chuàng)建 PV,減少了管理員的工作量,效率高。
動(dòng)態(tài)供給是通過(guò) StorageClass 實(shí)現(xiàn)的,StorageClass 定義了如何創(chuàng)建 PV,下面是兩個(gè)例子。
StorageClass?standard:
StorageClass?slow:
這兩個(gè) StorageClass 都會(huì)動(dòng)態(tài)創(chuàng)建 AWS EBS,不同在于?standard?創(chuàng)建的是?gp2?類型的 EBS,而?slow?創(chuàng)建的是?io1?類型的 EBS。不同類型的 EBS 支持的參數(shù)可參考 AWS 官方文檔。
StorageClass 支持?Delete?和?Retain?兩種?reclaimPolicy,默認(rèn)是?Delete。
與之前一樣,PVC 在申請(qǐng) PV 時(shí),只需要指定 StorageClass 和容量以及訪問(wèn)模式,比如:
5.PV&&PVC在應(yīng)用在mysql的持久化存儲(chǔ)
下面演示如何為 MySQL 數(shù)據(jù)庫(kù)提供持久化存儲(chǔ),步驟為:
創(chuàng)建 PV 和 PVC。
部署 MySQL。
向 MySQL 添加數(shù)據(jù)。
模擬節(jié)點(diǎn)宕機(jī)故障,Kubernetes 將 MySQL 自動(dòng)遷移到其他節(jié)點(diǎn)。
驗(yàn)證數(shù)據(jù)一致性。
首先創(chuàng)建 PV 和 PVC,配置如下:
mysql-pv.yml
mysql-pvc.yml
創(chuàng)建?mysql-pv?和?mysql-pvc:
接下來(lái)部署 MySQL,配置文件如下:
PVC?mysql-pvc?Bound 的 PV?mysql-pv?將被 mount 到 MySQL 的數(shù)據(jù)目錄?var/lib/mysql。
MySQL 被部署到?k8s-node2,下面通過(guò)客戶端訪問(wèn) Service?mysql:
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
更新數(shù)據(jù)庫(kù):
① 切換到數(shù)據(jù)庫(kù) mysql。
② 創(chuàng)建數(shù)據(jù)庫(kù)表 my_id。
③ 插入一條數(shù)據(jù)。
④ 確認(rèn)數(shù)據(jù)已經(jīng)寫(xiě)入。
關(guān)閉?k8s-node2,模擬節(jié)點(diǎn)宕機(jī)故障。
驗(yàn)證數(shù)據(jù)的一致性:
由于node2節(jié)點(diǎn)已經(jīng)宕機(jī),node1節(jié)點(diǎn)接管了這個(gè)任務(wù)。
通過(guò)kubectl?run?命令?進(jìn)入node1的這個(gè)pod里,查看數(shù)據(jù)是否依舊存在
MySQL 服務(wù)恢復(fù),數(shù)據(jù)也完好無(wú)損。
6.小結(jié)
本章我們討論了 Kubernetes 如何管理存儲(chǔ)資源。
emptyDir 和 hostPath 類型的 Volume 很方便,但可持久性不強(qiáng),Kubernetes 支持多種外部存儲(chǔ)系統(tǒng)的 Volume。
PV 和 PVC 分離了管理員和普通用戶的職責(zé),更適合生產(chǎn)環(huán)境。我們還學(xué)習(xí)了如何通過(guò) StorageClass 實(shí)現(xiàn)更高效的動(dòng)態(tài)供給。
最后,我們演示了如何在 MySQL 中使用 PersistentVolume 實(shí)現(xiàn)數(shù)據(jù)持久性。
總結(jié)
以上是生活随笔為你收集整理的kubectl 创建pvc_k8s的持久化存储PVPVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: deepin终端编译c程序_Deepin
- 下一篇: c++ 0x8000ffff灾难性故障_