Kubernetes中使用PersistentVolume掛載云盤方式
Kubernetes中可用將本地磁盤作為存儲(chǔ)掛載到容器上,但這樣做的弊端是當(dāng)容器出現(xiàn)異常而重啟之后數(shù)據(jù)也會(huì)隨之消失
spec: containers: - name: logs # 掛載 volumeMounts: - name: varlog mountPath: /tmp/log # 定義本地存儲(chǔ) volumes: - name: varlog hostPath: path: /var/log
為了實(shí)現(xiàn)容器存儲(chǔ)與計(jì)算的分離,可將容器的數(shù)據(jù)單獨(dú)存放到**網(wǎng)絡(luò)共享存儲(chǔ)(Network File System,NFS)**服務(wù)器上,當(dāng)容器掛掉之后并不會(huì)影響到數(shù)據(jù),之后容器重啟或一個(gè)新的容器連接到服務(wù)器后可以重新讀取到數(shù)據(jù)
1 NFS的使用
首先需要將一臺(tái)服務(wù)器配置為NFS服務(wù)器
# 安裝nfs yum install -y nfs-utils # 創(chuàng)建存放數(shù)據(jù)的目錄 mkdir -p /data/nfs # 創(chuàng)建并設(shè)置掛載路徑 vim /etc/exports /data/nfs *(rw,no_root_squash) # 啟動(dòng)服務(wù) systemctl start nfs
之后在K8s集群的Node節(jié)點(diǎn)上也安裝nfs服務(wù)
yum install -y nfs-utils
最后就可以使用nfs作為數(shù)據(jù)掛載點(diǎn)了,在其中定義nfs服務(wù)器的地址server
和其上面的存儲(chǔ)路徑path
。
通過如下配置文件就將pod中的 /usr/share/nginx/html 掛載到了 192.168.44.134/data/nfs
spec: containers: - name: nginx image: nginx volumeMounts: # 掛載nfs - name: mynfs mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: # 定義nfs數(shù)據(jù)掛載點(diǎn) - name: mynfs nfs: server: 192.168.44.134 path: /data/nfs
2 PV與PVC
上面的nfs掛載時(shí)ip 和端口是直接寫在容器yaml文件中的,這樣管理起來可能不方便。PV 和 PVC 是持久性存儲(chǔ)的概念,它們可幫助我們?cè)诩褐泄芾沓志眯源鎯?chǔ),使數(shù)據(jù)更加穩(wěn)定可靠:
1.PV(Persistent Volume):一個(gè)抽象的存儲(chǔ)資源,可以由管理員預(yù)先設(shè)置,并由集群中的一個(gè) Pod 來使用。它可以是磁盤,NFS 共享或云存儲(chǔ)等存儲(chǔ)資源。PV 可以被動(dòng)態(tài)或靜態(tài)地綁定到一個(gè) PVC 上,以供 Pod 使用。
2.PVC(Persistent Volume Claim):一個(gè)聲明,它請(qǐng)求一個(gè)特定的 PV 資源。PVC 定義了我們所需的存儲(chǔ)容量、訪問模式、數(shù)據(jù)持久性和其他細(xì)節(jié),從而與 PV 進(jìn)行匹配。當(dāng) PVC 綁定到 PV 上時(shí),它就可以被 Pod 使用了。
2.1 使用
如下所示PV定義文件mypv.yaml,在其中定義其存儲(chǔ)大小、路徑等信息,通過kubectl apply -f mypv.yaml
創(chuàng)建PV
apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: # 定義PV的存儲(chǔ)路徑 path: /k8s/nfs server: 192.168.44.134
創(chuàng)建PVC,系統(tǒng)會(huì)自動(dòng)選擇合適的PV分配給它進(jìn)行綁定,可以在其中定義需要的存儲(chǔ)容量、訪問模式等信息
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: # 訪問模式;描述用戶應(yīng)用對(duì)存儲(chǔ)資源的訪問權(quán)限 accessModes: - ReadWriteMany resources: requests: # 資源請(qǐng)求的存儲(chǔ)大小 storage: 5Gi
其中,accessModes有如下三種模式
- RWO:ReadWriteOnce,僅允許單個(gè)節(jié)點(diǎn)掛載進(jìn)行讀寫;
- ROX:ReadOnlyMany,允許多個(gè)節(jié)點(diǎn)掛載且只讀;
- RWX:ReadWriteMany,允許多個(gè)節(jié)點(diǎn)掛載進(jìn)行讀寫;
最后在創(chuàng)建容器時(shí)就可以通過PVC的方式掛載存儲(chǔ),不必關(guān)心其底層存儲(chǔ)PV的實(shí)現(xiàn)細(xì)節(jié)
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dep1 spec: template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot # 掛載到my-pvc persistentVolumeClaim: claimName: my-pvc
2.2 PV和PVC的生命周期
如圖所示,PVC在與PV綁定之后狀態(tài)就會(huì)變?yōu)?code>Bound,PVC一共有如下幾種狀態(tài):
- Available: 可用狀態(tài),無PV綁定;
- Bound:綁定狀態(tài),已經(jīng)和某個(gè)PV綁定;
- Released:釋放狀態(tài),被綁定的PV已刪除,資源釋放,但沒有被集群回收;
- Failed:失敗狀態(tài),自動(dòng)資源回收失??;
如下所示,容器Pod經(jīng)過PVC -> PV 使用存儲(chǔ)資源,其生命周期可以分為供應(yīng)、綁定、使用、釋放和回收
- 資源供應(yīng):通過PV建立對(duì)不同磁盤資源的描述,提供PV資源給消費(fèi)者使用
- 資源綁定:創(chuàng)建好PVC后,PVC會(huì)在已存在的PV中選擇合適的PV進(jìn)行綁定,綁定成功,狀態(tài)變成Bound,且該P(yáng)V被對(duì)應(yīng)的PVC獨(dú)占綁定,不可以再被其他PVC綁定,除非該P(yáng)VC釋放。若在k8s系統(tǒng)中沒有找到合適的PV,則PVC一直處于Pending狀態(tài)。
- 資源使用:在通過Deployment創(chuàng)建容器時(shí),在spec.template.spec.volumes進(jìn)行磁盤掛載時(shí)選擇persistentVolumeClaim掛載到對(duì)應(yīng)的PVC。
- 資源釋放:刪除PVC,與該P(yáng)VC綁定的PV狀態(tài)就會(huì)變成“Released”,該P(yáng)VC在存儲(chǔ)設(shè)備上的數(shù)據(jù)刪除后,對(duì)應(yīng)的PV才能與其他的PVC進(jìn)行綁定。
- 資源回收:PV中可以通過spec.persistentVolumeReclaimPolicy設(shè)置回收策略,用于在綁定的PVC刪除后,資源釋放后如何處理PVC寫入存儲(chǔ)設(shè)備的數(shù)據(jù):
- Retain:保留,刪除PVC后,PV保留數(shù)據(jù);
- Recycle:回收空間,刪除PVC后,簡單的清除文件;(NFS和HostPath存儲(chǔ)支持)
- Delete:刪除,刪除PVC后,與PV相連接的后端存儲(chǔ)會(huì)刪除數(shù)據(jù);(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)
2.3 PV與PVC的綁定
PV與PVC之間可以通過靜態(tài)綁定或者動(dòng)態(tài)綁定建立連接:
- 靜態(tài)模式就是集群管理員預(yù)先創(chuàng)建對(duì)應(yīng)的PV對(duì)存儲(chǔ)特性進(jìn)行設(shè)置;
- 動(dòng)態(tài)模式就是管理員預(yù)先創(chuàng)建好
StorageClass
資源對(duì)后端存儲(chǔ)進(jìn)行描述,PVC創(chuàng)建時(shí)對(duì)存儲(chǔ)類型進(jìn)行聲明,k8s會(huì)自動(dòng)創(chuàng)建合適的PV與PVC進(jìn)行綁定。
手動(dòng)綁定
如下所示,首先定義一個(gè)test-pv1
[root@k8s /pv_test]# vim test_pv1.yaml apiVersion: v1 kind: PersistentVolume metadata: # 定義PV的名字 name: test-pv1 labels: pv: test-pv1 spec: capacity: storage: 2Mi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /date-nfs/k8s server: 10.139.12.14
之后定義 PVC,在其中通過spec.selector.matchLabels標(biāo)簽匹配上面定義的test-pv1
[root@k8s /pvc_test]# vim test_pvc1.yaml #persistent Volume Claim apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pvc1 namespace: t1 spec: #storageClassName: managed-nfs-storage accessModes: - ReadWriteMany resources: requests: storage: 1Mi selector: # 手動(dòng)進(jìn)行綁定 matchLabels: pv: test-pv1
動(dòng)態(tài)綁定
上面的手動(dòng)綁定無法根據(jù)PVC的訪問模式,容量大小等實(shí)際需要靈活地匹配到合適的PV,每次去手動(dòng)選擇或創(chuàng)建PV會(huì)變得十分繁瑣。
這時(shí)可以通過StorageClass根據(jù)pvc定義的來動(dòng)態(tài)創(chuàng)建合適的pv,不僅節(jié)省了管理員的時(shí)間,還可以封裝不同類型的存儲(chǔ)供pvc選用。
如下所示通過StorageClass將PVC和PV進(jìn)行自動(dòng)綁定的過程
首先創(chuàng)建一個(gè)StorageClass
[root@master1 sc]# cat nfs-sc.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: statefu-nfs namespace: default # 云盤資源提供方 provisioner: nfs-deploy reclaimPolicy: Retain [root@master1 sc]# kubectl apply -f nfs-sc.yaml storageclass.storage.k8s.io/statefu-nfs created
然后創(chuàng)建PVC,在其中配置spec.storageClassName為上面的創(chuàng)建的statefu-nfs。
[root@master1 sc]# cat test-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-claim namespace: default spec: storageClassName: statefu-nfs #sc一定要指向上面創(chuàng)建的sc名稱 accessModes: - ReadWriteMany #采用ReadWriteMany的訪問模式 resources: requests: storage: 1Gi [root@master1 sc]# kubectl apply -f test-pvc.yaml
可以看到PVC test-claim創(chuàng)建成功之后,隨之自動(dòng)創(chuàng)建了對(duì)應(yīng)的PV并且綁定到了test-claim
[root@master1 sc]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-claim Bound pvc-0b9e1107-fefc-48b9-a5ec-8f8690e94435 1Gi RWX statefu-nfs 107m [root@master1 sc]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-0b9e1107-fefc-48b9-a5ec-8f8690e94435 1Gi RWX Delete Bound default/test-claim statefu-nfs 107m
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
超詳細(xì)的Kubernetes?(k8s)常用命令整理
這篇文章主要介紹了Kubernetes?(k8s)常用命令整理的相關(guān)資料,講解了Kubernetes集群管理、節(jié)點(diǎn)資源查看、Pod管理、部署管理、命名空間管理、服務(wù)負(fù)載均衡、調(diào)試排錯(cuò)以及備份恢復(fù)等操作的命令,需要的朋友可以參考下2025-03-03K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例
Kubernetes將所有內(nèi)容抽象為資源,通過操作資源管理集群,核心單元是Pod,通過控制器管理Pod,資源管理分為命令式對(duì)象管理、命令式對(duì)象配置和聲明式對(duì)象配置,各有適用場景,需要的朋友可以參考下2024-09-09理解k8s控制器DaemonSet創(chuàng)建及使用場景
這篇文章主要為大家介紹了k8s控制器DaemonSet創(chuàng)建及使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Rainbond配置組件自動(dòng)構(gòu)建部署官方文檔講解
這篇文章主要為大家介紹了Rainbond配置組件自動(dòng)構(gòu)建部署官方文檔講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04