一、數(shù)據(jù)持久化的類型:
1.emptyDir:只能作為臨時(shí)存儲使用。如果容器被刪除,數(shù)據(jù)仍然存在,如果Pod被刪除,數(shù)據(jù)也會被刪除。
2.HostPath:使用場景不多,會增加Pod與節(jié)點(diǎn)之間的耦合性。
3.PV、PVC:基于NFS服務(wù)。PV狀態(tài)必須為Available,訪問模式必須相同及存儲類的名稱必須相同。
出錯(cuò):Pod不斷的重啟:
1.swap沒有關(guān)閉,導(dǎo)致集群運(yùn)行不正常。
2.內(nèi)存不足,運(yùn)行服務(wù)也會重啟。
成都創(chuàng)新互聯(lián)專注于甘南企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站建設(shè)。甘南網(wǎng)站建設(shè)公司,為甘南等地區(qū)提供建站服務(wù)。全流程按需定制,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
注意:基于NFs創(chuàng)建PV,與PVC。
并且需要?jiǎng)?chuàng)建PV所需的宿主機(jī)目錄。
二、做實(shí)驗(yàn)類比,如果集群中存在兩個(gè)空間大小不同的PV,PVC如何跟PV關(guān)聯(lián)。
1.創(chuàng)建PV(創(chuàng)建兩個(gè)空間大小不同的PV,web-pv1和web-pv2)
1.[root@master yaml]# vim web1.yaml
2.
3.kind: PersistentVolume
4.apiVersion: v1
5.metadata:
6. name: web-pv1
7.spec:
8. accessModes:
9. - ReadWriteOnce
10. capacity:
11. storage: 1Gi
12. persistentVolumeReclaimPolicy: Recycle
13. storageClassName: nfs
14. nfs:
15. path: /nfsdata/web1
16. server: 192.168.1.1
17.
18.[root@master yaml]# mkdir /nfsdata/web1
19.[root@master yaml]# kubectl apply -f web1.yaml
20.persistentvolume/web-pv1 created
21.[root@master yaml]# kubectl get pv
22.NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
23.web-pv1 1Gi RWO Recycle Available nfs 7s
2.創(chuàng)建第二個(gè)Pv
1.[root@master yaml]# vim web2.yaml
2.kind: PersistentVolume
3.apiVersion: v1
4.metadata:
5. name: web-pv2
6.spec:
7. accessModes:
8. - ReadWriteOnce
9. capacity:
10. storage: 2Gi
11. persistentVolumeReclaimPolicy: Recycle
12. storageClassName: nfs
13. nfs:
14. path: /nfsdata/web2
15. server: 192.168.1.1
16.
17.[root@master yaml]# kubectl apply -f web2.yaml
18.persistentvolume/web-pv2 created
19.
20.[root@master yaml]# kubectl get pv
21.NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
22.web-pv1 1Gi RWO Recycle Available nfs 103s
23.web-pv2 2Gi RWO Recycle Available nfs 14s
3.創(chuàng)建PVC1.[root@master yaml]# vim web-pvc.yaml
br/>3.apiVersion: v1
4.metadata:
5. name: web-pvc
6.spec:
7. accessModes:
8. - ReadWriteOnce
9. resources:
10. requests:
11. storage: 1Gi
12. storageClassName: nfs
13.[root@master yaml]# kubectl apply -f web-pvc.yaml <br/14.persistentvolumeclaim/web-pvc created 15.[root@master yaml]# kubectl get pvc
br/>17.web-pvc Bound web-pv1 1Gi RWO nfs 5s
18.[root@master yaml]# kubectl get pv <br/19.NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
20.web-pv1 1Gi RWO Recycle Bound default/web-pvc nfs 8m59s
21.web-pv2 2Gi RWO Recycle Available nfs 7m30s
通過上面的實(shí)驗(yàn)得出:
如果,K8s集群中,有很多類似的PV,PVC在去向PV申請空間的時(shí)候,不僅會考慮名稱以及訪問控制模式,還會考慮PVC申請空間的大小,會分配最合適大小的PV。
三、分析storageclass 資源對象的作用及優(yōu)點(diǎn)。
1.使用PV和PVC可以實(shí)現(xiàn)數(shù)據(jù)持久化,假如我們的PV容量為10G,定義訪問模式為RWO,而我們PVC申請的存儲空間為5G,那么被申請的PV就有容量被浪費(fèi)掉了,因?yàn)樵L問模式只能被單個(gè)節(jié)點(diǎn)掛載。還有,我們每次去創(chuàng)建PV也是比較麻煩的,所以這時(shí)候就有了動態(tài)的自動的創(chuàng)建所需要的PV了(Storage Class)。
Storage Class:即存儲類,是K8s資源類型的一種,它是有管理員為管理PV更加方便創(chuàng)建的一個(gè)邏輯組,可以按照存儲系統(tǒng)的性能高低,或者綜合服務(wù)質(zhì)量,備份策略等分類。不過k8s本身不知道類別到底是什么,它這是作為一個(gè)描述。
優(yōu)點(diǎn):支持PV的動態(tài)創(chuàng)建,當(dāng)用戶用到持久性存儲時(shí),不必再去提前創(chuàng)建PV,而是直接創(chuàng)建PVC就可以了,非常的方便。
存儲類對象的名稱很重要,并且除了名稱之外,還有三個(gè)關(guān)鍵字段:
Provisioner(供給方、提供者):即提供了存儲資源的存儲系統(tǒng)。k8s內(nèi)建有多重供給方,這些供給方的名字都以“kubernetes.io”為前綴。并且還可以自定義。
Parameters(參數(shù)):存儲類使用參數(shù)描述要關(guān)聯(lián)到的存儲卷,注意不同的供給方參數(shù)也不同。
ReclaimPlicy:PV的回收策略。
關(guān)于Storage Class的詳情介紹:
https://www.kubernetes.org.cn/pvpvcstorageclass
2.做一個(gè)自動創(chuàng)建PV的實(shí)驗(yàn):
基于nginx運(yùn)行一個(gè)web服務(wù),使用Deployment資源對象,replicas=3.持久化存儲目錄為默認(rèn)主目錄,使用storageclass自動創(chuàng)建PV。
基于NFS:
1)首先NFS服務(wù)的開啟:
1.[root@master yaml]# yum install -y nfs-utils rpcbind #這里注意三臺都要安裝NFS服務(wù)。
2.[root@master yaml]# vim /etc/exports
3./nfsdata *(rw,sync,no_root_squash)
4.[root@master yaml]# mkdir /nfsdata
5.[root@master yaml]# systemctl start rpcbind
6.[root@master yaml]# systemctl start nfs-server.service
7.[root@master yaml]# showmount -e
8.Export list for master:
9./nfsdata *
2)創(chuàng)建RBAC授權(quán):
1.[root@master yaml]# vim rbac-rolebind.yaml #為了給SC資源操作K8s集群的權(quán)限。
2.
3.kind: Namespace
4.apiVersion: v1
5.metadata:
6. name: lbs-test
7.---
8.apiVersion: v1
9.kind: ServiceAccount #創(chuàng)建Rbac授權(quán)用戶。及定義權(quán)限。
10.metadata:
11. name: nfs-provisioner
12. namespace: lbs-test
13.---
14.apiVersion: rbac.authorization.k8s.io/v1
15.kind: ClusterRole
16.metadata:
17. name: nfs-provisioner-runner
18. namespace: lbs-test
19.rules:
20. - apiGroups: [""]
21. resources: ["persistentvolumes"]
22. verbs: ["get", "list", "watch", "create", "delete"]
23. - apiGroups: [""]
24. resources: ["persistentvolumeclaims"]
25. verbs: ["get", "list", "watch", "update"]
26. - apiGroups: ["storage.k8s.io"]
27. resources: ["storageclasses"]
28. verbs: ["get", "list", "watch"]
29. - apiGroups: [""]
30. resources: ["events"]
31. verbs: ["watch", "create", "update", "patch"]
32. - apiGroups: [""]
33. resources: ["services", "endpoints"]
34. verbs: ["get","create","list", "watch","update"]
35. - apiGroups: ["extensions"]
36. resources: ["podsecuritypolicies"]
37. resourceNames: ["nfs-provisioner"]
38. verbs: ["use"]
39.---
40.kind: ClusterRoleBinding
41.apiVersion: rbac.authorization.k8s.io/v1
42.metadata:
43. name: run-nfs-provisioner
44.subjects:
45. - kind: ServiceAccount
46. name: nfs-provisioner
47. namespace: lbs-test
48.roleRef:
49. kind: ClusterRole
50. name: nfs-provisioner-runner
51. apiGroup: rbac.authorization.k8s.io
執(zhí)行yaml文件:
1.[root@master yaml]# kubectl apply -f rbac-rolebind.yaml
namespace/lbh-test created
serviceaccount/nfs-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created
3)創(chuàng)建nfs-client-provisioner容器:
1.[root@master yaml]# vim nfs-deployment.yaml
2.
3.apiVersion: extensions/v1beta1
4.kind: Deployment
5.metadata:
6. name: nfs-client-provisioner
7. namespace: lbs-test
8.spec:
9. replicas: 1 #副本數(shù)量為1
10. strategy:
11. type: Recreate
12. template:
13. metadata:
14. labels:
15. app: nfs-client-provisioner
16. spec:
17. serviceAccount: nfs-provisioner #指定賬戶
18. containers:
19. - name: nfs-client-provisioner
20. image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner #使用的鏡像。
21. volumeMounts:
22. - name: nfs-client-root
23. mountPath: /persistentvolumes #指定容器內(nèi)的掛載目錄
24. env:
25. - name: PROVISIONER_NAME #這是這個(gè)容器內(nèi)置的變量
26. value: lbs-test #這是上面變量的值(名字)
27. - name: NFS_SERVER #內(nèi)置變量,用于指定nfs服務(wù)的IP
28. value: 192.168.2.50
29. - name: NFS_PATH #內(nèi)置變量,指定的是nfs共享的目錄
30. value: /nfsdata
31. volumes: #這下面是指定上面掛載到容器內(nèi)的nfs的路徑及IP
32. - name: nfs-client-root
33. nfs:
34. server: 192.168.2.50
35. path: /nfsdata
NFS-deployment:
作用:其實(shí)它是一個(gè)NFS客戶端。它通過K8S的內(nèi)置的NFS驅(qū)動掛載遠(yuǎn)端的NFS服務(wù)器到本地目錄;然后將自身作為storage provider,關(guān)聯(lián)storage class。
執(zhí)行yaml文件:1.[root@master yaml]# kubectl apply -f nfs-deployment.yaml <br/" rel="nofollow">br/>1.[root@master yaml]# kubectl apply -f nfs-deployment.yaml <br/deployment.extensions/nfs-client-provisioner created
4)創(chuàng)建SC(Storage Class)自動創(chuàng)建pv
1.[root@master yaml]# vim test-storageclass.yaml
2.apiVersion: storage.k8s.io/v1
3.kind: StorageClass
4.metadata:
5. name: sc-nfs
6. namespace: lbs-test #名稱空間
7.provisioner: lbs-test #這里要與deployment的env環(huán)境變量中的value值對應(yīng)。
8.reclaimPolicy: Retain #回收策略為:retain。
執(zhí)行yaml文件:
1.[root@master yaml]# kubectl apply -f test-storageclass.yaml
storageclass.storage.k8s.io/sc-nfs created
5)創(chuàng)建PVC
1.[root@master yaml]# vim test-pvc.yaml
2.
3.apiVersion: v1
4.kind: PersistentVolumeClaim
5.metadata:
6. name: lbs-claim
7. namespace: lbs-test
8.
9.spec:
10. storageClassName: sc-nfs 需要與storageclass的名字一致
11. accessModes:
12. - ReadWriteMany
13. resources:
14. requests:
15. storage: 500Mi
當(dāng)我們創(chuàng)建完P(guān)VC后,會自動創(chuàng)建一個(gè)PV,其目錄在NFS共享目錄下:
1.[root@master yaml]# ls /nfsdata/
lbs-test-lbs-claim-pvc-71262c5a-f866-4bc6-a22f-cd49daf13edf
2.[root@master yaml]# kubectl get pv -n lbs-test
3.NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-71262c5a-f866-4bc6-a22f-cd49daf13edf 500Mi RWX Delete Bound lbs-test/lbs-claim sc-nfs 26m
6)**基于nginx運(yùn)行web服務(wù),使用Deployment資源對象,副本數(shù)量三個(gè),持久化存儲目錄為默認(rèn)主目錄。將默認(rèn)主目錄內(nèi)容,更改為自己的名稱,并驗(yàn)證數(shù)據(jù)自動創(chuàng)建的PV目錄下是否有數(shù)據(jù)。**
創(chuàng)建Deployment資源:
1.[root@master yaml]# vim nginx.yaml
2.
3.apiVersion: extensions/v1beta1
4.kind: Deployment
5.metadata:
6. name: lbs-web
7. namespace: lbs-test
8.spec:
9. replicas: 3
10. template:
11. metadata:
12. labels:
13. app: web
14. spec:
15. containers:
16. - name: nginx
17. image: nginx
18. volumeMounts:
19. - name: lbs-web
20. mountPath: /usr/share/nginx/html/
21. volumes:
22. - name: lbs-web
23. persistentVolumeClaim:
24. claimName: lbs-claim
執(zhí)行yaml文件,并查看Pod:
1.[root@master yaml]# kubectl apply -f nginx.yaml
2.deployment.extensions/lbh-web created
3.
4.[root@master yaml]# kubectl get pod -n lbs-test
5.NAME READY STATUS RESTARTS AGE
6.lbs-web-6d596b6666-68wls 1/1 Running 0 2m29s
7.lbs-web-6d596b6666-k8vz2 1/1 Running 0 2m29s
8.lbs-web-6d596b6666-pvppq 1/1 Running 0 2m29s
分別進(jìn)入容器,配置網(wǎng)頁根目錄:
1.[root@master yaml]# kubectl exec -it -n lbs-test lbs-web-6d596b6666-68wls /bin/bash
2.root@lbs-web-6d596b6666-68wls:/# cd /usr/share/nginx/html/
3.root@lbs-web-6d596b6666-68wls:/usr/share/nginx/html# echo 123 > index.html
4.root@lbs-web-6d596b6666-68wls:/usr/share/nginx/html# ls
5.index.html
6.root@lbs-web-6d596b6666-68wls:/usr/share/nginx/html# exit
其他兩臺步驟一樣。
查看自動創(chuàng)建得分PV目錄下是否有數(shù)據(jù):
1.[root@master yaml]# cat /nfsdata/lbs-test-lbs-claim-pvc-71262c5a-f866-4bc6-a22f-cd49daf13edf/index.html
2.123
訪問網(wǎng)頁測試:
1.[root@master yaml]# kubectl get pod -o wide -n lbs-test
2.NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
3.lbs-web-6d596b6666-68wls 1/1 Running 0 11m 10.244.2.7 node02 <none> <none>
4.lbs-web-6d596b6666-k8vz2 1/1 Running 0 11m 10.244.2.9 node02 <none> <none>
5.lbs-web-6d596b6666-pvppq 1/1 Running 0 11m 10.244.2.8 node02 <none> <none>
6.[root@master yaml]# curl 10.244.2.7
7.123
nginx容器內(nèi)的網(wǎng)頁根目錄和本地的nfs共享目錄關(guān)聯(lián)。
數(shù)據(jù)不會因容器,pod被刪除,而丟失。
網(wǎng)站題目:怎樣實(shí)現(xiàn)自動創(chuàng)建PV
文章分享:http://chinadenli.net/article34/pigcse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、App開發(fā)、自適應(yīng)網(wǎng)站、ChatGPT、商城網(wǎng)站、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)