如果要去創(chuàng)建服務(wù),做數(shù)據(jù)持久化,需要預(yù)先知道可用PV有哪些?
成都創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、微信小程序開(kāi)發(fā)、公眾號(hào)商城、等建站開(kāi)發(fā),成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。
如果為了這個(gè)服務(wù)去提前創(chuàng)建PV,那么我們還需要知道,這個(gè)服務(wù),大概需要多大的空間?
主機(jī) | IP地址 | 服務(wù) |
---|---|---|
master | 192.168.1.21 | k8s |
node01 | 192.168.1.22 | k8s |
node02 | 192.168.1.23 | k8s |
基于[ https://blog.51cto.com/14320361/2464655]() 的實(shí)驗(yàn)繼續(xù)進(jìn)行
Kubernetes集群管理員通過(guò)提供不同的存儲(chǔ)類,可以滿足用戶不同的服務(wù)質(zhì)量級(jí)別、備份策略和任意策略要求的存儲(chǔ)需求。動(dòng)態(tài)存儲(chǔ)卷供應(yīng)使用StorageClass進(jìn)行實(shí)現(xiàn),其允許存儲(chǔ)卷按需被創(chuàng)建。如果沒(méi)有動(dòng)態(tài)存儲(chǔ)供應(yīng),Kubernetes集群的管理員將不得不通過(guò)手工的方式類創(chuàng)建新的存儲(chǔ)卷。通過(guò)動(dòng)態(tài)存儲(chǔ)卷,Kubernetes將能夠按照用戶的需要,自動(dòng)創(chuàng)建其需要的存儲(chǔ)。
基于StorageClass的動(dòng)態(tài)存儲(chǔ)供應(yīng)整體過(guò)程如下圖所示:
1)集群管理員預(yù)先創(chuàng)建存儲(chǔ)類(StorageClass);
2)用戶創(chuàng)建使用存儲(chǔ)類的持久化存儲(chǔ)聲明(PVC:PersistentVolumeClaim);
3)存儲(chǔ)持久化聲明通知系統(tǒng),它需要一個(gè)持久化存儲(chǔ)(PV: PersistentVolume);
4)系統(tǒng)讀取存儲(chǔ)類的信息;
5)系統(tǒng)基于存儲(chǔ)類的信息,在后臺(tái)自動(dòng)創(chuàng)建PVC需要的PV;
6)用戶創(chuàng)建一個(gè)使用PVC的Pod;
7)Pod中的應(yīng)用通過(guò)PVC進(jìn)行數(shù)據(jù)的持久化;
8)而PVC使用PV進(jìn)行數(shù)據(jù)的最終持久化處理。
說(shuō)在前面的話,靜態(tài)供給的話,會(huì)需要我們手動(dòng)去創(chuàng)建pv,如果沒(méi)有足夠的資源,找不到合適的pv,那么pod就會(huì)處于pending等待的狀態(tài),就是說(shuō)找不到合適的伴侶了,所以解決這兩種問(wèn)題,就給出了這種動(dòng)態(tài)供給,主要是能夠自動(dòng)幫你創(chuàng)建pv
,就是你需要多大的容量,就自動(dòng)給你創(chuàng)建多大的容量,也就是pv,k8s幫你創(chuàng)建了,創(chuàng)建pvc的時(shí)候就需要找pv了,這個(gè)時(shí)候就交給這個(gè)存儲(chǔ)類了,而存儲(chǔ)類呢,去幫你創(chuàng)建這些pv,存儲(chǔ)類呢,就是實(shí)現(xiàn)了對(duì)指定存儲(chǔ)的一個(gè)支持,直接幫你去調(diào)用api去創(chuàng)建存儲(chǔ)類,所以就不需要人工的去幫你創(chuàng)建pv了。
而你去想想,當(dāng)節(jié)點(diǎn)比較多,業(yè)務(wù)比較多的時(shí)候,再去人工手動(dòng)創(chuàng)建pv,量還是很大的,而且也不是很好去維護(hù)。
而動(dòng)態(tài)供給主要的一個(gè)實(shí)現(xiàn)就是StorageClass存儲(chǔ)對(duì)象,其實(shí)它就是聲明你使用哪個(gè)存儲(chǔ),然后呢幫你去連接,再幫你去自動(dòng)創(chuàng)建pv。
舉個(gè)例子更好去理解
話不多說(shuō)下圖
其實(shí)它是一個(gè)基于NFS實(shí)現(xiàn)的一個(gè)pv供給,它大概流程是這樣的,我們可能會(huì)創(chuàng)建一個(gè)statefulset有狀態(tài)的應(yīng)用存儲(chǔ),然后有一個(gè)管理的nfs-storageClass,因?yàn)閚fs目前是不支持這個(gè)自動(dòng)的創(chuàng)建pv的,我們可以利用社區(qū)實(shí)現(xiàn)的插件來(lái)完成這個(gè)pv的自動(dòng)創(chuàng)建,也就是StorageClass這一塊,創(chuàng)建完之后,然后pod再去引用。
作用:它可以動(dòng)態(tài)的自動(dòng)的創(chuàng)建所需要的PV
Provisioner(供給方,提供者):及提供了存儲(chǔ)資源的存儲(chǔ)系統(tǒng)。k8s內(nèi)建有多重供給方,這些供給方的名字都以“kubernetes.io”為前綴。并且還可以自定義。
Parameters(參數(shù)):存儲(chǔ)類使用參數(shù)描述要關(guān)聯(lián)到的存儲(chǔ)卷,注意不同的供給方參數(shù)也不同。
ReclaimPlicy: PV的回收策略,可用值有Delete(默認(rèn))和Retain
[root@master yaml]# showmount -e
RBAC:rbac是k8s的API的安全策略,是基于用戶的訪問(wèn)權(quán)限的控制。規(guī)定了誰(shuí),可以有什么樣的權(quán)限。
為了給SC資源操作k8s集群的權(quán)限。
[root@master yaml]# vim rbac-rolebind.yaml
kind: Namespace
apiVersion: v1
metadata:
name: bdqn-test
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: bdqn-test
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
namespace: bdqn-test
rules:
- 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: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get","create","list", "watch","update"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: bdqn-test
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
運(yùn)行一下
[root@master yaml]# kubectl apply -f rbac-rolebind.yaml
作用:其實(shí)它是一個(gè)NFS客戶端。但它通過(guò)K8S的內(nèi)置的NFS驅(qū)動(dòng)掛載遠(yuǎn)端的NFS服務(wù)器到本地目錄;然后將自身作為storage provider,關(guān)聯(lián)storage class。
[root@master yaml]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: bdqn-test
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner #指定賬戶
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes #指定容器內(nèi)的掛載目錄
env:
- name: PROVISIONER_NAME #這是這個(gè)容器內(nèi)置的變量
value: bdqn-test #這是上面變量的值(名字)
- name: NFS_SERVER #內(nèi)置變量,用于指定nfs服務(wù)的IP
value: 192.168.1.21
- name: NFS_PATH #內(nèi)置變量,指定的是nfs共享的目錄
value: /nfsdata
volumes: #這下面是指定上面掛載到容器內(nèi)的nfs的路徑及IP
- name: nfs-client-root
nfs:
server: 192.168.1.21
path: /nfsdata
執(zhí)行一下
[root@master yaml]# kubectl apply -f nfs-deployment.yaml
[root@master yaml]# vim test-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: stateful-nfs
namespace: bdqn-test
provisioner: bdqn-test #這里要和第三個(gè)nfs-client-provisioner的env環(huán)境變量中的value值對(duì)應(yīng)。
reclaimPolicy: Retain #回收策略為:retain,還有一個(gè)默認(rèn)的值為“default”
執(zhí)行一下
[root@master yaml]# kubectl apply -f test-storageclass.yaml
[root@master yaml]# vim test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
namespace: bdqn-test
spec:
storageClassName: stateful-nfs #定義存儲(chǔ)類的名字,要和SC的名字對(duì)應(yīng)
accessModes:
- ReadWriteMany #訪問(wèn)模式為RWM
resources:
requests:
storage: 500Mi
執(zhí)行一下
[root@master yaml]# kubectl apply -f test-pvc.yaml
查看一下
[root@master yaml]# kubectl get pvc
[root@master yaml]# vim test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
namespace: bdqn-test
spec:
containers:
- name: test-pod
image: busybox
args:
- /bin/sh
- -c
- sleep 30000
volumeMounts:
- name: nfs-pvc
mountPath: /test
restartPolicy: OnFailure
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim #這的名字要和PVC的名字一致
執(zhí)行一下
[root@master yaml]# kubectl apply -f test-pod.yaml
查看一下
[root@master yaml]# kubectl get pod -n bdqn-test
進(jìn)入容器修改頁(yè)面內(nèi)容
[root@master yaml]# kubectl exec -it test-pod -n bdqn-test /bin/sh
/ # cd test/
/test # touch test-file
/test # echo 123456 > test-file
/test # cat test-file
123456
查看掛載目錄
[root@master yaml]# ls /nfsdata/
bdqn-test-test-claim-pvc-79ddfcf1-65ae-455f-9e03-5bcfe6c6ce15
web1
web2
[root@master yaml]# cat /nfsdata/bdqn-test-test-claim-pvc-79ddfcf1-65ae-455f-9e03-5bcfe6c6ce15/test-file
123456
如果,K8S集群中, 有很多類似的PV, PVC在去向PV申請(qǐng)空間的時(shí)候,不僅會(huì)考慮名稱以及訪問(wèn)控制模式,還會(huì)考慮你申請(qǐng)空間的大小,會(huì)分配給你最合適大小的PV。
創(chuàng)建一個(gè)PVC,與上述資源進(jìn)行關(guān)聯(lián)。
下載nfs所需安裝包
[root@node02 ~]# yum -y install nfs-utils rpcbind
創(chuàng)建共享目錄
[root@master ~]# mkdir /nfsdata
創(chuàng)建共享目錄的權(quán)限
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
開(kāi)啟nfs和rpcbind
[root@master ~]# systemctl start nfs-server.service
[root@master ~]# systemctl start rpcbind
測(cè)試一下
[root@master ~]# showmount -e
web1
[root@master yaml]# vim web.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec :
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata/web1
server: 192.168.1.21
web2
[root@master yaml]# vim web2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv2
spec :
capacity :
storage: 2Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata/web2
server: 192.168.1.21
[root@master yaml]# mkdir /nfsdata/web1
[root@master yaml]# mkdir /nfsdata/web2
[root@master yaml]# kubectl apply -f web.yaml
[root@master yaml]# kubectl apply -f web2.yaml
[root@master yaml]# kubectl get pv
[root@master yaml]# vim web-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
執(zhí)行一下
[root@master yaml]# kubectl apply -f web-pvc.yaml
查看一下
[root@master yaml]# kubectl get pvc
系統(tǒng)會(huì)自動(dòng)給pvc一個(gè)相近內(nèi)存的pv,所以選擇了1G的那個(gè)
[root@master yaml]# vim web-pod.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web-pod
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: web-test
mountPath: /usr/share/nginx/html
volumes:
- name: web-test
persistentVolumeClaim:
claimName: web-pvc
[root@master yaml]# kubectl apply -f web-pod.yaml
[root@master yaml]# kubectl get pod
[root@master yaml]# kubectl get pod -o wide
root@master yaml]# kubectl exec -it web-pod-8686d9c594-qxhr9 /bin/bash
root@web-pod-8686d9c594-qxhr9:/# cd /usr/share/nginx/html/
root@web-pod-8686d9c594-qxhr9:/usr/share/nginx/html# ls
root@web-pod-8686d9c594-qxhr9:/usr/share/nginx/html# echo 123456 > index.html
root@web-pod-8686d9c594-qxhr9:/usr/share/nginx/html# exit
[root@master yaml]# curl 10.244.2.17
如果兩個(gè)PV,大小一樣,名稱一樣,訪問(wèn)控制模式不一樣,PVC會(huì)關(guān)聯(lián)哪一個(gè)? (驗(yàn)證PV和PVC 關(guān)聯(lián)的時(shí)候,訪問(wèn)模式必須一樣)
[root@master yaml]# vim web1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec :
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce #能以讀-寫(xiě)mount到單個(gè)的節(jié)點(diǎn)
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata/web1
server: 192.168.1.21
[root@master yaml]# vim web2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec :
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany #能以讀-寫(xiě)mount到多個(gè)的節(jié)點(diǎn)
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata/web1
server: 192.168.1.21
[root@master yaml]# mkdir /nfsdata/web1
[root@master yaml]# kubectl apply -f web1.yaml
[root@master yaml]# kubectl apply -f web2.yaml
[root@master yaml]# vim web-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-pvc
spec:
accessModes:
- ReadWriteMany #能以讀-寫(xiě)mount到多個(gè)的節(jié)點(diǎn)
resources:
requests:
storage: 1Gi
storageClassName: nfs
[root@master yaml]# kubectl apply -f web-pvc.yaml
[root@master yaml]# kubectl get pv
[root@master yaml]# kubectl get pvc
現(xiàn)在可以看到pv和pvc關(guān)聯(lián)成功,但是為什么只有一個(gè)pv呢?(pv掛載的目錄要相同)
那是因?yàn)楫?dāng)創(chuàng)建了兩個(gè)相同名字的pv時(shí)它并不會(huì)認(rèn)為這是兩個(gè)不同的pv,而會(huì)把他們當(dāng)成是同一個(gè)pv,后創(chuàng)建的pv會(huì)刷新前面創(chuàng)建的pv。然后,當(dāng)創(chuàng)建了pvc,并且pvc的訪問(wèn)模式和后面創(chuàng)建pv的訪問(wèn)模式一樣,他們就會(huì)關(guān)聯(lián)成功,反之不成功。(當(dāng)然這些條件下還需要考慮,pv的內(nèi)存)
[root@master yaml]# vim namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
name: xgp-znb
[root@master yaml]# kubectl apply -f namespace.yaml
[root@master yaml]# kubectl get ns
下載所需鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
[root@master yaml]# vim rbac-rolebind.yaml
kind: Namespace
apiVersion: v1
metadata:
name: xgp-znb
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: xgp-znb
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
namespace: xgp-znb
rules:
- 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: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get","create","list", "watch","update"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: xgp-znb
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
[root@master yaml]# kubectl apply -f rbac-rolebind.yaml
[root@master yaml]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: xgp-znb
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: xgp-znb
- name: NFS_SERVER
value: 192.168.1.21
- name: NFS_PATH
value: /nfsdata
volumes:
- name: nfs-client-root
nfs:
server: 192.168.1.21
path: /nfsdata
[root@master yaml]# kubectl apply -f nfs-deployment.yaml
[root@master yaml]# vim storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: test-sc
provisioner: xgp-znb #通過(guò)provisioner字段關(guān)聯(lián)到上述Deploy
reclaimPolicy: Retain
[root@master yaml]# kubectl apply -f storageclass.yaml
[root@master yaml]# vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
namespace: xgp-znb
spec:
storageClassName: test-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 500Mi
[root@master yaml]# kubectl apply -f pvc.yaml
[root@master yaml]# kubectl get pvc -n xgp-znb
[root@master yaml]# vim pod.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web-pod
namespace: xgp-znb
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: web-test
mountPath: /usr/share/nginx/html
volumes:
- name: web-test
persistentVolumeClaim:
claimName: test-claim
[root@master yaml]# kubectl apply -f pvc.yaml
[root@master yaml]# kubectl get pod -n xgp-znb
[root@master yaml]# kubectl exec -it web-pod-8cd956cc7-6szjb -n xgp-znb /bin/bash
//進(jìn)入容器之中
root@web-pod-8cd956cc7-6szjb:/# echo xgp-znb > /usr/share/nginx/html/index.html
//添加自定義內(nèi)容主機(jī)
[root@master yaml]# curl 10.244.2.18
文章標(biāo)題:kubernetes的存儲(chǔ)類介紹
標(biāo)題網(wǎng)址:http://aaarwkj.com/article22/goopjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、小程序開(kāi)發(fā)、域名注冊(cè)、、服務(wù)器托管、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)