天天看點

@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)

文章目錄

  • ​​kubernetes(k8s)資料持久化Volume​​
  • ​​一、資料持久化​​
  • ​​1、Vlolume概述​​
  • ​​2、資料卷的分類​​
  • ​​3、常用的四種資料卷​​
  • ​​4、Pod使用Volume步驟:​​
  • ​​5、 volume基本資源清單​​
  • ​​二、emptyDir(臨時存儲卷)​​
  • ​​1、emptyDir的簡述​​
  • ​​2、emptyDir的使用方法​​
  • ​​4、emptyDir的使用​​
  • ​​三、hostPath(節點存儲卷)​​
  • ​​1、hostpath的概述:​​
  • ​​2、hostpath支援資料類型​​
  • ​​3、hostpath的使用​​
  • ​​四、nfs存儲卷(pv、pvc)​​
  • ​​1、nfs存儲卷的概述​​
  • ​​2、pv、pvc的介紹​​
  • ​​3、PV和PVC的生命周期​​
  • ​​4、存儲管理機制​​
  • ​​5、簡述pv過載過程​​
  • ​​【pv、pvc的使用(全部節點必須安裝nfs)】​​
  • ​​1、安裝nfs​​
  • ​​2、nfs存儲卷(建立pv、pvc)​​
  • ​​3、nfs存儲卷的挂載使用(單節點挂載)​​
  • ​​4、nfs存儲卷(多點挂載使用)​​
  • ​​5、案列(資料持久化)​​
  • ​​【 使用存儲卷搭建lnmp】​​
  • ​​1、建立資源清單(資料庫)​​
  • ​​2、建立資源清單(web+php)​​
  • ​​3、測試部署(lnmp)​​
  • ​​五、StorageClass(存儲類别)​​
  • ​​1、簡述StorageClass​​
  • ​​2、StorageClass的使用​​
  • ​​【helm安裝nfs(storageclass)】​​
  • ​​1、使用storageclasses​​
  • ​​【CSI存儲機制】​​
  • ​​1、CSI部署架構​​
  • ​​2、CSI主要包括兩個元件:​​
  • ​​【CSI Controller】​​
  • ​​【CSI Node】​​

kubernetes(k8s)資料持久化Volume

一、資料持久化

Pod是由容器組成的,而容器當機或停止之後,資料就随之丢了,那麼這也就意味着我們在做Kubernetes叢集的時候就不得不考慮存儲的問題,而存儲卷就是為了Pod儲存資料而生的
容器磁盤上的檔案的生命周期是短暫的,這就使得在容器中運作重要應用時會出現一些問題。
 首先,當容器崩潰時,kubelet會重新開機它,但是容器中的檔案将丢失——容器以幹淨點狀态(鏡像最初點狀态)重新啟動。
 其次,在pod中同時運作多個容器時,這些容器之間通常需要共享檔案。Kubernetes中的volume就能很好的解決了這些問題      

1、Vlolume概述

Volume 提供了對各種 backend 的抽象,容器在使用 Volume 讀寫資料的時候不需要關心資料到底是存放在本地節點的檔案系統中呢還是雲硬碟上。對它來說,所有類型的 Volume 都隻是一個目錄
 
Kubernetes中的Volume提供了在容器中挂載外部存儲的能力
Pod需要設定卷來源(spec.volume)和挂載點(spec.containers.volumeMounts)兩個資訊後才可以使用相應的Volume      

2、資料卷的分類

本地(hostPath,emptyDir等)
 網絡(NFS,Ceph,GlusterFS等)
 公有雲(AWS EBS等)
 K8S資源(configmap,secret等)      

3、常用的四種資料卷

emptyDir
hostPath
NFS
雲存儲(ceph, glasterfs...)      
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)

4、Pod使用Volume步驟:

1、在Pod上定義存儲卷,并關聯至目标存儲服務上;

2、在需要用到存儲卷的容器上,挂載其所屬Pod的存儲卷      

5、 volume基本資源清單

spec:
  volumes:
  - name <string>        #存儲卷名稱辨別,僅可使用DNS标簽格式的字元,在目前Pod中必須唯一
    VOL_TYPE <Object>    #存儲卷插件及具體的目标存儲供給方的相關配置
  containers:
  - name: ...
    image: ...
    volumeMounts:
    - name <string>        #要挂載的存儲卷的名稱,必須比對存儲卷清單中的某項定義
      mountPatch <string>  #容器檔案系統上的挂載點路徑
      readOnly <boolean>   #是否挂載為隻讀模式,預設為"否"
      subPath <string>     #挂載存儲卷上的一個子目錄至指定的挂載點
      subPathExpr <string>       #挂載由指定的模式比對到的存儲卷的檔案或目錄至挂載點
      mountPropagation <string>  #挂載卷的傳播模式      

二、emptyDir(臨時存儲卷)

1、emptyDir的簡述

1》emptyDir存儲卷是Pod對象生命周期中的一個臨時目錄,類似于Docker上的docker挂載卷,在Pod對象啟動時即被建立,而在Pod對象被移除時會被一并删除
2》不具有持久能力的emptyDir存儲卷隻能用于某些特殊場景中
3》emptyDir隻是一個臨時挂載的檔案,pod删除後,該目錄也會在node節點上被删除;但是容器崩潰時,該檔案還存在



#例如:      

2、emptyDir的使用方法

1》暫存空間,例如用于基于磁盤的合并排序

2》用作長時間計算崩潰恢複時的檢查點

3》Web伺服器容器提供資料時,儲存内容管理器容器提取的檔案      

4、emptyDir的使用

案列一
#編寫資源清單:
[root@m01 /hzl]# cat emptydir.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: emptydir                   #注意大小寫
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent   #鏡像拉取政策
    volumeMounts:
    - mountPath: /hzl/      #添加容器内部的挂載點
      name: emptydir-name
 
 
 volumes:
  - name: emptydir-name
    emptyDir: {}            #建立一個空目錄
      sizeLimit: 1G         #目錄容量大小為1G





#建立pod
[root@m01 /hzl]# kubectl apply -f emptydir.yaml 
pod/emptydir created





#檢視Pod
[root@ubuntu-200 ~]# kubectl get pods -o wide
NAME                READY   STATUS             RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
emptydir-pod        1/1     Running            0          17s     10.244.2.62   ubuntu-210   <none>           <none>




#進入容器并在容器中建立檔案測試
[root@ubuntu-200 ~]# kubectl exec -it emptydir-pod -- bash
root@emptydir-pod:/# ls -l /cache/
total 0
root@emptydir-pod:/cache# touch /cache/nginx-emptydir.log
root@emptydir-pod:/cache# echo nginx-emptydir > /cache/nginx-emptydir.log 
root@emptydir-pod:/cache# cat /cache/nginx-emptydir.log 
nginx-emptydir





#在node節點上查找臨時存儲的檔案位置
[root@ubuntu-210 ~]# find / -name nginx-emptydir.log
/var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log





#檢視檔案内容
[root@ubuntu-210 ~]# cat /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log
nginx-emptydir





#在master節點上删除pod
[root@ubuntu-200 ~]# kubectl delete -f volume-emptyDir.yaml 
pod "emptydir-pod" deleted





#在node節點上檢視臨時存儲是否還存在
[root@ubuntu-210 ~]# cat /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log
cat: /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log: No such file or directory
[root@ubuntu-210 ~]# ll /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/
ls: cannot access '/var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/': No such file      
案列二
#編寫資源清單
kind: Deployment
apiVersion: apps/v1
metadata:
  name: emptydir
spec:
  selector:
    matchLabels:
      app: emptydir
  template:
    metadata:
      labels:
        app: emptydir
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - mountPath: /data/
              name: emptydir-name
        - name: php
          image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-php-v1
          volumeMounts:
            - mountPath: /opt/
              name: emptydir-name
      volumes:
        - name: emptydir-name
          emptyDir: {}
          
 
 #建立pod
 [root@m01 /hzl]# kubectl  apply -f emptydir.yaml 
deployment.apps/emptydir unchanged



#檢視pod狀态
 [root@m01 /hzl]# kubectl get pod -o wide -w
NAME                        READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
emptydir-7d5cdb7b48-qzqqg   2/2     Running   0          107s   10.244.2.2   nod02   <none>           <none>





#################################### 測試  ########################################

#進入容器nginx(進入到挂載目錄)
[root@m01 /hzl]# kubectl exec -it emptydir-7d5cdb7b48-qzqqg -c nginx -- bash
root@emptydir-7d5cdb7b48-qzqqg:/# cd /data/
root@emptydir-7d5cdb7b48-qzqqg:/data# touch hzl.txt
root@emptydir-7d5cdb7b48-qzqqg:/data# tail -f hzl.txt   #使用tail進行監控




#進入容器php(進入到挂載目錄)
[root@m01 /hzl]#  kubectl exec -it emptydir-7d5cdb7b48-qzqqg -c php -- bash
[root@emptydir-7d5cdb7b48-qzqqg html]# cd /opt/
[root@emptydir-7d5cdb7b48-qzqqg html]# ls 
[root@emptydir-7d5cdb7b48-qzqqg html]# hzl.txt    #檔案在也在php容器中,實作了容器内部資料共享
[root@emptydir-7d5cdb7b48-qzqqg html]# echo ‘666’ > hzl.txt





#檢視檔案容器nginx狀态
[root@emptydir-7d5cdb7b48-qzqqg:/data# tail -f hzl.txt   
666
#在nginx容器删除檔案hzl.txt
[root@emptydir-7d5cdb7b48-qzqqg:/data# rm -rf hzl.txt



#檢視容器php的狀态
[root@emptydir-7d5cdb7b48-qzqqg html]# ll     #檢視檔案已經不存在了





#總結 :      

三、hostPath(節點存儲卷)

hostPath類型則是映射node檔案系統中的檔案或者目錄到pod裡。在使用hostPath類型的存儲卷時,也可以設定type字段,支援的類型有檔案、目錄、File、Socket、CharDevice和BlockDevice

1、hostpath的概述:

hostPath是挂載node 主機上的(當pod運作在那台主機上,hostPtah就相當于docker挂載到目前系統)
hostPath類型的存儲卷是指将工作節點上某個檔案系統的目錄或檔案挂載于Pod中的一種存儲卷,它獨立于Pod資源的生命周期,因而具有持久性。但它是工作節點本地的存儲空間,僅适用于特定情況下的存儲卷使用要求,例如,将工作節點上的檔案系統關聯為Pod的存儲卷,進而使得容器通路節點檔案系統上的資料。這一點在運作有管理任務的系統級Pod資源需要通路節點上的檔案時尤為有用      

2、hostpath支援資料類型

DirectoryCreate:如果在給定的路徑上沒有任何東⻄存在,那麼将根據需要在那⾥建立⼀個空⽬錄,權限設定為 0755,與 Kubelet 具有相同的組和所有權;

Directory:     給定的路徑下必須存在⽬錄;

FileOrCreate:  如果在給定的路徑上沒有任何東⻄存在,那麼會根據需要建立⼀個空⽂件,權限設定為0644,與 Kubelet 具有相同的組和所有權;

File:          給定的路徑下必須存在⽂件;

Socket:        給定的路徑下必須存在 UNIX 套接字;

CharDevice:    給定的路徑下必須存在字元裝置;

BlockDevice:   給定的路徑下必須存在塊裝置;

“” :            空字元串,預設配置,在關聯hostPath存儲卷之前不進行任何檢查      

3、hostpath的使用

案列二
#檢視文檔:https://kubernetes.io/docs/concepts/storage/volumes#hostpath
[root@m01 /hzl]# kubectl explain pod.spec.volumes.hostPath
KIND:     Pod
VERSION:  v1

RESOURCE: hostPath <Object>
.......
.....




#建立資源配置清單
[root@m01 /hzl]# cat hostpath.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: hostpath
spec:
  selector:
    matchLabels:
      app: hostpath
  template:
    metadata:
      labels:
        app: hostpath
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - mountPath: /opt/
              name: hostpath-name
      volumes:
        - name: hostpath-name
          hostPath:
            path: /opt/hzl/hhh
            type: DirectoryCreate



#建立pod
[root@m01 /hzl]# kubectl apply -f hostpath.yaml 
deployment.apps/hostpath created





#檢視pod狀态
[root@m01 /hzl]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
hostpath-6b8bd7459d-bpfhb   1/1     Running   0          25s
[root@m01 /hzl]# kubectl get pods -o wide     #檢視部署到node位置
NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
hostpath-6b8bd7459d-bpfhb   1/1     Running   0          3m11s   10.244.1.4   nod01   <none>           <none>





#在node01上檢視(給定挂載的位置沒有東西,就會自己建立并授權755)
[root@nod01 /opt]# ll
總用量 1
drwxr-xr-x 3 root root  17 8月   9 21:46 hzl
[root@nod01 /hzl]# cd /opt/hzl/hhh/
[root@nod01 /opt/hzl/hhh]# pwd 
/opt/hzl/hhh



ps : 使用DirectoryCreate類型,挂載目錄點,不管存不存在,都不影響正常挂載。即,如果挂載點存存在,則直接挂載,如果不存在,則自動建立目錄并挂載

#################################### 測試   ####################################
#更改資源清單
[root@m01 /hzl]# vim hostpath.yaml
.......
....
volumes:
        - name: hostpath-name
          hostPath:
            path: /opt/hzl/hhh
            type: Directory      #更改資料類型
            
            
            
 
#建立pod
[root@m01 /hzl]# kubectl apply -f hostpath.yaml 
deployment.apps/hostpath configured



#檢視pod(節點為node02)
[root@m01 /hzl]# kubectl get pod
NAME                        READY   STATUS              RESTARTS   AGE
hostpath-6b8bd7459d-bpfhb   1/1     Running             0          13m
hostpath-b5fb78645-9fd4r    0/1     ContainerCreating   0          33s    #檢視發現一直在建立中
[root@m01 /hzl]# kubectl get pod -o wide 
NAME                        READY   STATUS              RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
hostpath-6b8bd7459d-bpfhb   1/1     Running             0          17m     10.244.1.4   nod01   <none>           <none>
hostpath-b5fb78645-9fd4r    0/1     ContainerCreating   0          4m46s   <none>       nod02   <none>           <none>








#檢視詳情
[root@m01 /hzl]# kubectl describe pods hostpath-b5fb78645-9fd4r 
.......
...
Events:
  Type     Reason       Age                 From               Message
  ----     ------       ----                ----               -------
  Normal   Scheduled    107s                default-scheduler  Successfully assigned default/hostpath-b5fb78645-9fd4r to nod02
  Warning  FailedMount  43s (x8 over 107s)  kubelet            MountVolume.SetUp failed for volume "hostpath-name" : hostPath type check failed: /opt/hzl/ is not a directory      #檢視原因為挂載時找不到目錄而一直等待
  
  
  



#手動建立目錄(nod02)
[root@nod02 ~]# cd /opt/
[root@nod02 /opt]# mkdir  hzl
[root@nod02 /opt]# ll
總用量 1
drwxr-xr-x 2 root root   6 8月   9 22:04 hzl
[root@nod02 /opt]# 



#檢視pod狀态(m01)
[root@m01 /hzl]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
hostpath-b5fb78645-9fd4r   1/1     Running   0          6m38s   #檢視pod已經正常建立運作


ps      
案列二
#編寫資源清單
[root@m01 /hzl]# cat volume-hostPath-test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: hostpath-test-pod
spec:
  containers:
  - name: nginx-hostpath
    image: nginx
    volumeMounts:
    - mountPath: /var/logs/
      name: data-log
  #定義hostPath卷名,和主控端共享的路徑
  volumes:
  - name: data-log
    hostPath:
      path: /data/logs
      

#建立pod
[root@m01 /hzl]# kubectl apply -f volume-hostPath-test.yaml
[root@m01 /hzl]# kubectl get pods -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
hostpath-test-pod   1/1     Running   0          66m   10.244.2.65   ubuntu-210   <none>           <none>



#在node節點上的共享目錄上建立檔案
[root@m01 /hzl]# echo 111 > /data/logs/1.txt
[root@m01 /hzl]# cat /data/logs/1.txt 
111




#在master節點上進入pod,檢視挂載卷的檔案内容
[root@m01 /hzl]# kubectl exec -it hostpath-test-pod -- bash
root@hostpath-test-pod:/# cat /var/logs/1.txt 
111



#在pod内檢視和建立建立檔案
root@hostpath-test-pod:/# ls /var/logs/
1.txt
root@hostpath-test-pod:/# echo ’666‘ > /var/logs/2.txt
root@hostpath-test-pod:/# cat /var/logs/2.txt 
666
root@hostpath-test-pod:/# ls /var/logs/
1.txt 2.txt

#在Node節點上檢視pod内部建立的檔案
[root@m01 /hzl]# cat /data/logs/2.txt 
666




#删除Pod
[root@m01 /hzl]# kubectl delete -f  volume-hostPath-test.yaml 
pod "hostpath-test-pod" deleted




#Node節點上檢視檔案是否存在
[root@m01 /hzl]# ll /data/logs/
total 16
drwxr-xr-x 2 root root 4096 Dec  8 08:46 ./
drwxr-xr-x 4 root root 4096 Dec  8 07:34 ../
-rw-r--r-- 1 root root    4 Dec  8 08:43 1.txt
-rw-r--r-- 1 root root    4 Dec  8 08:46 2.txt #可看到在Pod内部建立的檔案依然存在,沒有随pod的删除而删除,已初步實作了持久化.
[root@m01 /hzl]# cat /data/logs/2.txt 
666      

四、nfs存儲卷(pv、pvc)

nfs卷能将NFS(網絡檔案系統)挂載到你的pod中。不像emptyDir,當删除Pod時,nfs卷的内容被保留,卷僅僅是被解除安裝。另外,NFS是檔案系統級共享服務,它支援同時存在的多路挂載請求

1、nfs存儲卷的概述

nfs使得我們可以挂載已經存在的共享到我們的Pod中,和emptyDir不同的是,當Pod被删除時,emptyDir也會被删除。但是nfs不會被删除,僅僅是解除挂在狀态而已,這就意味着NFS能夠允許我們提前對資料進行處理,而且這些資料可以在Pod之間互相傳遞,并且nfs可以同時被多個pod挂在并進行讀寫



ps      

2、pv、pvc的介紹

PersistentVolume(PV)是叢集中已由管理者配置的一段網絡存儲。 叢集中的資源就像一個節點是一個叢集資源。 PV是諸如卷之類的卷插件,但是具有獨立于使用PV的任何單個pod的生命周期。 該API對象捕獲存儲的實作細節,即NFS,iSCSI或雲提供商特定的存儲系統

PersistentVolumeClaim(PVC)是使用者存儲的請求。PVC的使用邏輯:在pod中定義一個存儲卷(該存儲卷類型為PVC),定義的時候直接指定大小,pvc必須與對應的pv建立關系,pvc會根據定義去pv申請,而pv是由存儲空間建立出來的。pv和pvc是kubernetes抽象出來的一種存儲資源      

3、PV和PVC的生命周期

将PV看作可用的存儲資源,PVC則是對存儲資源的需求
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)
(1)#資源供應

 k8s支援兩種資源的供應模式:靜态模式(Static)和動态模式(Dynamic)。資源供應的結果就是建立好的PV

    1>靜态模式:叢集管理者手工建立許多PV,在定義PV時需要将後端存儲的特性進行設定。

    2>動态模式:叢集管理者無需手工建立PV,而是通過StorageClass的設定對後端存儲進行描述,标記為某種類型。此時要求PVC對存儲的類型進行聲明,系統将自動完成PV的建立及與PVC的綁定。PVC可以聲明Class為"",說明該PVC禁止使用動态模式。




(2)#資源綁定
 在定義好PVC之後,系統将根據PVC對存儲資源的要求(存儲空間和通路模式)在已存在的PV中選擇一個滿足PVC要求的PV,一旦找到,就将該PV與定義的PVC進行綁定,應用就可以使用這個PVC了。
 如果系統中沒有這個PV,則PVC則會一直處理Pending狀态,直到系統中有符合條件的PV。PV一旦綁定到PVC上,就會被PVC獨占,不能再與其他PVC進行綁定。
 當PVC申請的存儲空間比PV的少時,整個PV的空間就都能夠為PVC所用,可能會造成資源的浪費。
 如果資源供應使用的是動态模式,則系統在為PVC找到合适的StorageClass後,将自動建立一個PV并完成與PVC的綁定。





(3)#資源使用
 Pod使用Volume定義,将PVC挂載到容器内的某個路徑進行使用。
 Volume的類型為Persistent VolumeClaim,在容器挂載了一個PVC後,就能被持續獨占使用。多個Pod可以挂載到同一個PVC上。

volumes:
  - name: pv
    persistentVolumeClaim:
      claimName: pvc




(4)#資源釋放
 當存儲資源使用完畢後,可以删除PVC,與該PVC綁定的PV會被标記為“已釋放”,但還不能立刻與其他PVC進行綁定。通過之前PVC寫入的資料可能還被保留在儲存設備上,隻有在清除之後該PV才能被再次使用。




(5)#資源回收      

4、存儲管理機制

靜态資源供應模式下,通過PV和PVC完成綁定,并供Pod使用的存儲管理機制:
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)
動态資源供應模式下,通過StorageClass和PVC完成資源動态綁定(系統自動生成PV),并供Pod使用的存儲管理機制
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)

5、簡述pv過載過程

1>使用者送出一個包含PVC的POD

2>排程器把根據各種排程算法把該POD配置設定到某個節點,比如node01

3>Node01上的kubelet等待Volume Manager準備儲存設備

4>PV控制器調用存儲插件建立PV并與PVC進行綁定

5>Attach/Detach Controller或Volume Manager通過存儲插件實作裝置的attach。(這一步是針對塊裝置存儲)

6>Volume Manager等待儲存設備變為可用後,挂載該裝置到/var/lib/kubelet/pods/<Pod 的 ID>/volumes/kubernetes.io~<Volume 類型 >/<Volume 名字 >目錄上

7>Kubelet被告知卷已經準備好,開始啟動POD,通過映射方式挂載到容器中      

【pv、pvc的使用(全部節點必須安裝nfs)】

1、安裝nfs

[root@m01 /hzl]# yum install nfs-utils rpcbind  -y
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * epel: mirror.sjtu.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
.......
...



#配置檔案添加
[root@m01 /hzl]# mkdir -p /nfs/v{1..3}
[root@m01 /hzl]# cat > /etc/exports <<EOF
> /nfs/v1  192.168.15.0/24(rw,no_root_squash)
> /nfs/v2  192.168.15.0/24(rw,no_root_squash)
> /nfs/v3  192.168.15.0/24(rw,no_root_squash)
> EOF




#啟動 nfs rpcbind
[root@m01 /hzl]# systemctl enable --now rpcbind nfs-server.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.




#檢視配置狀态
[root@m01 /hzl]# exportfs -arv
exporting 192.168.15.0/24:/nfs/v3
exporting 192.168.15.0/24:/nfs/v2
exporting 192.168.15.0/24:/nfs/v1





#檢視挂載點
[root@m01 /hzl]#  showmount -e
Export list for m01:
/nfs/v3 192.168.15.0/24
/nfs/v2 192.168.15.0/24
/nfs/v1 192.168.15.0/24      

2、nfs存儲卷(建立pv、pvc)

#編寫資源清單 :pv
[root@m01 /hzl]# cat pv1.yaml 
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv1
  labels:
    app: pv1
spec:
  nfs:
    path: /nfs/v1
    server: 192.168.15.55
  accessModes:
    - "ReadWriteMany"
  capacity:
    storage: 2Gi



[root@m01 /hzl]# cat pv2.yaml 
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv2
  labels:
    app: pv2
spec:
  nfs:
    path: /nfs/v2
    server: 192.168.15.55
  accessModes:
    - "ReadWriteMany"
  capacity:
    storage: 10Gi



[root@m01 /hzl]# cat pv3.yaml 
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv3
  labels:
    app: pv3
spec:
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /nfs/v3
    server: 192.168.15.55
  accessModes:
    - "ReadWriteMany"
  capacity:
    storage: 10Gi




#建立所有:pv
[root@m01 /hzl]# kubectl apply -f pv1.yaml 
persistentvolume/pv1 created
[root@m01 /hzl]# kubectl apply -f pv2.yaml 
persistentvolume/pv2 created
[root@m01 /hzl]# kubectl apply -f pv3.yaml 
persistentvolume/pv3 created




#檢視所有:pv
[root@m01 /hzl]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    2Gi        RWX            Retain           Available                                   12m
pv2    10Gi       RWX            Retain           Available                                   2s
pv3    10Gi       RWX            Recycle          Available                                   98s







