k8s 持久卷使用記錄 ( PV + PVC + SC + NFS )


k8s 持久卷使用相關記錄,供后續研究參考。。。

  組成 PV ( PersistentVolume ) + PVC ( PersistentVolumeClaim ) + SC ( StorageClass ) + NFS

  k8s 持久卷掛載方案有多種,我這里使用的是 NFS 

  k8s 集群為 master + 2 node 自行搭建 使用 flannel 做網絡插件,實現k8s集群內部通信

  IP:k8s-master: 192.168.1.230

    k8s-node01:192.168.1.231

    k8s-node02:192.168.1.232

  

一、NFS 搭建

  NFS 搭建很簡單,自行百度

  需要創建對應網絡共享目錄,配置相應權限 

  

  創建完成后,即可通過k8s StorageClass 來創建存儲卷綁定策略及指定相關存儲卷插件類型

  注:需要在所有工作節點都安裝NFS 不然會在 Deployment 中部署 replicas 多實例時報錯。 通過命令 kubectl describe pods xxx  中查看 Events 事件中提示報錯信息: NFS 服務器文件系統崩壞等信息。未截圖

二、創建 SC 配置 

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bxy-storageclass
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain        #回收策略:Retain(保留)、 Recycle(回收)或者Delete(刪除)
volumeBindingMode: Immediate    #volumeBindingMode存儲卷綁定策略
allowVolumeExpansion: true    #是否允許擴容

#volumeBindingMode存儲卷綁定策略
#(控制存儲卷綁定和動態供應行為
#- Immediate:創建 PVC 后立即創建后端存儲卷,並且立即綁定新創建的 PV 和 PVC。
#- WaitForFirstConsumer:當 PVC 被 Pod 使用時,才觸發 PV 和后端存儲的創建,同時實現 PVC/PV 的綁定,啟用該配置后,Storage Class 中的 Zone 和 Region 將不再生效,而是使用 
Pod 調度所在節點的 zone 和 region 創建文件系統,保證文件系統能被 Pod 掛載。)

#StorageClass的定義包含四個部分:

#provisioner:指定 Volume 插件的類型,包括內置插件(如kubernetes.io/glusterfs、kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。

#parameters:指定 provisioner 的選項,比如 glusterfs 支持 resturl、restuser 等參數。

#mountOptions:指定掛載選項,當 PV 不支持指定的選項時會直接失敗。比如 NFS 支持 hard 和 nfsvers=4.1 等選項。

#reclaimPolicy:指定回收策略,同 PV 的回收策略。

  啟動:kubectl create -f bxy-nfs-StorageClass.yaml

  

  框起來的三個字段在上面 yaml 配置文件中有相關注釋

三、創建 PV 配置

apiVersion: v1
kind: PersistentVolume
metadata:
  name: bxy-pv
  labels:
    name: bxy-pv-labels
spec:
  capacity:                    #容量
    storage: 6Gi
  volumeMode: Filesystem            #存儲卷模式(默認值為filesystem,除了支持文件系統外(file system)也支持塊設備(raw block devices))
  accessModes:                    #訪問模式
    - ReadWriteMany                #ReadWriteOnce(RWO/該volume只能被單個節點以讀寫的方式映射),ReadOnlyMany (ROX/該volume可以被多個節點以只讀方式映射), Re
adWriteMany (RWX/該volume可以被多個節點以讀寫的方式映射)
  persistentVolumeReclaimPolicy: Retain     #回收策略:Retain(保留)、 Recycle(回收)或者Delete(刪除)
  storageClassName: bxy-storageclass            #存儲類(通過設置storageClassName字段進行設置。如果設置了存儲類,則此PV只能被綁定到也指定了此存儲類的PVC)
  mountOptions:                    #掛接選項
    - hard
    - nfsvers=4.1
  nfs:
    path: /bxy/nfsdata        #我的本地掛載路徑為 /bxy/nfsdata
    server: 192.168.1.231      #NFS 文件系統所在服務器的真實 IP 

#https://www.cnblogs.com/yanh0606/p/11269142.html

  spec.storageClassName 字段對應 StorageClass 配置中的 metedata.name 字段

  spec.mountOptions 字段沒搞太懂,此為官網中 NFS 相應掛載配置

  https://www.cnblogs.com/yanh0606/p/11269142.html  相關資料網站

  啟動:kubectl create -f bxy-nfs-pv.yaml

  

   注意創建完 PV 后,會看到 Status 類型為 Available ,這是因為 PV 還沒有和 PVC 綁定,當綁定成功后會自動改成 Bound 

