創(chuàng)建PV——>創(chuàng)建PVC——>創(chuàng)建pod最終將pod中的container實(shí)現(xiàn)數(shù)據(jù)的持久化!從上述流程中,看似沒(méi)有什么問(wèn)題,但是仔細(xì)研究就會(huì)發(fā)現(xiàn):PVC在..."/>
您好,登錄后才能下訂單哦!
搭建NFS底層存儲(chǔ)——>創(chuàng)建PV——>創(chuàng)建PVC——>創(chuàng)建pod
最終將pod中的container實(shí)現(xiàn)數(shù)據(jù)的持久化!
從上述流程中,看似沒(méi)有什么問(wèn)題,但是仔細(xì)研究就會(huì)發(fā)現(xiàn):PVC在向PV申請(qǐng)存儲(chǔ)空間時(shí),是根據(jù)指定PV的名稱(chēng)、訪問(wèn)模式、容量大小來(lái)決定具體向哪個(gè)PV申請(qǐng)空間的。
打比方說(shuō):如果PV的容量是20G,定義的訪問(wèn)模式是WRO(只允許以讀寫(xiě)的方式掛載到單個(gè)節(jié)點(diǎn)),而PVC申請(qǐng)的存儲(chǔ)空間為10G,那么一旦這個(gè)PVC是向上述的PV申請(qǐng)的空間,也就是說(shuō),那么PV有10G的空間被白白浪費(fèi)了,因?yàn)槠渲辉试S單個(gè)節(jié)點(diǎn)掛載。這是一個(gè)非常嚴(yán)重的問(wèn)題。就算不考慮這個(gè)問(wèn)題,我們每次手動(dòng)去創(chuàng)建PV也是比較麻煩的事情,這是就需要使用一個(gè)自動(dòng)化的方案來(lái)替我們創(chuàng)建PV。這個(gè)自動(dòng)化的方案就是——Storage Class(存儲(chǔ)類(lèi))!
Storage class(存儲(chǔ)類(lèi))概述
Storage class(存儲(chǔ)類(lèi))是Kubernetes資源類(lèi)型的一種,它是由管理員為管理PV更加方便而創(chuàng)建的一個(gè)邏輯組,可以按照存儲(chǔ)系統(tǒng)的性能高低、綜合服務(wù)質(zhì)量、備份策略等分類(lèi)。不過(guò)Kubernetes本身并不知道類(lèi)別到底是什么,這是一個(gè)簡(jiǎn)單的描述而已!
存儲(chǔ)類(lèi)的好處之一就是支持PV的動(dòng)態(tài)創(chuàng)建,當(dāng)用戶(hù)用到持久化存儲(chǔ)時(shí),不必再去提前創(chuàng)建PV,而是直接創(chuàng)建PVC就可以了,非常的方便。同時(shí)也避免了空間的浪費(fèi)!
Storage class(存儲(chǔ)類(lèi))三個(gè)重要的概念:
1)Provisioner(供給方、提供者):提供了存儲(chǔ)資源的存儲(chǔ)系統(tǒng)。Kubernetes內(nèi)部多重供給方,這些供給方的名字都以“kubernetes.io”為前綴。并且還可以自定義;
2)Parameters(參數(shù)):存儲(chǔ)類(lèi)使用參數(shù)描述要關(guān)聯(lián)到的存儲(chǔ)卷,注意不同的供給方參數(shù)也不同;
3)ReclaimPlicy:pv的回收策略,可用的值有Delete(默認(rèn))和Retain;
下面通過(guò)一個(gè)nginx基于自動(dòng)創(chuàng)建PV實(shí)現(xiàn)數(shù)據(jù)持久化的案例進(jìn)一步的了解Storage Class的具體使用!
為了方便,就直接在master節(jié)點(diǎn)上部署NFS存儲(chǔ)了!
[root@master ~]# yum -y install nfs-utils rpcbind
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl start rpcbind
[root@master ~]# showmount -e
Export list for master:
/nfsdata *
這種自動(dòng)創(chuàng)建PV的方式涉及到了rbac授權(quán)機(jī)制,關(guān)于rbac授權(quán)機(jī)制這里先不詳細(xì)介紹,隨后再更新說(shuō)明。
[root@master ~]# vim rbac-rolebind.yaml
kind: Namespace #創(chuàng)建一個(gè)名稱(chēng)空間,名稱(chēng)為xiaojiang-test
apiVersion: v1
metadata:
name: xiaojiang-test
---
apiVersion: v1 #創(chuàng)建一個(gè)用于認(rèn)證的服務(wù)賬號(hào)
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: xiaojiang-test
---
apiVersion: rbac.authorization.k8s.io/v1 #創(chuàng)建群集規(guī)則
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
namespace: xiaojiang-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 #將服務(wù)認(rèn)證用戶(hù)與群集規(guī)則進(jìn)行綁定
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: xiaojiang-test
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
[root@master ~]# kubectl apply -f rbac-rolebind.yaml #執(zhí)行yaml文件
nfs-deployment的作用:其實(shí)它是一個(gè)NFS客戶(hù)端。但它通過(guò)K8S的內(nèi)置的NFS驅(qū)動(dòng)掛載遠(yuǎn)端的NFS服務(wù)器到(容器內(nèi))本地目錄;然后將自身作為storage provider,關(guān)聯(lián)storage class。
[root@master ~]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: xiaojiang-test
spec:
replicas: 1 #指定副本數(shù)量為1
strategy:
type: Recreate #指定策略類(lèi)型為重置
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner #指定rbac yanl文件中創(chuàng)建的認(rèn)證用戶(hù)賬號(hào)
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 #容器內(nèi)的變量用于指定提供存儲(chǔ)的名稱(chēng)
value: lzj-test
- name: NFS_SERVER #容器內(nèi)的變量用于指定nfs服務(wù)的IP地址
value: 192.168.1.1
- name: NFS_PATH #容器內(nèi)的變量指定nfs服務(wù)器對(duì)應(yīng)的目錄
value: /nfsdata
volumes: #指定掛載到容器內(nèi)的nfs的路徑及IP
- name: nfs-client-root
nfs:
server: 192.168.1.1
path: /nfsdata
[root@master ~]# kubectl apply -f nfs-deployment.yaml #執(zhí)行yaml文件
[root@master ~]# kubectl get pod -n xiaojiang-test
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-7cf975c58b-sc2qc 1/1 Running 0 6s
[root@master ~]# vim test-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: stateful-nfs
namespace: xiaojiang-test
provisioner: lzj-test #這個(gè)要和nfs-client-provisioner的env環(huán)境變量中的PROVISIONER_NAME的value值對(duì)應(yīng)。
reclaimPolicy: Retain #指定回收策略為Retain(手動(dòng)釋放)
[root@master ~]# kubectl apply -f test-storageclass.yaml
[root@master ~]# vim test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
namespace: xiaojiang-test
spec:
storageClassName: stateful-nfs #定義存儲(chǔ)類(lèi)的名稱(chēng),需與SC的名稱(chēng)對(duì)應(yīng)
accessModes:
- ReadWriteMany #訪問(wèn)模式為RWM
resources:
requests:
storage: 100Mi
[root@master ~]# kubectl apply -f test-pvc.yaml
[root@master ~]# kubectl get pvc -n xiaojiang-test
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim Bound pvc-267b880d-5e0a-4e8e-aaff-3af46f21c6eb 100Mi RWX stateful-nfs 14s
#保證pvc的狀態(tài)為Bound,表示關(guān)聯(lián)成功
[root@master ~]# ls /nfsdata/ #可以看出用于nfs存儲(chǔ)的目錄下生成了一個(gè)對(duì)應(yīng)的目錄
xiaojiang-test-test-claim-pvc-267b880d-5e0a-4e8e-aaff-3af46f21c6eb
至此位置,我們已經(jīng)實(shí)現(xiàn)了根據(jù)PVC的申請(qǐng)存儲(chǔ)空間去自動(dòng)創(chuàng)建PV(本地的nfs共享目錄下已經(jīng)生成了一個(gè)目錄,名字挺長(zhǎng)的,是pv+pvc名字定義的目錄名),至于這個(gè)PVC申請(qǐng)的空間是給哪個(gè)pod使用,這已經(jīng)無(wú)所謂了!
[root@master ~]# vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
namespace: xiaojiang-test
spec:
containers:
- name: myweb
image: nginx:latest
volumeMounts:
- name: myweb-persistent-storage
mountPath: /usr/share/nginx/html/
volumes:
- name: myweb-persistent-storage
persistentVolumeClaim:
claimName: test-claim #指定使用的PVC名稱(chēng)
[root@master ~]# kubectl apply -f nginx-pod.yaml
[root@master ~]# kubectl get pod -n xiaojiang-test
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 38s
nfs-client-provisioner-7cf975c58b-sc2qc 1/1 Running 0 60m
[root@master ~]# kubectl exec -it myweb -n xiaojiang-test /bin/bash
root@myweb:/# cd /usr/share/nginx/html/
root@myweb:/usr/share/nginx/html# echo "hello world" > index.html
#進(jìn)入容器插入數(shù)據(jù)進(jìn)行測(cè)試
[root@master ~]# cat /nfsdata/xiaojiang-test-test-claim-pvc-267b880d-5e0a-4e8e-aaff-3af46f21c6eb/index.html
hello world
#本地目錄測(cè)試沒(méi)有問(wèn)題
[root@master ~]# kubectl exec -it nfs-client-provisioner-7cf975c58b-sc2qc -n xiaojiang-test /bin/sh
/ # ls nfs-client-provisioner
nfs-client-provisioner #自動(dòng)創(chuàng)建pv的可執(zhí)行程序
/ # cat /persistentvolumes/xiaojiang-test-test-claim-pvc-267b880d-5e0a-4e8e-aaff-3af46f21c6eb/index.html
hello world
#nfs-client容器對(duì)應(yīng)的目錄數(shù)據(jù)也是存在的
從以上測(cè)試就可以看出:nginx容器內(nèi)的網(wǎng)頁(yè)目錄就、本地的nfs共享目錄、nfs-client容器中的目錄就全部關(guān)聯(lián)起來(lái)了。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。