您好,登錄后才能下訂單哦!
K8s進(jìn)階之PersistentVolumeClaim 動(dòng)態(tài)供給
先來簡單看一下這張圖實(shí)現(xiàn)的過程,然后我們?cè)賮硌芯恳幌?/p>
說在前面的話,靜態(tài)供給的話,會(huì)需要我們手動(dòng)去創(chuàng)建pv,如果沒有足夠的資源,找不到合適的pv,那么pod就會(huì)處于pending等待的狀態(tài),就是說找不到合適的伴侶了,
所以解決這兩種問題,就給出了這種動(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è)例子更好去理解
話不多說上圖
其實(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)的插件來完成這個(gè)pv的自動(dòng)創(chuàng)建,也就是StorageClass這一塊,創(chuàng)建完之后,然后pod再去引用。
這個(gè)是kubernetes支持的動(dòng)態(tài)供給的存儲(chǔ)插件
https://kubernetes.io/docs/concepts/storage/storage-classes/
這里面呢會(huì)告訴你哪些存儲(chǔ)支持哪些不支持,支持的話就不用使用社區(qū)的存儲(chǔ)類了,如果不支持就要去找社區(qū)的存儲(chǔ)類了,打鉤的都是支持的,沒打鉤的就是不支持的。
這個(gè)是那個(gè)社區(qū)給我們提供的插件,來看一下
https://github.com/kubernetes-incubator/external-storage
K8s默認(rèn)是不支持的,我們可以使用這個(gè)nfs-client這里面提供的yaml,社區(qū)開發(fā)的一個(gè)組件,這個(gè)組件能幫你自動(dòng)創(chuàng)建PV,在deploy里面,我們會(huì)用到class,這個(gè)就會(huì)聲明了你使用
哪個(gè)存儲(chǔ),哪個(gè)提供的,它會(huì)以一個(gè)應(yīng)用的方式部署起來,另外一個(gè)會(huì)用到的就是rbac,
這個(gè)存儲(chǔ)類會(huì)訪問API,所以要為他定義RBAC授權(quán)策略,還有deployment,它是定義了以組件的形式部署起來,這個(gè)組件里面會(huì)有一個(gè)鏡像,直接下載這個(gè)鏡像就可以了,它可以幫我們自動(dòng)的去創(chuàng)建pv,其實(shí)就是它來做的,如果k8s支持的話,就直接去調(diào)了,但k8s對(duì)NFS沒有支持,所有需要使用這么個(gè)社區(qū)的組件來實(shí)現(xiàn)了,這里會(huì)定義NFS服務(wù)器的地址還有數(shù)據(jù)卷的來源
現(xiàn)在我們演示一下:
聲明這里的yaml文件可以去剛才我發(fā)的社區(qū)地址當(dāng)下來
[root@k8s-master demo]# mkdir nfs-client
[root@k8s-master demo]# cd nfs-client/
[root@k8s-master nfs-client]# rz -E
rz waiting to receive.
[root@k8s-master nfs-client]# ls
class.yaml deployment.yaml rbac.yaml
先創(chuàng)建一下rbac,這里也不用定義,直接創(chuàng)建就可以了[root@k8s-master nfs-client]# kubectl create -f rbac.yaml
這里需要修改一個(gè)我們NFS服務(wù)器的地址以及NFS服務(wù)器的掛載目錄
[root@k8s-master nfs-client]# vim deployment.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: zhaocheng172/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.30.27
- name: NFS_PATH
value: /opt/k8s
volumes:
- name: nfs-client-root
nfs:
server: 192.168.30.27
path: /opt/k8s
[root@k8s-master nfs-client]# kubectl create -f class.yaml
[root@k8s-master nfs-client]# kubectl create -f deployment.yaml
這里提供者就是fuseim.pri/ifs,在我們的class里面可以看到,storage需要告知使用者,使用者部署應(yīng)用到k8s中,想使用這個(gè)自動(dòng)供給,你必須告知它,它需要你在yaml文件里聲明這個(gè)提供者,那就意味著提供者storageclass可以配置多個(gè),可以是NFS,另一個(gè)是Ceph,另一個(gè)是云存儲(chǔ),都可以可以多個(gè),只要它在創(chuàng)建應(yīng)用時(shí)指定使用哪個(gè)storageclass,它就會(huì)在指定在哪個(gè)存儲(chǔ)上創(chuàng)建自動(dòng)pv
[root@k8s-master nfs-client]# kubectl get storageclass
managed-nfs-storage fuseim.pri/ifs 51s
[root@k8s-master nfs-client]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-pod 1/1 Running 0 18h
nfs-744d977b46-dh9xj 1/1 Running 0 18h
nfs-744d977b46-kcx6h 1/1 Running 0 18h
nfs-744d977b46-wqhc6 1/1 Running 0 18h
nfs-client-provisioner-fbc77b9d4-kkkll 1/1 Running 0 27s
現(xiàn)在我們就可以使用pv的自動(dòng)供給了
現(xiàn)在我們來測(cè)試一下,我在我原有的靜態(tài)pod之上,在pvc上加上storageclass的名字
指定我們的存儲(chǔ)類
為了測(cè)試我們實(shí)現(xiàn)自動(dòng)供給,我們把原來的靜態(tài)供給刪除掉
[root@k8s-master nfs-client]# kubectl get pv,pvc
persistentvolume/zhaocheng 5Gi RWX Retain Released default/my-pvc 18h
persistentvolume/zhaochengcheng 10Gi RWX Retain Available 18h
[root@k8s-master nfs-client]# kubectl delete persistentvolume/zhaocheng
persistentvolume "zhaocheng" deleted
[root@k8s-master nfs-client]# kubectl delete persistentvolume/zhaochengcheng
persistentvolume "zhaochengcheng" deleted
[root@k8s-master nfs-client]# kubectl get pv,pvc
No resources found.
這是我們動(dòng)態(tài)供給的yaml格式,在pvc去指定我們的存儲(chǔ)類storageClassName:
"managed-nfs-storage"
[root@k8s-master nfs-client]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumes:
- name: www
persistentVolumeClaim:
claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
[root@k8s-master nfs-client]# kubectl create -f pod.yaml
查看我們的pv,pvc已經(jīng)自動(dòng)幫我們?nèi)?chuàng)建,就不用我們手動(dòng)再去創(chuàng)建pv了
[root@k8s-master nfs-client]# kubectl get pod
my-pod 1/1 Running 0 110s
nfs-744d977b46-dh9xj 1/1 Running 0 18h
nfs-744d977b46-kcx6h 1/1 Running 0 18h
nfs-744d977b46-wqhc6 1/1 Running 0 18h
nfs-client-provisioner-fbc77b9d4-kkkll 1/1 Running 0 20m
[root@k8s-master nfs-client]# kubectl get pv,pvc
persistentvolume/pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a 5Gi RWX Delete Bound default/my-pvc managed-nfs-storage 67s
NAME STATUS VOLUME
persistentvolumeclaim/my-pvc Bound pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a 5Gi RWX managed-nfs-storage 67s
而在我們nfs服務(wù)器上也能看到pvc的目錄,現(xiàn)在我們就可以去用了
[root@localhost k8s]# ls
default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a wwwroot zhaocheng zhaochengcheng
[root@localhost k8s]# cd default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a/
[root@localhost default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a]# ls
[root@localhost default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a]# echo "hello persistentvolumeclaim" > index.html
查看我們的容器pod
[root@k8s-master nfs-client]# kubectl exec -it my-pod bash
root@my-pod:/# cat /usr/share/nginx/html/index.html
hello persistentvolumeclaim
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。