Local Path Provisioner

有時候在k8s環境,並不想要直接使用常見的PV工具,只是單純想要像docker volume一樣,mount資料夾來作為儲存空間,此時可以使用Local Path Provisioner

Local Path Provisioner

是一個 Container Storage Interface (CSI),也就是用來提供k8s環境下建立Persistent Volume (PV)的插件

安裝

command

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml

會建立local-path-storage這個namespace,要查看運行狀態,可以到裡面看log

  kubectl -n local-path-storage logs pods/local-path-provisioner-7f8667b75c-hjrrb

使用configmap來給予設定

kind: ConfigMap
apiVersion: v1
metadata:
  name: local-path-config
  namespace: local-path-storage
data:
  config.json: |-
        {
                "nodePathMap":[
                {
                        "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
                        "paths":["/opt/local-path-provisioner"]
                },
                {
                        "node":"yasker-lp-dev1",
                        "paths":["/opt/local-path-provisioner", "/data1"]
                },
                {
                        "node":"yasker-lp-dev3",
                        "paths":[]
                }
                ]
        }        
  setup: |-
        #!/bin/sh
        set -eu
        mkdir -m 0777 -p "$VOL_DIR"        
  teardown: |-
        #!/bin/sh
        set -eu
        rm -rf "$VOL_DIR"        
  helperPod.yaml: |-
        apiVersion: v1
        kind: Pod
        metadata:
          name: helper-pod
        spec:
          containers:
          - name: helper-pod
            image: busybox        

config.json說明

nodePathMap

用來表示在各自的Node上,存資料的位置,規則如下

  • 沒有設定path的node會套用DEFAULT_PATH_FOR_NON_LISTED_NODES的設定
  • 如果有列出來,但path是空的,代表這個Node不會允許用local-path-provisioner來建pv
  • 每個node的path可以給好幾個位置,當裡面超過一個位置,每次建的時候會隨機選一個來用。
  • path一定要是絕對路徑
  • 在同個node裡面,同一個path不能重複列。
  • 同一個node不能重複列出來。
  • 不允許使用/ 根目錄

sharedFileSystemPath

  • 假如有一個file system有被mount在所有的Node上時,可以使用這個設定來指定,指定都用同一個位置。
  • 和nodePathMap互斥,所以當有使用sharedFileSystemPath時,nodePathMap一定要是[]
  • 只有使用了sharedFileSystemPath時,才會支援ReadOnlyManyReadWriteMany

setup

每個volume在建立之前會先做的script,用來準備node上volume資料夾用。

teardown

每個volume在被刪掉後會做的script,用來清掉node上volume資料夾用。

helperPod.yaml

用來執行setup和teardown的pod template

setup和teardown上面可以使用的環境變數

環境變數 說明
VOL_DIR 放置volume的路徑(nodePath寫的)
VOL_MODE The PersistentVolume mode (Block or Filesystem).
VOL_SIZE_BYTES Requested volume size in bytes.

設定storageClass來驅動local-path-provisioner

provisioner欄位,官方Github寫的cluster.local/local-path-provisioner沒有用,反而要用rancher.io/local-path才有用。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: incloud-lvm
provisioner: rancher.io/local-path 
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain
comments powered by Disqus