#######################################################################


#建立資源清單 :pvc
[root@m01 /hzl]# cat pvc1.yaml 
piVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
    - "ReadWriteMany"
  resources:
    requests:
      storage: "6Gi"





[root@m01 /hzl]# cat pvc2.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc3
spec:
  accessModes:
    - "ReadWriteMany"
  resources:
    requests:
      storage: "6Gi"







#建立:pvc
[root@m01 /hzl]# kubectl apply -f pvc1.yaml 
persistentvolumeclaim/pvc1 created
[root@m01 /hzl]# kubectl apply -f pvc2.yaml 
persistentvolumeclaim/pvc2 created







#檢視pv,pvc(根據設定pvc的大小自動關聯所合适的pv)
[root@m01 /hzl]# kubectl get pv,pvc      

3、nfs存儲卷的挂載使用(單節點挂載)

#編寫資源清單
[root@m01 /hzl]# cat deployment.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: test-rwo
spec:
  selector:
    matchLabels:
      app: rwo
  template:
    metadata:
      labels:
        app: rwo
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - mountPath: /data/  #容器内的挂載點
              name: rwo
      volumes:
        - name: rwo
          persistentVolumeClaim:
            claimName: pvc1     



#建立pod
[root@m01 /hzl]# kubectl apply -f deployment.yaml 
deployment.apps/test-rwo unchanged





#檢視pod(已經正常運作)
[root@m01 /hzl]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
test-rwo-6dcb5687f-sxlmq   1/1     Running   0          2m27s

#檢視詳情(nginx已經正常運作到node02上)
[root@m01 /hzl]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
test-rwo-6dcb5687f-sxlmq   1/1     Running   0          7m1s   10.244.2.5   nod02   <none>           <none>




#檢視pvc綁定狀态(綁定成功狀态)

[root@m01 /hzl]# kubectl get pv,pvc
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM          STORAGECLASS   REASON   AGE
persistentvolume/pv1   2Gi        RWX            Retain           Available                                          86m
persistentvolume/pv2   10Gi       RWX            Retain           Bound       default/pvc3                           18s
persistentvolume/pv3   10Gi       RWX            Recycle          Bound       default/pvc1                           75m

NAME                         STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc1   Bound    pv3      10Gi       RWX                           68m
persistentvolumeclaim/pvc3   Bound    pv2      10Gi       RWX                           3s


################################### 測試   #####################################

#進入容器測試
[root@m01 /hzl]# kubectl exec -it test-rwo-6dcb5687f-sxlmq -- bash
root@test-rwo-6dcb5687f-sxlmq:/# cd /data/
root@test-rwo-6dcb5687f-sxlmq:/data# ls
root@test-rwo-6dcb5687f-sxlmq:/data# touch hzl.txt
root@test-rwo-6dcb5687f-sxlmq:/data# ls
hzl.txt




#檢視挂載目錄測試狀态(檔案已建立)
[root@m01 /nfs/v3]# cd /nfs/v3/
[root@m01 /nfs/v3]# pwd
/nfs/v3
[root@m01 /nfs/v3]# ls
hzl.txt     




#删除pv、pvc
[root@m01 /hzl]# kubectl delete pv pvc3 
persistentvolume "pvc3" deleted
[root@m01 /hzl]# kubectl delete pv pv2 
persistentvolume "pv2" deleted



#檢視挂載點狀态
[root@m01 /nfs/v3]# ll
總用量 0
-rw-r--r-- 1 root root 0 8月  10 00:56 hzl.txt



ps :      

4、nfs存儲卷(多點挂載使用)

#更改pv、pvc政策
[root@m01 /hzl]# cat pv2.yaml 
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv2
  labels:
    app: pv2
spec:
  nfs:
    path: /nfs/v2
    server: 192.168.15.55
  accessModes:
    - "ReadOnlyMany"    #更改模式
  capacity:
    storage: 10Gi


[root@m01 /hzl]# cat pvc3.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc3
spec:
  accessModes:
    - "ReadOnlyMany"    #更改模式
  resources:
    requests:
      storage: "6Gi"


#編寫資源清單
[root@m01 /hzl]# cat deployment1.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: test-rwo-2
spec:
  selector:
    matchLabels:
      app: test-rwo-2
  template:
    metadata:
      labels:
        app: test-rwo-2
    spec:
      containers:
        - name: nginx1
          image: nginx
          volumeMounts:
            - mountPath: /data/
              name: test-rwo
       
      volumes:
        - name: test-rwo
          persistentVolumeClaim:
            claimName: pvc3



#建立pv,pvc
[root@m01 /hzl]# kubectl apply -f pv2.yaml
persistentvolumeclaim/pv2 unchanged
[root@m01 /hzl]# kubectl apply -f pvc3.yaml
persistentvolumeclaim/pvc3 unchanged
#建立pod
[root@m01 /hzl]# kubectl apply -f deployment1.yaml 
deployment.apps/test-rwo-2 unchanged



#檢視pc,pvc(pvc3已經綁定pv2上)
[root@m01 /hzl]# kubectl get pv,pvc
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM          STORAGECLASS   REASON   AGE
persistentvolume/pv1   2Gi        RWX            Retain           Available                                          155m
persistentvolume/pv2   10Gi       ROX            Retain           Bound       default/pvc3                           18s
persistentvolume/pv3   10Gi       RWX            Recycle          Bound       default/pvc1                           144m

NAME                         STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc1   Bound    pv3      10Gi       RWX                           137m
persistentvolumeclaim/pvc3   Bound    pv2      10Gi       ROX                           10s




#檢視pod
[root@m01 /hzl]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
test-rwo-2-66ddb84cf7-tw4mx   1/1     Running   0          31m
test-rwo-6dcb5687f-s496r      1/1     Running   0          13s




[root@m01 /hzl]# kubectl exec -it test-rwo-2-66ddb84cf7-tw4mx -- bash
Defaulted container "nginx1" out of: nginx1, nginx2
root@test-rwo-2-66ddb84cf7-tw4mx:/# cd /data/
root@test-rwo-2-66ddb84cf7-tw4mx:/data# touch 123.txt
root@test-rwo-2-66ddb84cf7-tw4mx:/data# ls
123.txt



[root@m01 /hzl]# kubectl exec -it test-rwo-6dcb5687f-s496r -- bash
root@test-rwo-2-66ddb84cf7-tw4mx:/# cd /data/
root@test-rwo-2-66ddb84cf7-tw4mx:/data# ls
123.txt      

5、案列(資料持久化)

#先配置nfs伺服器
[root@C8_58 test]# yum -y install nfs-utils
[root@C8_58 test]# cat /etc/exports
/data/test *(rw)
[root@C8_58 test]# mkdir -p /data/test
[root@C8_58 test]# echo nginx web > /data/test/index.html
[root@C8_58 test]# systemctl restart nfs-server

#測試能否正常挂載
[root@ubuntu-220 ~]# apt -y install nfs-server
[root@ubuntu-220 ~]# showmount -e 10.0.0.58
Export list for 10.0.0.58:
/data/test *
[root@ubuntu-220 ~]# mount -t nfs 10.0.0.58:/data/test /mnt/
[root@ubuntu-220 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
udev                  955M     0  955M   0% /dev
tmpfs                 198M   13M  185M   7% /run
/dev/sda2              98G  5.4G   88G   6% /
tmpfs                 986M     0  986M   0% /dev/shm
tmpfs                 5.0M     0  5.0M   0% /run/lock
tmpfs                 986M     0  986M   0% /sys/fs/cgroup
/dev/loop1             97M   97M     0 100% /snap/core/9665
/dev/loop0             98M   98M     0 100% /snap/core/10444
/dev/sda3             976M  146M  764M  16% /boot
/dev/sda5              95G   61M   91G   1% /data
tmpfs                 198M     0  198M   0% /run/user/0
10.0.0.58:/data/test   50G  390M   50G   1% /mnt

#編寫資源清單
[root@ubuntu-200 ~]# cat volume-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-nfs
  labels:
    app: nginx-nfs
spec:
  containers:
  - name: nginx-nfs
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: my-nfs-volume
  volumes:
  - name: my-nfs-volume
    nfs:
      server: 10.0.0.58
      path: /data/test

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30016
    protocol: TCP
  type: NodePort
  selector:
    app: nginx-nfs

#建立Pod及service
[root@ubuntu-200 ~]# kubectl apply -f volume-nfs.yaml
[root@ubuntu-200 ~]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
nginx-nfs   1/1     Running   0          24m   10.244.2.67   ubuntu-210   <none>           <none>
[root@ubuntu-200 ~]# kubectl get service nginx-service -o wide
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE   SELECTOR
nginx-service   NodePort   10.104.177.209   <none>        81:30016/TCP   25m   app=nginx-nfs

#進入Pod檢視是否挂載成功
[root@ubuntu-200 ~]# kubectl exec -it nginx-nfs -- bash
root@nginx-nfs:/# cat /usr/share/nginx/html/index.html 
nginx web




##########################################################################



#編輯資源清單
[root@ubuntu-200 ~]# cat volume-nfs-redis.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: volume-nfs-redis
  labels:
    app: redis
spec:
  containers:
  - name: redis
    image: redis:alpine
    securityContext:    #配置了這項,需要在nfs伺服器讓id為999的賬戶對共享的指令有讀寫寫權限
      runAsUser: 999
    ports:
    - containerPort: 6379
      name: redisport
    volumeMounts:
    - mountPath: /data
      name: redisdata
  volumes:
  - name: redisdata
    nfs:
      server: 10.0.0.58
      path: /data/redis
      readOnly: false 

#建立pod
[root@ubuntu-200 ~]# kubectl apply -f volume-nfs-redis.yaml

#進入Pod
[root@ubuntu-200 ~]# kubectl exec -it volume-nfs-redis -- /bin/sh
#登入redis并建立
/data $ redis-cli 
127.0.0.1:6379> set name yang
OK
127.0.0.1:6379> get name
"yang"
127.0.0.1:6379> bgsave
#檢視建立的redis檔案
/data $ ls -l
total 4
-rw-r--r--    1 1099     nobody         120 Dec  9 13:19 dump.rdb

#在nfs伺服器主機上也能看到
[root@C8_58 ~]# ll /data/redis/
total 4
-rw-r--r-- 1 redis nobody 120 Dec  9 21:19 dump.rdb

#删除鏡像,重新建立一次
[root@ubuntu-200 ~]# kubectl delete -f volume-nfs-redis.yaml 
pod "volume-nfs-redis" deleted
[root@ubuntu-200 ~]# kubectl apply  -f volume-nfs-redis.yaml 
pod/volume-nfs-redis created
[root@ubuntu-200 ~]# kubectl get pod -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
volume-nfs-redis   1/1     Running   0          8s    10.244.2.71   ubuntu-210   <none>           <none>

#再次進入pod,可看到資料仍然存在,已實作持久化.
[root@ubuntu-200 ~]# kubectl exec -it volume-nfs-redis  -- /bin/sh
/data $ ls
dump.rdb
/data $ redis-cli 
127.0.0.1:6379> get name
"yang"      

【 使用存儲卷搭建lnmp】

1、建立資源清單(資料庫)

#資源清單編寫:(資料庫)
[root@m01 /hzl]# cat mysql.yaml 
kind: Namespace
apiVersion: v1
metadata:
  name: mysql
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: mysql
  namespace: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
            - name: MYSQL_DATABASE
              value: discuz
          livenessProbe:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - "cat /etc/mysql/my.cnf"
            initialDelaySeconds: 0
            periodSeconds: 3
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            tcpSocket:
              port: 3306
            initialDelaySeconds: 30
            periodSeconds: 1
            timeoutSeconds: 1
            successThreshold: 3
            failureThreshold: 1
---
kind: Service
apiVersion: v1
metadata:
  name: mysql
  namespace: mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP
      name: mysql
  selector:
    app: mysql




#建立pod
[root@m01 /hzl]# kubectl apply -f mysql.yaml 
namespace/mysql unchanged
deployment.apps/mysql configured
service/mysql unchanged



#檢視pod
[root@m01 /hzl]# kubectl get -n mysql pods
NAME                     READY   STATUS    RESTARTS   AGE
mysql-7795495b8b-b2lwq   1/1     Running   0          28m



#檢視svc
[root@m01 /hzl]# kubectl get svc -n mysql
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
mysql   ClusterIP   10.102.58.127   <none>        3306/TCP   36m      

2、建立資源清單(web+php)

#資源清單編寫:
[root@m01 /hzl]# cat descuz.yaml 
kind: Namespace
apiVersion: v1
metadata:
  name: web
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: discuz
  labels:
    app: discuz
spec:
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/discuz
    server: 192.168.15.55
  accessModes:
    - "ReadWriteMany"
  capacity:
    storage: 10Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: discuz
  namespace: web
spec:
  accessModes:
    - "ReadWriteMany"
  resources:
    requests:
      storage: "6Gi"
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: discuz
  namespace: web
spec:
  replicas: 5
  selector:
    matchLabels:
      app: discuz
  template:
    metadata:
      labels:
        app: discuz
    spec:
      containers:
        - name: php
          image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-php-v1
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /usr/share/nginx/html/
              name: discuz
        - name: nginx
          image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-v1
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /usr/share/nginx/html/
              name: discuz
      volumes:
        - name: discuz
          persistentVolumeClaim:
            claimName: discuz
---
kind: Service
apiVersion: v1
metadata:
  name: discuz
  namespace: web
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
      nodePort: 30080
  type: NodePort
  selector:
    app: discuz
    
  
  
  
#建立pod  
[root@m01 /hzl]# kubectl apply -f discuz.yaml 
namespace/discuz unchanged
deployment.apps/discuz configured
service/discuz unchanged   
   
    
    
    
#檢視pod    
[root@m01 /hzl]# kubectl get -n web pods
NAME                      READY   STATUS    RESTARTS   AGE
discuz-587854655b-5h4q8   2/2     Running   0          15m
discuz-587854655b-97wr2   2/2     Running   0          15m
discuz-587854655b-9ktlb   2/2     Running   0          15m
discuz-587854655b-lzqf2   2/2     Running   0          15m
discuz-587854655b-vjqm9   2/2     Running   0          15m




#檢視pv,pvc狀态
[root@m01 /hzl]# kubectl get svc -n web 
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
discuz   NodePort   10.102.201.10   <none>        80:30080/TCP   17m
[root@m01 /hzl]# kubectl get pv,pvc      

3、測試部署(lnmp)

#檢視svc
[root@m01 /hzl]# kubectl get svc -n web 
NAME     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
discuz   NodePort   10.102.201.10   <none>        80:30080/TCP   17m
 
 
 
 
#給配置檔案添權重限(使用者www)
[root@m01 /nfs]# useradd www
[root@m01 /nfs]# chown +777 -R /nfs/discuz/   #授最高權限
[root@m01 /nfs]# chown www.www -R /nfs/discuz/
[root@m01 /nfs]# ll
總用量 4
drwxrwxrwx 14 www  www  4096 8月  10 04:01 discuz


#使用浏覽器測試:ok      
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)

五、StorageClass(存儲類别)

PV是需要運維人員手動建立的,開發操作PVC,可是大規模叢集中可能會有很多PV,如果這些PV都需要運維手動來處理這也是一件很繁瑣的事情,是以就有了動态供給概念,也就是Dynamic Provisioning。而我們上面的建立的PV都是靜态供給方式,也就是Static Provisioning。而動态供給的關鍵就是StorageClass,它的作用就是建立PV模闆

每一個存儲類都包含provisioner、parameters和reclaimPolicy這三個參數域,當一個屬于某個類的PersistentVolume需要被動态提供時,将會使用上述的參數域

1、簡述StorageClass

1>StorageClass作為對存儲資源的抽象定義,對使用者設定的PVC申請屏蔽後端存儲的細節,一方面減少了使用者對存儲資源細節的關注,另一方面減少了管理者手工管理PV的工作,由系統自動完成PV的建立和綁定,實作了動态的資源供應

2>StorageClass的定義主要包括名稱、後端存儲的提供者(privisioner)和後端存儲的相關參數配置

3>StorageClass一旦被建立,就無法修改,如需修改,隻能删除重建      
基本架構:
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)

2、StorageClass的使用

​​【helm官方網站】​​
@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)
1)# 下載下傳helm
[root@m01 /hzl]# wget https://get.helm.sh/helm-v3.3.4-linux-amd64.tar.gz
--2021-08-10 10:35:32--  https://get.helm.sh/helm-v3.3.4-linux-amd64.tar.gz
正在解析主機 get.helm.sh (get.helm.sh)... 152.199.39.108, 2606:2800:247:1cb7:261b:1f9c:2074:3c
# 解壓
[root@m01 /hzl]# tar xf helm-v3.3.4-linux-amd64.tar.gz





2)# 安裝工作目錄
[root@m01 /hzl]# mv linux-amd64/helm /usr/local/bin/





3)# 驗證安裝
[root@m01 /hzl]# helm version
version.BuildInfo{Version:"v3.3.4", GitCommit:"a61ce5633af99708171414353ed49547cf05013d", GitTreeState:"clean", GoVersion:"go1.14.9"}





4)#添加倉庫
# 阿裡雲鏡像倉庫(推薦使用)
[root@m01 /hzl]# helm repo add ali-stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"ali-stable" has been added to your repositories
# 官方倉庫
[root@m01 /hzl]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories





5)# 檢視倉庫清單
[root@m01 /hzl]# helm repo list
NAME        URL                                                   
ali-stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
bitnami    https://charts.bitnami.com/bitnami   






6)#建立helm使用目錄(緩存、配置檔案、資料存放目錄)
[root@m01 ~]# mkdir -p  $HOME/.cache/helm 
[root@m01 ~]# mkdir -p $HOME/.config/helm 
[root@m01 ~]# mkdir -p $HOME/.local/share/helm





