Local Path Provisioner provides a way for the Kubernetes users to utilize the local storage in each node. Based on the user configuration, the Local Path Provisioner will create hostPath based persistent volume on the node automatically. It utilizes the features introduced by Kubernetes Local Persistent Volume feature, but make it a simpler solution than the built-in local volume feature in Kubernetes.
Compare to built-in Local Persistent Volume feature in Kubernetes
Pros
Dynamic provisioning the volume using hostPath.
Currently the Kubernetes Local Volume provisioner cannot do dynamic provisioning for the local volumes.
Cons
No support for the volume capacity limit currently.
The capacity limit will be ignored for now.
Requirement
Kubernetes v1.12+.
Deployment
Installation
In this setup, the directory /opt/local-path-provisioner will be used across all the nodes as the path for provisioning (a.k.a, store the persistent volume data). The provisioner will be installed in local-path-storage namespace by default.
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-bc3117d9-c6d3-11e8-b36d-7a42907dda78 2Gi RWO Delete Bound default/local-path-pvc local-path 4s
The PVC has been bound:
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
local-path-pvc Bound pvc-bc3117d9-c6d3-11e8-b36d-7a42907dda78 2Gi RWO local-path 16s
And the Pod started running:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
volume-test 1/1 Running 0 3s
Write something into the pod
kubectl exec volume-test -- sh -c "echo local-path-test > /data/test"
The volume content stored on the node will be automatically cleaned up. You can check the log of local-path-provisioner-xxx for details.
Now you've verified that the provisioner works as expected.
Configuration
Customize the ConfigMap
The configuration of the provisioner is a json file config.json, a Pod template helperPod.yaml and two bash scripts setup and teardown, stored in a config map, e.g.:
nodePathMap is the place user can customize where to store the data on each node.
If one node is not listed on the nodePathMap, and Kubernetes wants to create volume on it, the paths specified in DEFAULT_PATH_FOR_NON_LISTED_NODES will be used for provisioning.
If one node is listed on the nodePathMap, the specified paths in paths will be used for provisioning.
If one node is listed but with paths set to [], the provisioner will refuse to provision on this node.
If more than one path was specified, the path would be chosen randomly when provisioning.
Rules
The configuration must obey following rules:
config.json must be a valid json file.
A path must start with /, a.k.a an absolute path.
Root directory(/) is prohibited.
No duplicate paths allowed for one node.
No duplicate node allowed.
Scripts setup and teardown and the helperPod.yaml template
The setup script is run before the volume is created, to prepare the volume directory on the node.
The teardown script is run after the volume is deleted, to cleanup the volume directory on the node.
The helperPod.yaml template is used to create a helper Pod that runs the setup or teardown script.
The scripts receive their input as environment variables:
Environment variable
Description
VOL_DIR
Volume directory that should be created or removed.
VOL_MODE
The PersistentVolume mode (Block or Filesystem).
VOL_SIZE_BYTES
Requested volume size in bytes.
Reloading
The provisioner supports automatic configuration reloading. Users can change the configuration using kubectl apply or kubectl edit with config map local-path-config. There is a delay between when the user updates the config map and the provisioner picking it up.
When the provisioner detects the configuration changes, it will try to load the new configuration. Users can observe it in the log
If the reload fails, the provisioner will log the error and continue using the last valid configuration for provisioning in the meantime.
time="2018-10-03T05:19:25Z" level=error msg="failed to load the new config file: fail to load config file /etc/config/config.json: invalid character '#' looking for beginning of object key string"
time="2018-10-03T05:20:10Z" level=error msg="failed to load the new config file: config canonicalization failed: path must start with / for path opt on node yasker-lp-dev1"
time="2018-10-03T05:23:35Z" level=error msg="failed to load the new config file: config canonicalization failed: duplicate path /data1 on node yasker-lp-dev1
time="2018-10-03T06:39:28Z" level=error msg="failed to load the new config file: config canonicalization failed: duplicate node yasker-lp-dev3"
Uninstall
Before uninstallation, make sure the PVs created by the provisioner have already been deleted. Use kubectl get pv and make sure no PV with StorageClass local-path.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
请发表评论