創(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在..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用Storage Class?

發(fā)布時(shí)間:2020-05-30 12:59:28 來(lái)源:億速云 閱讀:765 作者:鴿子 欄目:云計(jì)算

搭建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的具體使用!

1)搭建NFS共享存儲(chǔ)

為了方便,就直接在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 *

2)創(chuàng)建rbac授權(quán)

這種自動(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文件

3)創(chuàng)建nfs-deployment.資源

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

4)創(chuàng)建SC(Storage Class)

[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

5)創(chuàng)建PVC

[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ú)所謂了!

6)創(chuàng)建基于nginx鏡像的Pod

[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

7)測(cè)試驗(yàn)證

[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)了。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI