Kubernetes中使用PersistentVolume掛載云盤方式
Kubernetes中可用將本地磁盤作為存儲掛載到容器上,但這樣做的弊端是當容器出現(xiàn)異常而重啟之后數(shù)據(jù)也會隨之消失
spec: containers: - name: logs # 掛載 volumeMounts: - name: varlog mountPath: /tmp/log # 定義本地存儲 volumes: - name: varlog hostPath: path: /var/log
為了實現(xiàn)容器存儲與計算的分離,可將容器的數(shù)據(jù)單獨存放到**網絡共享存儲(Network File System,NFS)**服務器上,當容器掛掉之后并不會影響到數(shù)據(jù),之后容器重啟或一個新的容器連接到服務器后可以重新讀取到數(shù)據(jù)
1 NFS的使用
首先需要將一臺服務器配置為NFS服務器
# 安裝nfs yum install -y nfs-utils # 創(chuàng)建存放數(shù)據(jù)的目錄 mkdir -p /data/nfs # 創(chuàng)建并設置掛載路徑 vim /etc/exports /data/nfs *(rw,no_root_squash) # 啟動服務 systemctl start nfs
之后在K8s集群的Node節(jié)點上也安裝nfs服務
yum install -y nfs-utils
最后就可以使用nfs作為數(shù)據(jù)掛載點了,在其中定義nfs服務器的地址server
和其上面的存儲路徑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ù)掛載點 - name: mynfs nfs: server: 192.168.44.134 path: /data/nfs
2 PV與PVC
上面的nfs掛載時ip 和端口是直接寫在容器yaml文件中的,這樣管理起來可能不方便。PV 和 PVC 是持久性存儲的概念,它們可幫助我們在集群中管理持久性存儲,使數(shù)據(jù)更加穩(wěn)定可靠:
1.PV(Persistent Volume):一個抽象的存儲資源,可以由管理員預先設置,并由集群中的一個 Pod 來使用。它可以是磁盤,NFS 共享或云存儲等存儲資源。PV 可以被動態(tài)或靜態(tài)地綁定到一個 PVC 上,以供 Pod 使用。
2.PVC(Persistent Volume Claim):一個聲明,它請求一個特定的 PV 資源。PVC 定義了我們所需的存儲容量、訪問模式、數(shù)據(jù)持久性和其他細節(jié),從而與 PV 進行匹配。當 PVC 綁定到 PV 上時,它就可以被 Pod 使用了。
2.1 使用
如下所示PV定義文件mypv.yaml,在其中定義其存儲大小、路徑等信息,通過kubectl apply -f mypv.yaml
創(chuàng)建PV
apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: # 定義PV的存儲路徑 path: /k8s/nfs server: 192.168.44.134
創(chuàng)建PVC,系統(tǒng)會自動選擇合適的PV分配給它進行綁定,可以在其中定義需要的存儲容量、訪問模式等信息
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: # 訪問模式;描述用戶應用對存儲資源的訪問權限 accessModes: - ReadWriteMany resources: requests: # 資源請求的存儲大小 storage: 5Gi
其中,accessModes有如下三種模式
- RWO:ReadWriteOnce,僅允許單個節(jié)點掛載進行讀寫;
- ROX:ReadOnlyMany,允許多個節(jié)點掛載且只讀;
- RWX:ReadWriteMany,允許多個節(jié)點掛載進行讀寫;
最后在創(chuàng)建容器時就可以通過PVC的方式掛載存儲,不必關心其底層存儲PV的實現(xiàn)細節(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)就會變?yōu)?code>Bound,PVC一共有如下幾種狀態(tài):
- Available: 可用狀態(tài),無PV綁定;
- Bound:綁定狀態(tài),已經和某個PV綁定;
- Released:釋放狀態(tài),被綁定的PV已刪除,資源釋放,但沒有被集群回收;
- Failed:失敗狀態(tài),自動資源回收失?。?/li>
如下所示,容器Pod經過PVC -> PV 使用存儲資源,其生命周期可以分為供應、綁定、使用、釋放和回收
- 資源供應:通過PV建立對不同磁盤資源的描述,提供PV資源給消費者使用
- 資源綁定:創(chuàng)建好PVC后,PVC會在已存在的PV中選擇合適的PV進行綁定,綁定成功,狀態(tài)變成Bound,且該PV被對應的PVC獨占綁定,不可以再被其他PVC綁定,除非該PVC釋放。若在k8s系統(tǒng)中沒有找到合適的PV,則PVC一直處于Pending狀態(tài)。
- 資源使用:在通過Deployment創(chuàng)建容器時,在spec.template.spec.volumes進行磁盤掛載時選擇persistentVolumeClaim掛載到對應的PVC。
- 資源釋放:刪除PVC,與該PVC綁定的PV狀態(tài)就會變成“Released”,該PVC在存儲設備上的數(shù)據(jù)刪除后,對應的PV才能與其他的PVC進行綁定。
- 資源回收:PV中可以通過spec.persistentVolumeReclaimPolicy設置回收策略,用于在綁定的PVC刪除后,資源釋放后如何處理PVC寫入存儲設備的數(shù)據(jù):
- Retain:保留,刪除PVC后,PV保留數(shù)據(jù);
- Recycle:回收空間,刪除PVC后,簡單的清除文件;(NFS和HostPath存儲支持)
- Delete:刪除,刪除PVC后,與PV相連接的后端存儲會刪除數(shù)據(jù);(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)
2.3 PV與PVC的綁定
PV與PVC之間可以通過靜態(tài)綁定或者動態(tài)綁定建立連接:
- 靜態(tài)模式就是集群管理員預先創(chuàng)建對應的PV對存儲特性進行設置;
- 動態(tài)模式就是管理員預先創(chuàng)建好
StorageClass
資源對后端存儲進行描述,PVC創(chuàng)建時對存儲類型進行聲明,k8s會自動創(chuàng)建合適的PV與PVC進行綁定。
手動綁定
如下所示,首先定義一個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標簽匹配上面定義的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: # 手動進行綁定 matchLabels: pv: test-pv1
動態(tài)綁定
上面的手動綁定無法根據(jù)PVC的訪問模式,容量大小等實際需要靈活地匹配到合適的PV,每次去手動選擇或創(chuàng)建PV會變得十分繁瑣。
這時可以通過StorageClass根據(jù)pvc定義的來動態(tài)創(chuàng)建合適的pv,不僅節(jié)省了管理員的時間,還可以封裝不同類型的存儲供pvc選用。
如下所示通過StorageClass將PVC和PV進行自動綁定的過程
首先創(chuàng)建一個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)建成功之后,隨之自動創(chuà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
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
理解k8s控制器DaemonSet創(chuàng)建及使用場景
這篇文章主要為大家介紹了k8s控制器DaemonSet創(chuàng)建及使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09