1、數據持久化的類型:
1.emptyDir:只能做爲臨時存儲使用。若是容器被刪除,數據仍然存在,若是Pod被刪除,數據也會被刪除。
2.HostPath:使用場景很少,會增長Pod與節點之間的耦合性。
3.PV、PVC:基於NFS服務。PV狀態必須爲Available,訪問模式必須相同及存儲類的名稱必須相同。
出錯:Pod不斷的重啓:
1.swap沒有關閉,致使集羣運行不正常。
2.內存不足,運行服務也會重啓。html
注意:基於NFs建立PV,與PVC。
而且須要建立PV所需的宿主機目錄。node
2、作實驗類比,若是集羣中存在兩個空間大小不一樣的PV,PVC如何跟PV關聯。 1.建立PV(建立兩個空間大小不一樣的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.建立第二個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.建立PVCbr/>1.[root@master yaml]# vim web-pvc.yaml
2.kind: PersistentVolumeClaim 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
14.persistentvolumeclaim/web-pvc created br/>15.[root@master yaml]# kubectl get pvc
16.NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE br/>17.web-pvc Bound web-pv1 1Gi RWO nfs 5s
18.[root@master yaml]# kubectl get pv
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
經過上面的實驗得出:
若是,K8s集羣中,有不少相似的PV,PVC在去向PV申請空間的時候,不只會考慮名稱以及訪問控制模式,還會考慮PVC申請空間的大小,會分配最合適大小的PV。nginx
3、分析storageclass 資源對象的做用及優勢。
1.使用PV和PVC能夠實現數據持久化,假如咱們的PV容量爲10G,定義訪問模式爲RWO,而咱們PVC申請的存儲空間爲5G,那麼被申請的PV就有容量被浪費掉了,由於訪問模式只能被單個節點掛載。還有,咱們每次去建立PV也是比較麻煩的,因此這時候就有了動態的自動的建立所須要的PV了(Storage Class)。
Storage Class:即存儲類,是K8s資源類型的一種,它是有管理員爲管理PV更加方便建立的一個邏輯組,能夠按照存儲系統的性能高低,或者綜合服務質量,備份策略等分類。不過k8s自己不知道類別究竟是什麼,它這是做爲一個描述。
優勢:支持PV的動態建立,當用戶用到持久性存儲時,沒必要再去提早建立PV,而是直接建立PVC就能夠了,很是的方便。
存儲類對象的名稱很重要,而且除了名稱以外,還有三個關鍵字段:
Provisioner(供給方、提供者):即提供了存儲資源的存儲系統。k8s內建有多重供給方,這些供給方的名字都以「kubernetes.io」爲前綴。而且還能夠自定義。
Parameters(參數):存儲類使用參數描述要關聯到的存儲卷,注意不一樣的供給方參數也不一樣。
ReclaimPlicy:PV的回收策略。
關於Storage Class的詳情介紹:
https://www.kubernetes.org.cn/pvpvcstorageclassweb
2.作一個自動建立PV的實驗:
基於nginx運行一個web服務,使用Deployment資源對象,replicas=3.持久化存儲目錄爲默認主目錄,使用storageclass自動建立PV。vim
基於NFS:api
1)首先NFS服務的開啓: 1.[root@master yaml]# yum install -y nfs-utils rpcbind #這裏注意三臺都要安裝NFS服務。 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)建立RBAC受權: 1.[root@master yaml]# vim rbac-rolebind.yaml #爲了給SC資源操做K8s集羣的權限。 2. 3.kind: Namespace 4.apiVersion: v1 5.metadata: 6. name: lbs-test 7.--- 8.apiVersion: v1 9.kind: ServiceAccount #建立Rbac受權用戶。及定義權限。 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
執行yaml文件:bash
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)建立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 #副本數量爲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 #指定容器內的掛載目錄 24. env: 25. - name: PROVISIONER_NAME #這是這個容器內置的變量 26. value: lbs-test #這是上面變量的值(名字) 27. - name: NFS_SERVER #內置變量,用於指定nfs服務的IP 28. value: 192.168.2.50 29. - name: NFS_PATH #內置變量,指定的是nfs共享的目錄 30. value: /nfsdata 31. volumes: #這下面是指定上面掛載到容器內的nfs的路徑及IP 32. - name: nfs-client-root 33. nfs: 34. server: 192.168.2.50 35. path: /nfsdata
NFS-deployment:
做用:其實它是一個NFS客戶端。它經過K8S的內置的NFS驅動掛載遠端的NFS服務器到本地目錄;而後將自身做爲storage provider,關聯storage class。服務器
執行yaml文件:br/>1.[root@master yaml]# kubectl apply -f nfs-deployment.yaml
deployment.extensions/nfs-client-provisioner createdapp
4)建立SC(Storage Class)自動建立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環境變量中的value值對應。 8.reclaimPolicy: Retain #回收策略爲:retain。 執行yaml文件: 1.[root@master yaml]# kubectl apply -f test-storageclass.yaml storageclass.storage.k8s.io/sc-nfs created
5)建立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
當咱們建立完PVC後,會自動建立一個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運行web服務,使用Deployment資源對象,副本數量三個,持久化存儲目錄爲默認主目錄。將默認主目錄內容,更改成本身的名稱,並驗證數據自動建立的PV目錄下是否有數據。** 建立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
執行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
分別進入容器,配置網頁根目錄: 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
其餘兩臺步驟同樣。curl
查看自動建立得分PV目錄下是否有數據: 1.[root@master yaml]# cat /nfsdata/lbs-test-lbs-claim-pvc-71262c5a-f866-4bc6-a22f-cd49daf13edf/index.html 2.123
訪問網頁測試: 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容器內的網頁根目錄和本地的nfs共享目錄關聯。數據不會因容器,pod被刪除,而丟失。