You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
13 KiB
212 lines
13 KiB
3 years ago
|
# NFS Server Provisioner
|
||
|
|
||
|
[NFS Server Provisioner](https://github.com/kubernetes-sigs/nfs-ganesha-server-and-external-provisioner)
|
||
|
is an out-of-tree dynamic provisioner for Kubernetes. You can use it to quickly
|
||
|
& easily deploy shared storage that works almost anywhere.
|
||
|
|
||
|
This chart will deploy the Kubernetes [external-storage projects](https://github.com/kubernetes-incubator/external-storage)
|
||
|
`nfs` provisioner. This provisioner includes a built in NFS server, and is not intended for connecting to a pre-existing
|
||
|
NFS server. If you have a pre-existing NFS Server, please consider using the [NFS Client Provisioner](https://github.com/kubernetes-incubator/external-storage/tree/HEAD/nfs-client)
|
||
|
instead.
|
||
|
|
||
|
## TL;DR;
|
||
|
|
||
|
```console
|
||
|
$ helm install stable/nfs-server-provisioner
|
||
|
```
|
||
|
|
||
|
> **Warning**: While installing in the default configuration will work, any data stored on
|
||
|
the dynamic volumes provisioned by this chart will not be persistent!
|
||
|
|
||
|
## Introduction
|
||
|
|
||
|
This chart bootstraps a [nfs-server-provisioner](https://github.com/kubernetes-incubator/external-storage/tree/HEAD/nfs)
|
||
|
deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh)
|
||
|
package manager.
|
||
|
|
||
|
## Installing the Chart
|
||
|
|
||
|
To install the chart with the release name `my-release`:
|
||
|
|
||
|
```console
|
||
|
$ helm repo add nfs-ganesha-server-and-external-provisioner https://kubernetes-sigs.github.io/nfs-ganesha-server-and-external-provisioner/
|
||
|
$ helm install my-release nfs-ganesha-server-and-external-provisioner/nfs-server-provisioner
|
||
|
```
|
||
|
|
||
|
The command deploys nfs-server-provisioner on the Kubernetes cluster in the default
|
||
|
configuration. The [configuration](#configuration) section lists the parameters
|
||
|
that can be configured during installation.
|
||
|
|
||
|
## Uninstalling the Chart
|
||
|
|
||
|
To uninstall/delete the `my-release` deployment:
|
||
|
|
||
|
```console
|
||
|
$ helm delete my-release
|
||
|
```
|
||
|
|
||
|
The command removes all the Kubernetes components associated with the chart and
|
||
|
deletes the release.
|
||
|
|
||
|
## Configuration
|
||
|
|
||
|
The following table lists the configurable parameters of the kibana chart and
|
||
|
their default values.
|
||
|
|
||
|
| Parameter | Description | Default |
|
||
|
|:-------------------------------|:----------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------|
|
||
|
| `extraArgs` | [Additional command line arguments](https://github.com/kubernetes-incubator/external-storage/blob/HEAD/nfs/docs/deployment.md#arguments) | `{}`
|
||
|
| `imagePullSecrets` | Specify image pull secrets | `nil` (does not add image pull secrets to deployed pods) |
|
||
|
| `image.repository` | The image repository to pull from | `k8s.gcr.io/sig-storage/nfs-provisioner:v3.0.0` |
|
||
|
| `image.tag` | The image tag to pull | `v3.0.0` |
|
||
|
| `image.digest` | The image digest to pull, this option has precedence over `image.tag` | `nil` |
|
||
|
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
|
||
|
| `service.type` | service type | `ClusterIP` |
|
||
|
| `service.nfsPort` | TCP port on which the nfs-server-provisioner NFS service is exposed | `2049` |
|
||
|
| `service.mountdPort` | TCP port on which the nfs-server-provisioner mountd service is exposed | `20048` |
|
||
|
| `service.rpcbindPort` | TCP port on which the nfs-server-provisioner RPC service is exposed | `111` |
|
||
|
| `service.nfsNodePort` | if `service.type` is `NodePort` and this is non-empty, sets the nfs-server-provisioner node port of the NFS service | `nil` |
|
||
|
| `service.mountdNodePort` | if `service.type` is `NodePort` and this is non-empty, sets the nfs-server-provisioner node port of the mountd service | `nil` |
|
||
|
| `service.rpcbindNodePort` | if `service.type` is `NodePort` and this is non-empty, sets the nfs-server-provisioner node port of the RPC service | `nil` |
|
||
|
| `persistence.enabled` | Enable config persistence using PVC | `false` |
|
||
|
| `persistence.storageClass` | PVC Storage Class for config volume | `nil` |
|
||
|
| `persistence.accessMode` | PVC Access Mode for config volume | `ReadWriteOnce` |
|
||
|
| `persistence.size` | PVC Storage Request for config volume | `1Gi` |
|
||
|
| `storageClass.create` | Enable creation of a StorageClass to consume this nfs-server-provisioner instance | `true` |
|
||
|
| `storageClass.provisionerName` | The provisioner name for the storageclass | `cluster.local/{release-name}-{chart-name}` |
|
||
|
| `storageClass.defaultClass` | Whether to set the created StorageClass as the clusters default StorageClass | `false` |
|
||
|
| `storageClass.name` | The name to assign the created StorageClass | `nfs` |
|
||
|
| `storageClass.allowVolumeExpansion` | Allow base storage PCV to be dynamically resizeable (set to null to disable ) | `true |
|
||
|
| `storageClass.parameters` | Parameters for StorageClass | `{}` |
|
||
|
| `storageClass.mountOptions` | Mount options for StorageClass | `[ "vers=3" ]` |
|
||
|
| `storageClass.reclaimPolicy` | ReclaimPolicy field of the class, which can be either Delete or Retain | `Delete` |
|
||
|
| `resources` | Resource limits for nfs-server-provisioner pod | `{}` |
|
||
|
| `nodeSelector` | Map of node labels for pod assignment | `{}` |
|
||
|
| `tolerations` | List of node taints to tolerate | `[]` |
|
||
|
| `affinity` | Map of node/pod affinities | `{}` |
|
||
|
| `podSecurityContext` | Security context settings for nfs-server-provisioner pod (see https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod) | `{}` |
|
||
|
| `priorityClass.create` | Enable creation of a PriorityClass resource for this nfs-server-provisioner instance | `false` |
|
||
|
| `priorityClass.name` | Set a PriorityClass name to override the default name | `""` |
|
||
|
| `priorityClass.value` | PriorityClass value. The higher the value, the higher the scheduling priority | `5` |
|
||
|
|
||
|
```console
|
||
|
$ helm install nfs-server-provisioner nfs-ganesha-server-and-external-provisioner/nfs-server-provisioner \
|
||
|
--set=image.tag=v1.0.8,resources.limits.cpu=200m
|
||
|
```
|
||
|
|
||
|
Alternatively, a YAML file that specifies the values for the above parameters
|
||
|
can be provided while installing the chart. For example,
|
||
|
|
||
|
```console
|
||
|
$ helm install nfs-server-provisioner nfs-ganesha-server-and-external-provisioner/nfs-server-provisioner -f values.yaml
|
||
|
```
|
||
|
|
||
|
> **Tip**: You can use the default [values.yaml](values.yaml) as an example
|
||
|
|
||
|
## Persistence
|
||
|
|
||
|
The nfs-server-provisioner image stores it's configuration data, and importantly, **the dynamic volumes it
|
||
|
manages** `/export` path of the container.
|
||
|
|
||
|
The chart mounts a [Persistent Volume](http://kubernetes.io/docs/user-guide/persistent-volumes/)
|
||
|
volume at this location. The volume can be created using dynamic volume
|
||
|
provisioning. However, **it is highly recommended** to explicitly specify
|
||
|
a storageclass to use rather than accept the clusters default, or pre-create
|
||
|
a volume for each replica.
|
||
|
|
||
|
If this chart is deployed with more than 1 replica, `storageClass.defaultClass=true`
|
||
|
and `persistence.storageClass`, then the 2nd+ replica will end up using the 1st
|
||
|
replica to provision storage - which is likely never a desired outcome.
|
||
|
|
||
|
## Recommended Persistence Configuration Examples
|
||
|
|
||
|
The following is a recommended configuration example when another storage class
|
||
|
exists to provide persistence:
|
||
|
|
||
|
persistence:
|
||
|
enabled: true
|
||
|
storageClass: "standard"
|
||
|
size: 200Gi
|
||
|
|
||
|
storageClass:
|
||
|
defaultClass: true
|
||
|
|
||
|
On many clusters, the cloud provider integration will create a "standard" storage
|
||
|
class which will create a volume (e.g. a Google Compute Engine Persistent Disk or
|
||
|
Amazon EBS volume) to provide persistence.
|
||
|
|
||
|
---
|
||
|
|
||
|
The following is a recommended configuration example when another storage class
|
||
|
does not exist to provide persistence:
|
||
|
|
||
|
persistence:
|
||
|
enabled: true
|
||
|
storageClass: "-"
|
||
|
size: 200Gi
|
||
|
|
||
|
storageClass:
|
||
|
defaultClass: true
|
||
|
|
||
|
In this configuration, a `PersistentVolume` must be created for each replica
|
||
|
to use. Installing the Helm chart, and then inspecting the `PersistentVolumeClaim`'s
|
||
|
created will provide the necessary names for your `PersistentVolume`'s to bind to.
|
||
|
|
||
|
An example of the necessary `PersistentVolume`:
|
||
|
|
||
|
apiVersion: v1
|
||
|
kind: PersistentVolume
|
||
|
metadata:
|
||
|
name: data-nfs-server-provisioner-0
|
||
|
spec:
|
||
|
capacity:
|
||
|
storage: 200Gi
|
||
|
accessModes:
|
||
|
- ReadWriteOnce
|
||
|
gcePersistentDisk:
|
||
|
fsType: "ext4"
|
||
|
pdName: "data-nfs-server-provisioner-0"
|
||
|
claimRef:
|
||
|
namespace: kube-system
|
||
|
name: data-nfs-server-provisioner-0
|
||
|
|
||
|
---
|
||
|
|
||
|
The following is a recommended configration example for running on bare metal with a hostPath volume:
|
||
|
|
||
|
persistence:
|
||
|
enabled: true
|
||
|
storageClass: "-"
|
||
|
size: 200Gi
|
||
|
|
||
|
storageClass:
|
||
|
defaultClass: true
|
||
|
|
||
|
nodeSelector:
|
||
|
kubernetes.io/hostname: {node-name}
|
||
|
|
||
|
In this configuration, a `PersistentVolume` must be created for each replica
|
||
|
to use. Installing the Helm chart, and then inspecting the `PersistentVolumeClaim`'s
|
||
|
created will provide the necessary names for your `PersistentVolume`'s to bind to.
|
||
|
|
||
|
An example of the necessary `PersistentVolume`:
|
||
|
|
||
|
apiVersion: v1
|
||
|
kind: PersistentVolume
|
||
|
metadata:
|
||
|
name: data-nfs-server-provisioner-0
|
||
|
spec:
|
||
|
capacity:
|
||
|
storage: 200Gi
|
||
|
accessModes:
|
||
|
- ReadWriteOnce
|
||
|
hostPath:
|
||
|
path: /srv/volumes/data-nfs-server-provisioner-0
|
||
|
claimRef:
|
||
|
namespace: kube-system
|
||
|
name: data-nfs-server-provisioner-0
|
||
|
|
||
|
> **Warning**: `hostPath` volumes cannot be migrated between machines by Kubernetes, as such,
|
||
|
in this example, we have restricted the `nfs-server-provisioner` pod to run on a single node. This
|
||
|
is unsuitable for production deployments.
|