k8s中使用volume

kubernetes實現數據卷的方式是PV & PVC

PV有很多持久卷插件可以實現,例如:GCEPersistentDiskAWSElasticBlockStoreNFSISCSIRDBGlusterfsHostPath(單節點測試使用)本地持久卷

我們本次使用NFS方式,先介紹一下NFS。

NFS卷能將 NFS (網絡文件系統) 掛載到您的 Pod 中。 不像 emptyDir 那樣會在刪除 Pod 的同時也會被刪除,nfs 卷的內容在刪除 Pod 時會被保存,卷只是被卸載掉了。 這意味着 nfs 卷可以被預先填充數據,並且這些數據可以在 Pod 之間”傳遞”。
NFS 是Network File System 的縮寫,即網絡文件系統,NFS是FreeBSD支持的文件系統中的一種。NFS基於RPC遠程掉用實現,其允許一個系統在網絡上與他人共享目錄和文件,通過使用NFS,程序可以像使用本地文件一樣使用遠端系統上的文件。NFS是一個非常穩定的, 可移植的網絡文件系統,具備可擴展和高性能特性,達到了企業級應用質量標準。由於網絡速度的增加延時降低,NFS一直是通過網絡系統提供文件系統服務的有競爭力選擇

NFS原理

NFS的工作原理是使用客戶端/服務器架構,由一個客戶端程序和服務器程序組成。 從客戶端的角度來說,NFS 中的第一個操作稱爲 mount。Mount 代表將遠程文件系統加載到本地文件系統空間中。該流程以對 mount(Linux 系統調用)的調用開始,它通過 VFS 路由到 NFS 組件。確認了加載端口號之後(通過 get_port 請求對遠程服務器 RPC 調用),客戶端執行 RPC mount 請求。這一請求發生在客戶端和負責 mount 協議(rpc.mountd)的特定守護進程之間。這一守護進程基於服務器當前導出文件系統來檢查客戶端請求;如果所請求的文件系統存在,並且客戶端已經訪問了,一個 RPC mount 響應爲文件系統建立了文件句柄。客戶端這邊存儲具有本地加載點的遠程加載信息,並建立執行 I/O 請求的能力。這一協議表示一個潛在的安全問題;因此,NFSv4 用內部 RPC 調用替換這一輔助 mount 協議,來管理加載點
由於VFS的存在,客戶端可以像使用其他普通文件系統一樣使用NFS文件系統

安裝NFS服務端

  • 安裝NFS服務端

    # ubuntu
    apt-get install -y nfs-kernel-server
    # centos
    yum -y install nfs-utils rpcbind
    
  • 創建共享文件目錄,並給目錄添加讀寫權限

    mkdir -p /kubernetes/volumes
    chmod a+rw /kubernetes/volumes
    
  • 配置NFS服務目錄-打開文件/etc/exports在尾部添加內容

    /kubernetes/volumes *(rw,sync,no_subtree_check,no_root_squash)
    
  • 配置生效

    exportfs -r
    
  • 啓動rpcbind、nfs服務

    systemctl start rpcbind
    systemctl start nfs
    
  • 在 server 端先自我測試一下是否可以聯機,展示出連接目錄

    showmount -e localhost
    

    命令解釋

    配置項 含義
    * 任何ip都可以訪問
    rw 讀寫權限
    sync 同步權限
    no_subtree_check 如果輸出目錄是一個子目錄,NFS服務器不檢查其父目錄的權限
    no_root_squash 客戶端連接服務端如果使用的也是root,那麼也擁有對服務端分享目錄的root權限

安裝NFS客戶端

我們找一個新的機器進行測試

  • 安裝客戶端

    yum -y install nfs-utils
    
  • 掛載

    # 創建掛載目錄
    mkdir /testnfs
    # 掛載服務端
    mount -t nfs 10.10.103.80:/kubernetes/volumes /testnfs
    # 查看掛載結果
    df -h
    

    掛載之後,我們在客戶端的/testnfs文件夾下創建文件,會發現服務端的/kubernetes/volumes文件夾下的文件創建成功了。

  • 取消掛載(非必須)

    # 取消掛載命令
    umount /testnfs
    

kubernetes 中使用數據卷

PV(Persistent Volume)是集羣中的一塊網絡存儲,和node一樣也是集羣的資源,PV和Volume類似,不過會有獨立與Pod的生命週期,這一API對象包含了存儲的實現細節,例如NFS,ISCSI或者其他雲服務商提供的存儲系統,PVC(Persistent Volume Claim)是用戶的一個請求,跟pod類似,pod消費node資源,PVC消費PV資源。Pod能夠申請特定的資源(CPU和內存),PVC能夠請求特定的尺寸和訪問模式(例如加載一個讀寫,以及多個只讀實例)

PV 與PVC
PV是集羣的資源。PVC對這一資源的請求,也是對資源的所有權檢驗,PV和PVC之間的互動遵循如下的生命週期:

供應: 集羣管理員會創建一系列的PV,這些PV包含了爲集羣用戶提供的真是存儲資源,他們可利用kubernetes API 來消費。

綁定: 用戶創建一個包含了容量可訪問模式的持久卷申請,master會監聽PVC的產生,並嘗試根據請求內容查找匹配的PV,並把PV和PVC綁定,用戶能夠獲取滿足需要的資源, 並且在使用過程中可能超出請求數量,如果找不到合適的卷,這一申請就會持續處於綁定狀態,一直到出現合適的PV,例如一個集羣準備了很多的40G的持久卷,也無法響應41G的申請,除非把超過41G的PV加入集羣

使用: pod把申請作爲捲來使用。集羣會通過PVC查找綁定的PV,並Mount給pod,對於支持多種訪問方式的卷,用戶在使用PVC作爲卷的時候可以指定需要的訪問方式,一旦用戶擁有了一個已經綁定的PVC,被綁定的PV就歸該用戶所有了,用戶的pod能夠在pod的卷中包含PVC來訪問他們佔有的PV

釋放: 當用戶完成對卷的使用是,就可以利用API刪除對應的PVC對象了。 而且他還可以重新申請,刪除PVC後,對應的卷被視爲“被釋放”,但是這時還不能給其他的PVC使用,之前的PVC數據還保存在卷中,要根據策略來進行後續處理。

回收策略: PV的回收策略向集羣闡述了在PVC釋放卷的時候應如何進行後續工作,目前可以採用三種策略:Retain、Recycle、Delete

  1. Retain:保留策略允許重新申請這一資源。
  2. Recycle:基礎擦除(rm -rf /thevolume/*)
  3. Delete:同時刪除持久卷以及卷中存儲的內容。如果插件支持。

創建PV

創建一個nfs-pv-logs.yml的配置文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-logs
spec:
  # 設置容量
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  # 訪問模式
  accessModes:
    # ReadWriteOnce:單節點加載讀寫
    # ReadWriteMany:多節點加載讀寫
    - ReadWriteMany
  # 回收策略,這裏是人工重新申請
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    # NFS服務端配置的路徑
    path: /kubernetes/volumes
    # NFS服務端ip
    server: 10.10.103.80
    readOnly: false

創建之前在所有的node節點上安裝nfs客戶端

創建PVC

創建文件nfs-pvc-logs-login.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc-log-all
spec:
  accessModes:
    # 要和PV一致的訪問模式,
    - ReadWriteMany
  # 按需分配資源
  resources:
    requests:
      storage: 1Gi

參考文檔
kubernetes 官網-volumes
kubernetes 官網-persistent-volumes
github中的示例
百度詞條

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章