前言

在Kubernetes上用於測試環境或者小規模佈署時,可能會選擇Local Path Provisioner作為預設的StorageClass,雖說無法限制容量使用,也是簡單可用了,但如果想在同個叢集中指定不同的儲存位置怎麼辦呢?原本說明範例只有可以根據不同節點的實體路徑做設定,後來在Issue裡面找到可以設定的方法。

可以透過佈署不同Provisioner跟StorageClass在同個叢集上指定不同的儲存位置。

主要要修改以下項目:

  1. ConfigMap要分開多組,用於設定不同路徑
  2. Deployment中的程式啟動參數要加--provisioner-name來指定不同的provisioner名稱(需是完整的,包含前面的rancher.io/)
  3. StorageClass也要多個,相對provisioner改成跟前步驟設定一樣的

其餘Namespace、ServiceAccount、RoleBinding都可以沿用原本佈署的。

實際佈署範例

以下範例為將原本的local-path-provisioner改為local-path-provisioner-test,來新增一組不同的StorageClass。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: local-path-provisioner-test
  namespace: local-path-storage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: local-path-provisioner
  template:
    metadata:
      labels:
        app: local-path-provisioner
    spec:
      serviceAccountName: local-path-provisioner-service-account
      containers:
        - name: local-path-provisioner
          image: rancher/local-path-provisioner:master-head
          imagePullPolicy: IfNotPresent
          command:
            - local-path-provisioner
            - --debug
            - start
            - --config
            - /etc/config/config.json
            - --provisioner-name
            - local-path-test
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config/
          env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
      volumes:
        - name: config-volume
          configMap:
            name: local-path-config-test

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-path-test
provisioner: rancher.io/local-path-test
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: local-path-config-test
  namespace: local-path-storage
data:
  config.json: |-
    {
            "nodePathMap":[
            {
                    "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
                    "paths":["/opt/local-path-provisioner-test"]
            }
            ]
    }    
  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    

測試用的PV&Pod (摘自Repository中example)

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-path-pvc-test
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path-test
  resources:
    requests:
      storage: 128Mi

---
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: local-path-pvc-test