使用Pocal-Path-Provisioner动态创建本地磁盘pv


安装

使用k8s最麻烦的就是提供pv存储,很多情况下我们需要使用本地磁盘作为存储。

但是k8s默认不支持通过storageClass的方式自动创建以本地磁盘为存储的pv。

好在有开源的rancher/local-path-provisioner

使用方法很简单,下载yaml文件 https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.22/deploy/local-path-storage.yaml

有3处地方一般情况下需要修改:

第一,删除–debug

第二,搜索reclaimPolicy,默认值是Delete,可以改成Retain,避免误删pv造成数据丢失

第三,搜索StorageClass,增加annotations,使local-path storageclass成为默认storageclass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-path
  annotations:
    storageclass.kubernetes.io/is-default-class: "true" # 默认storageclass
provisioner: rancher.io/local-path
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain

第四,修改最后面的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"]
            }
            ]
    }
  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
        imagePullPolicy: IfNotPresent

其中/opt/local-path-provisioner就是你本地数据存储目录,根据情况自由修改。

执行kubectl apply -f local-path-storage.yaml 即可。

要使用这个动态pv时,storageClass设置为local-path就OK了

个性化配置

我们也可以个性化配置上面的配置文件

nodePathMap

我们也可以个性化定制每个节点的存储路径,示例如下:

"nodePathMap":[
    {
        "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
        "paths":["/opt/local-path-provisioner"]
    },
    {
        "node":"node-1",
        "paths":["/opt/local-path-provisioner", "/data1"]
    },
    {
        "node":"node-2",
        "paths":[]
    }
]
  • DEFAULT_PATH_FOR_NON_LISTED_NODES表示默认存储位置,所有节点如果没有特别指定,都将使用这个路径。

  • node-1节点指定了两个目录,在分配pv时将随机指定一个目录创建pv。

  • node-2没有指定任何路径,那么该节点不会被分配pv

setup

setup脚本在volume创建前调用,用于创建存储目录

teardown

teardown脚本在volume被删除时调用,用于清除数据

helperPod.yaml

helperPod.yaml是pod模板,运行一个busybox的pod,setup和teardown脚本都是在这个pod中执行

自动刷新配置

我们可以直接使用kubectl edit去修改上面的configmap,或者修改local-path-provisioner.yaml文件然后执行kubectl apply,local-path-provisioner会自动刷新配置

文章作者: 周君
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 周君 !
评论