四、創建 PVC 配置

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bxy-pvc
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:         #注意:我寫的是 5G ,但實際綁定成功后會自動改變為 PV 中設置的容量大小 6G
    requests:
      storage: 5Gi
  storageClassName: bxy-storageclass
  selector:
    matchLabels:
      name: bxy-pv-labels

#pvc 通過 matchLabels和pv中的label匹配,來關聯要使用的存儲空間。
#https://my.oschina.net/sskxyz/blog/3130131


#表明此PVC希望使用Label:name: "bxy-pv-labels"的PV。
#https://www.cnblogs.com/yanh0606/p/11269142.html

  spec.selector.matchLabels 這個字段與 PV 中的 labels 字段匹配

  #pvc 通過 matchLabels和pv中的label匹配,來關聯要使用的存儲空間。

  #https://my.oschina.net/sskxyz/blog/3130131

  #表明此PVC希望使用Label:name: "bxy-pv-labels"的PV。

  #https://www.cnblogs.com/yanh0606/p/11269142.html

  啟動:kubectl create -f bxy-nfs-pvc.taml

  

   注意框起來的部分,狀態為 Bound 並且容量為 6G,而不是配置文件中請求的 5G 容量

  再次回過頭來看下我們的 pv 狀態

  未創建 PVC 之前狀態:

  

   創建 PVC 后對比:

  

  在未創建 PVC 之前我的 PV 狀態為 Available ,現在狀態自動更改為 Bound,說明已經自動綁定成功,並且 CLAIM 中添加了 PVC namespace/name

  最后,我們啟動一個 NG 來,檢驗下是否能成功掛載此卷。

五、創建 Deployment 配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-nfs-deploy
spec:
  replicas: 2
  selector:
    matchLabels:    # spec.selector.matchLabels 要與 spec.template.metadata.labels 匹配!!!!不匹配不能啟動
      k8s-app: nginx-deploy-selector-labels
  template:
    metadata:
      labels: # Pod副本擁有的標簽,對應RC的Selector
        k8s-app: nginx-deploy-selector-labels
    spec:
      containers:
        - name: my-nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - mountPath: "/usr/share/nginx/html"
            name: bxy-pv # spec.template.spec.containers.name.volumeMounts.name == spec.template.spec.volumes.name
      volumes:        #持久卷相關連部分
        - name: bxy-pv      #PersistentVolume metadata.name
          persistentVolumeClaim:
            claimName: bxy-pvc  #PersistentVolumeClaim metadata.name


# Claim 必須位於使用它的 Pod 所在的同一名字空間內。

  沒啥好解釋的,注釋基本都寫了,可能有部分不是很准確,自行在摸索吧。

  啟動:kubectl create -f nginx-nfs-deploy.taml

  

  

  掛載很成功,沒啥好說的,畢竟已經實驗多次了。

  對了,這里沒有 Port 相關的配置,會在下面寫一個 Service 來做端口映射配置

  在看下具體的 Pod 吧。

  

  兩個 NG 很健康

  

  這個是 Pod 的 Events ,可以看到這個 Pod 被調度到 k8s-node02 上面了,創建啟動啥的都和正常,沒啥毛病。

  下面就是讓這個 NG 可以在外網能夠訪問。

六、創建 Service 配置

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: nginx-svc-labels
  name: nginx-nfs
  namespace: default
spec:
  clusterIP: 10.101.138.35        #集群內部IP
  externalTrafficPolicy: Cluster    #Cluster或者Local(Local 流量不會轉發到其他節點)
  ports:
  - nodePort: 29606            #NodePort,外部訪問的端口
    port: 19606                #容器間,服務調用的端口
    protocol: TCP
    targetPort: 80            #容器暴露的端口,與Dockerfile暴露端口保持一致
  selector:
    k8s-app: nginx-deploy-selector-labels  #此標簽要與deploy中的 spec.selector.matchLabels 匹配
  type: LoadBalancer

  spec.clusterIP 這個是我手動添加的,只要在 k8s flannel 網段類就可以了

  基本上都注釋的很詳細了,也不再說啥了。

  啟動看看吧。

  

  沒啥問題,訪問下看看

  

   嗯,是訪問到了,但是沒有文件,這個我們在 掛載目錄下添加個文件試試效果,順便也能確認下我們的掛載卷是否生效了

  

  在訪問下,看看效果。。。

  

  

  

   三台服務器都能訪問 NG ,這個就是 Service 中的配置效果。

  老鐵,沒毛病吧。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM