kubernetes數(shù)據(jù)持久化StorageClass動(dòng)態(tài)供給實(shí)現(xiàn)詳解
正文
- 存儲(chǔ)類的好處之一便是支持PV的動(dòng)態(tài)供給,它甚至可以直接被視作為PV的創(chuàng)建模版,用戶用到持久性存儲(chǔ)時(shí),需要通過創(chuàng)建PVC來綁定匹配的PV,此類操作需求較大,或者當(dāng)管理員手動(dòng)創(chuàng)建的PV無法滿足PVC的所有需求時(shí),系統(tǒng)按PVC的需求標(biāo)準(zhǔn)動(dòng)態(tài)創(chuàng)建適配的PV會(huì)為存儲(chǔ)管理帶來極大的靈活性,不過僅那些屬于StorageClass的PVC和PV才能產(chǎn)生綁定關(guān)系,即沒有指定StorageClass的PVC只能綁定同類的PV。
- 存儲(chǔ)類對(duì)象的名稱至關(guān)重要,它是用戶調(diào)用的標(biāo)識(shí),創(chuàng)建存儲(chǔ)類對(duì)象時(shí),除了名稱之外,還需要為其定義三個(gè)關(guān)鍵字段。provisioner、parameter和reclaimPolicy。
- 所以kubernetes提供了一種可以動(dòng)態(tài)分配的工作機(jī)制,可用自動(dòng)創(chuàng)建PV,該機(jī)制依賴于StorageClass的API,將某個(gè)存儲(chǔ)節(jié)點(diǎn)劃分1T給kubernetes使用,當(dāng)用戶申請(qǐng)5Gi的PVC時(shí),會(huì)自動(dòng)從這1T的存儲(chǔ)空間去創(chuàng)建一個(gè)5Gi的PV,而后自動(dòng)與之進(jìn)行關(guān)聯(lián)綁定。
- 動(dòng)態(tài)PV供給的啟用需要事先創(chuàng)建一個(gè)存儲(chǔ)類,不同的Provisoner的創(chuàng)建方法各有不同,并非所有的存儲(chǔ)卷插件都由Kubernetes內(nèi)建支持PV動(dòng)態(tài)供給。
基于NFS實(shí)現(xiàn)動(dòng)態(tài)供應(yīng)
由于kubernetes內(nèi)部不包含NFS驅(qū)動(dòng),所以需要使用外部驅(qū)動(dòng)nfs-subdir-external-provisioner是一個(gè)自動(dòng)供應(yīng)器,它使用NFS服務(wù)端來支持動(dòng)態(tài)供應(yīng)。
NFS-subdir-external- provisioner實(shí)例負(fù)責(zé)監(jiān)視PersistentVolumeClaims請(qǐng)求StorageClass,并自動(dòng)為它們創(chuàng)建NFS所支持的PresistentVolumes。
GitHub地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
準(zhǔn)備NFS服務(wù)端的共享目錄
這里的意思是要把哪個(gè)目錄給kubernetes來使用。把目錄共享出來。
[root@kn-server-node02-15 ~]# ll /data/ 總用量 0 [root@kn-server-node02-15 ~]# showmount -e 10.0.0.15 Export list for 10.0.0.15: /data 10.0.0.0/24
安裝NFS-Server驅(qū)動(dòng)。
首先創(chuàng)建RBAC權(quán)限。
[root@kn-server-master01-13 nfs-provisioner]# cat nfs-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default roleRef: kind: Role name: leader-locking-nfs-client-provisioner apiGroup: rbac.authorization.k8s.io [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f nfs-rbac.yaml serviceaccount/nfs-client-provisioner created clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
部署NFS-Provisioner
[root@kn-server-master01-13 nfs-provisioner]# cat nfs-provisioner-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner labels: app: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: nfs-client-provisioner template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 鏡像在國內(nèi)是拉取不到的,因此為下載下來了放在我的docker hub。 替換為lihuahaitang/nfs-subdir-external-provisioner:v4.0.2 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner NFS-Provisioner的名稱,后續(xù)StorageClassName要與該名稱保持一致 - name: NFS_SERVER NFS服務(wù)器的地址 value: 10.0.0.15 - name: NFS_PATH value: /data volumes: - name: nfs-client-root nfs: server: 10.0.0.15 path: /data [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f nfs-provisioner-deploy.yaml deployment.apps/nfs-client-provisioner created Pod正常運(yùn)行。 [root@kn-server-master01-13 nfs-provisioner]# kubectl get pods NAME READY STATUS RESTARTS AGE nfs-client-provisioner-57d6d9d5f6-dcxgq 1/1 Running 0 2m25s describe查看Pod詳細(xì)信息; [root@kn-server-master01-13 nfs-provisioner]# kubectl describe pods nfs-client-provisioner-57d6d9d5f6-dcxgq Name: nfs-client-provisioner-57d6d9d5f6-dcxgq Namespace: default Priority: 0 Node: kn-server-node02-15/10.0.0.15 Start Time: Mon, 28 Nov 2022 11:19:33 +0800 Labels: app=nfs-client-provisioner pod-template-hash=57d6d9d5f6 Annotations: <none> Status: Running IP: 192.168.2.82 IPs: IP: 192.168.2.82 Controlled By: ReplicaSet/nfs-client-provisioner-57d6d9d5f6 Containers: nfs-client-provisioner: Container ID: docker://b5ea240a8693185be681714747f8e0a9f347492a24920dd68e629effb3a7400f Image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 鏡像來自k8s.gcr.io Image ID: docker-pullable://k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner@sha256:63d5e04551ec8b5aae83b6f35938ca5ddc50a88d85492d9731810c31591fa4c9 Port: <none> Host Port: <none> State: Running Started: Mon, 28 Nov 2022 11:20:12 +0800 Ready: True Restart Count: 0 Environment: PROVISIONER_NAME: k8s-sigs.io/nfs-subdir-external-provisioner NFS_SERVER: 10.0.0.15 NFS_PATH: /data Mounts: /persistentvolumes from nfs-client-root (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-q2z8w (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: nfs-client-root: Type: NFS (an NFS mount that lasts the lifetime of a pod) Server: 10.0.0.15 Path: /data ReadOnly: false kube-api-access-q2z8w: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m11s default-scheduler Successfully assigned default/nfs-client-provisioner-57d6d9d5f6-dcxgq to kn-server-node02-15 Normal Pulling 3m11s kubelet Pulling image "k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2" Normal Pulled 2m32s kubelet Successfully pulled image "k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2" in 38.965869132s Normal Created 2m32s kubelet Created container nfs-client-provisioner Normal Started 2m32s kubelet Started container nfs-client-provisioner
創(chuàng)建StorageClass
創(chuàng)建NFS StorageClass動(dòng)態(tài)供應(yīng)商。
[root@kn-server-master01-13 nfs-provisioner]# cat storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass 類型為storageclass metadata: name: nfs-provisioner-storage PVC申請(qǐng)時(shí)需明確指定的storageclass名稱 annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: k8s-sigs.io/nfs-subdir-external-provisioner 供應(yīng)商名稱,必須和上面創(chuàng)建的"PROVISIONER_NAME"保持一致 parameters: archiveOnDelete: "false" 如果值為false,刪除pvc后也會(huì)刪除目錄內(nèi)容,"true"則會(huì)對(duì)數(shù)據(jù)進(jìn)行保留 pathPattern: "${.PVC.namespace}/${.PVC.name}" 創(chuàng)建目錄路徑的模板,默認(rèn)為隨機(jī)命名。 [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f storageclass.yaml storageclass.storage.k8s.io/nfs-provisioner-storage created storage簡(jiǎn)寫sc [root@kn-server-master01-13 nfs-provisioner]# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-provisioner-storage k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 3s describe查看配詳細(xì)信息。 [root@kn-server-master01-13 nfs-provisioner]# kubectl describe sc Name: nfs-provisioner-storage IsDefaultClass: Yes Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"nfs-provisioner-storage"},"parameters":{"archiveOnDelete":"false","pathPattern":"${.PVC.namespace}/${.PVC.name}"},"provisioner":"k8s-sigs.io/nfs-subdir-external-provisioner"} ,storageclass.kubernetes.io/is-default-class=true Provisioner: k8s-sigs.io/nfs-subdir-external-provisioner Parameters: archiveOnDelete=false,pathPattern=${.PVC.namespace}/${.PVC.name} AllowVolumeExpansion: <unset> MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: Immediate Events: <none>
創(chuàng)建PVC,自動(dòng)關(guān)聯(lián)PV
[root@kn-server-master01-13 nfs-provisioner]# cat nfs-pvc-test.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc-test spec: storageClassName: "nfs-provisioner-storage" accessModes: - ReadWriteMany resources: requests: storage: 0.5Gi 這里的PV的名字是隨機(jī)的,數(shù)據(jù)的存儲(chǔ)路徑是根據(jù)pathPattern來定義的。 [root@kn-server-node02-15 data]# ls default [root@kn-server-node02-15 data]# ll default/ 總用量 0 drwxrwxrwx 2 root root 6 11月 28 13:56 nfs-pvc-test [root@kn-server-master01-13 pv]# kubectl get pv pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f 512Mi RWX Delete Bound default/nfs-pvc-test nfs-provisioner-storage 5m19s [root@kn-server-master01-13 nfs-provisioner]# kubectl describe pv pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f Name: pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f Labels: <none> Annotations: pv.kubernetes.io/provisioned-by: k8s-sigs.io/nfs-subdir-external-provisioner Finalizers: [kubernetes.io/pv-protection] StorageClass: nfs-provisioner-storage Status: Bound Claim: default/nfs-pvc-test Reclaim Policy: Delete Access Modes: RWX VolumeMode: Filesystem Capacity: 512Mi Node Affinity: <none> Message: Source: Type: NFS (an NFS mount that lasts the lifetime of a pod) Server: 10.0.0.15 Path: /data/default/nfs-pvc-test ReadOnly: false Events: <none> describe可用看到更詳細(xì)的信息 root@kn-server-master01-13 nfs-provisioner]# kubectl describe pvc Name: nfs-pvc-test Namespace: default StorageClass: nfs-provisioner-storage Status: Bound Volume: pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f Labels: <none> Annotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.beta.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner Finalizers: [kubernetes.io/pvc-protection] Capacity: 512Mi 定義的存儲(chǔ)大小 Access Modes: RWX 卷的讀寫 VolumeMode: Filesystem Used By: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ExternalProvisioning 13m persistentvolume-controller waiting for a volume to be created, either by external provisioner "k8s-sigs.io/nfs-subdir-external-provisioner" or manually created by system administrator Normal Provisioning 13m k8s-sigs.io/nfs-subdir-external-provisioner_nfs-client-provisioner-57d6d9d5f6-dcxgq_259532a3-4dba-4183-be6d-8e8b320fc778 External provisioner is provisioning volume for claim "default/nfs-pvc-test" Normal ProvisioningSucceeded 13m k8s-sigs.io/nfs-subdir-external-provisioner_nfs-client-provisioner-57d6d9d5f6-dcxgq_259532a3-4dba-4183-be6d-8e8b320fc778 Successfully provisioned volume pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f
創(chuàng)建Pod,測(cè)試數(shù)據(jù)是否持久。
[root@kn-server-master01-13 nfs-provisioner]# cat nginx-pvc-test.yaml apiVersion: v1 kind: Pod metadata: name: nginx-sc spec: containers: - name: nginx image: nginx volumeMounts: - name: nginx-page mountPath: /usr/share/nginx/html volumes: - name: nginx-page persistentVolumeClaim: claimName: nfs-pvc-test [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f nginx-pvc-test.yaml pod/nginx-sc created [root@kn-server-master01-13 nfs-provisioner]# kubectl describe pvc Name: nfs-pvc-test Namespace: default StorageClass: nfs-provisioner-storage Status: Bound Volume: pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f Labels: <none> Annotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.beta.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner Finalizers: [kubernetes.io/pvc-protection] Capacity: 512Mi Access Modes: RWX VolumeMode: Filesystem Used By: nginx-sc 可以看到的是nginx-sc這個(gè)Pod在使用這個(gè)PVC。 和上面名稱是一致的。 [root@kn-server-master01-13 nfs-provisioner]# kubectl get pods nginx-sc NAME READY STATUS RESTARTS AGE nginx-sc 1/1 Running 0 2m43s 嘗試寫入數(shù)據(jù) [root@kn-server-node02-15 data]# echo "haitang" > /data/default/nfs-pvc-test/index.html 訪問測(cè)試。 [root@kn-server-master01-13 nfs-provisioner]# curl 192.168.2.83 haitang
以上就是kubernetes數(shù)據(jù)持久化StorageClass動(dòng)態(tài)供給實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于kubernetes數(shù)據(jù)持久化StorageClass的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Kubernetes kubectl中Pod創(chuàng)建流程源碼解析
這篇文章主要為大家介紹了Kubernetes kubectl中Pod創(chuàng)建流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11kubernetes數(shù)據(jù)持久化PV?PVC深入分析詳解
這篇文章主要為大家介紹了kubernetes數(shù)據(jù)持久化PV?PVC分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Citrix Xenserver 7怎么安裝?Xenserver 7.0安裝詳細(xì)圖文教程(附下載地址)
XenServer 7.0正式版已近發(fā)布了,今天腳本之家 小編為大家?guī)砹薠enserver 7安裝詳細(xì)圖文教程,希望對(duì)大家有所幫助2017-12-12kubernetes數(shù)據(jù)持久化StorageClass動(dòng)態(tài)供給實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了kubernetes數(shù)據(jù)持久化StorageClass動(dòng)態(tài)供給實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Kubernetes(K8S)入門基礎(chǔ)內(nèi)容介紹
這篇文章介紹了Kubernetes(K8S)的入門基礎(chǔ)內(nèi)容,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03Kubernetes Visitor設(shè)計(jì)模式及發(fā)送pod創(chuàng)建請(qǐng)求解析
這篇文章主要為大家介紹了Kubernetes Visitor設(shè)計(jì)模式及發(fā)送pod創(chuàng)建請(qǐng)求解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11