7)#查找搜尋安裝包
[root@m01 /hzl]# helm search repo nginx 
NAME                              CHART VERSION  APP VERSION  DESCRIPTION                                       
ali-stable/nginx-ingress          0.9.5          0.10.2      An nginx Ingress controller that uses ConfigMap...
ali-stable/nginx-lego            0.3.1                      Chart for nginx-ingress-controller and kube-lego  
bitnami/nginx                    9.4.2          1.21.1      Chart for the nginx server                        
bitnami/nginx-ingress-controller  7.6.18        0.48.1      Chart for the nginx Ingress controller            
bitnami/kong                      3.8.1          2.5.0        Kong is a scalable, open source API layer (aka ...
ali-stable/gcloud-endpoints      0.1.0                      Develop, deploy, protect and monitor your APIs ...







8)# 使用helm下載下傳mysql測試
[root@m01 /hzl]# helm search repo mysql   #搜尋mysql
NAME                              CHART VERSION  APP VERSION  DESCRIPTION                                       
ali-stable/mysql                  0.3.5                      Fast, reliable, scalable, and easy to use open-...
bitnami/mysql                      8.8.3          8.0.26      Chart to create a Highly available MySQL cluster  
ali-stable/percona                0.3.0                      free, fully compatible, enhanced, open source d...
ali-stable/percona-xtradb-cluster  0.0.2          5.7.19      free, fully compatible, enhanced, open source d...
bitnami/phpmyadmin                8.2.11        5.1.1        phpMyAdmin is an mysql administration frontend    
ali-stable/gcloud-sqlproxy        0.2.3                      Google Cloud SQL Proxy                            
ali-stable/mariadb                2.1.6          10.1.31      Fast, reliable, scalable, and easy to use open-...
bitnami/mariadb                    9.4.2          10.5.12      Fast, reliable, scalable, and easy to use open-...
bitnami/mariadb-cluster            1.0.2          10.2.14      DEPRECATED Chart to create a Highly available M...
bitnami/mariadb-galera            5.11.2        10.5.11      MariaDB Galera is a multi-master database clust...
[root@m01 /hzl]# helm pull bitnami/mysql
[root@m01 /hzl]# ll |grep mysql
-rw-r--r-- 1 root root    38954 8月  10 11:05 mysql-8.8.3.tgz      

【helm安裝nfs(storageclass)】

1)#使用helm安裝
[root@m01 ~]# helm repo add ckotzbauer https://ckotzbauer.github.io/helm-charts
"ckotzbauer" has been added to your repositories    #添加倉庫
[root@m01 ~]# helm search repo nfs-client        #搜尋nfs-client
NAME                              CHART VERSION  APP VERSION  DESCRIPTION                                       
ckotzbauer/nfs-client-provisioner  1.0.2          3.1.0        nfs-client is an automatic provisioner that use...
[root@m01 ~]# helm pull ckotzbauer/nfs-client-provisioner     #使用helm進行拉取
[root@m01 ~]# ll |grep nfs-client-provisioner
-rw-r--r-- 1 root root      4802 8月  10 2021 nfs-client-provisioner-1.0.2.tgz
[root@m01 ~]# tar xf nfs-client-provisioner-1.0.2.tgz 






2)#跟改檔案使用參(下圖所示)
[root@m01 ~/nfs-client-provisioner]# vim values.yaml 






3)#安裝nfs
[root@m01 ~/nfs-client-provisioner]# helm install nfs  ./
NAME: nfs
LAST DEPLOYED: Tue Aug 10 11:50:50 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
#解除安裝
[root@m01 ~/nfs-client-provisioner]# helm uninstall nfs





4)#檢視pod
[root@m01 ~/nfs-client-provisioner]# kubectl  get pods
NAME                                          READY   STATUS    RESTARTS   AGE
nfs-nfs-client-provisioner-5c854cb79b-pph46   1/1     Running   0          2m17s





5)#檢視建立的nfs叢集(預設命名空間為default)
[root@m01 ~/nfs-client-provisioner]# kubectl get storageclasses.storage.k8s.io 
NAME                        PROVISIONER                                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-storagclass (default)   cluster.local/nfs-nfs-client-provisioner   Delete          Immediate           true                   4m4s







------------------------------------------------------------------------------------------------------------------------------------------------------
(問題1)
#添加配置檔案(如果有報錯,使用此參數)
[root@m01 /hzl]#  vim /etc/kubernetes/manifests/kube-apiserver.yaml
......
....
- --feature-gates=RemoveSelfLink=false         #自動連結
......
....
[root@m01 /hzl]# kubectl delete -n kube-system pod kube-apiserver
[root@m01 /hzl]# kubectl apply -f kube-apiserver.yaml 

(問題2)
#建立使用目錄 
[root@m01 /hzl]# mkdir /nfs/v1 -p
[root@m01 /hzl]# chown +777 -R /nfs/v1`      

1、使用storageclasses

#資源清單編寫
[root@m01 /hzl]# cat sc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  namespace: default
  name: test-nfs
  labels:
    app: test-nfs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-storagclass  #名稱與建立時nfs時一緻
  resources:
    requests:
      storage: 8Gi

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: test-nfs-storageclass
  namespace: default
  labels:
    app: test-nfs
spec:
  selector:
    matchLabels:
      app: test-nfs
  template:
    metadata:
      labels:
        app: test-nfs
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: test-nfs
      volumes:
        - name: test-nfs
          persistentVolumeClaim:
            claimName: test-nfs





#建立pod
[root@m01 /hzl]# kubectl apply -f sc.yaml 
persistentvolumeclaim/test-nfs unchanged
deployment.apps/test-nfs-storageclass unchanged






#檢視已挂載(正常綁定)
[root@m01 /hzl]# kubectl get pvc
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
pvc1       Bound    pv3                                        10Gi       RWX                              13h
test-nfs   Bound    pvc-693904ab-62f6-45b1-8539-bb6d0f8c4053   8Gi        RWX            nfs-storagclass   15m



ps      

【CSI存儲機制】

Container Storage Interface(CSI)機制,用于在kubenetes和外部存儲系統之間建立一套标準的存儲管理接口,通過該接口為容器提供存儲服務

1、CSI部署架構

@kubernetes(k8s)資料持久化Volume存儲卷(emptyDir、hostPath、NFS、StorageClass)

2、CSI主要包括兩個元件:

CSI Controller

CSI Node

【CSI Controller】
#在Pod内部署兩個容器:      
【CSI Node】
#在此Pod上部署如下兩個容器:

(1)與kubelet通信的輔助sidecar容器node-driver-register,主要功能是将存儲驅動注冊到kubelet中


(2)CSI Driver存儲驅動容器,由第三方存儲提供商提供,主要功能是接收kubelet的調用,需要實作一系列與Node相關的CSI接口,例如NodePublishVolume接口(用于将Volume挂載到容器内的目标路徑)、NodeUnpublishVolume接口(用于從容器中解除安裝Volume),等等。






ps :      

繼續閱讀