Fábio Kaiser Rauber
3 years ago
12 changed files with 768 additions and 0 deletions
@ -0,0 +1,18 @@ |
|||
apiVersion: v1 |
|||
appVersion: 3.0.0 |
|||
description: nfs-server-provisioner is an out-of-tree dynamic provisioner for Kubernetes. You can use it to quickly & easily deploy shared storage that works almost anywhere. |
|||
name: nfs-server-provisioner |
|||
version: 1.4.0 |
|||
maintainers: |
|||
- name: kiall |
|||
email: kiall@macinnes.ie |
|||
- name: kvaps |
|||
email: kvapss@gmail.com |
|||
- name: joaocc |
|||
email: joaocc-dev@live.com |
|||
home: https://github.com/kubernetes-sigs/nfs-ganesha-server-and-external-provisioner |
|||
sources: |
|||
- https://github.com/kubernetes-sigs/nfs-ganesha-server-and-external-provisioner/tree/HEAD/charts/nfs-server-provisioner |
|||
keywords: |
|||
- nfs |
|||
- storage |
@ -0,0 +1,211 @@ |
|||
# 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. |
@ -0,0 +1,26 @@ |
|||
The NFS Provisioner service has now been installed. |
|||
|
|||
{{ if .Values.storageClass.create -}} |
|||
A storage class named '{{ .Values.storageClass.name }}' has now been created |
|||
and is available to provision dynamic volumes. |
|||
|
|||
You can use this storageclass by creating a `PersistentVolumeClaim` with the |
|||
correct storageClassName attribute. For example: |
|||
|
|||
--- |
|||
kind: PersistentVolumeClaim |
|||
apiVersion: v1 |
|||
metadata: |
|||
name: test-dynamic-volume-claim |
|||
spec: |
|||
storageClassName: "{{ .Values.storageClass.name }}" |
|||
accessModes: |
|||
- ReadWriteOnce |
|||
resources: |
|||
requests: |
|||
storage: 100Mi |
|||
|
|||
{{ else -}} |
|||
A storage class has NOT been created. You may create a custom `StorageClass` |
|||
resource with a `provisioner` attribute of `{{ include "nfs-provisioner.provisionerName" . }}`. |
|||
{{ end -}} |
@ -0,0 +1,43 @@ |
|||
{{/* vim: set filetype=mustache: */}} |
|||
{{/* |
|||
Expand the name of the chart. |
|||
*/}} |
|||
{{- define "nfs-provisioner.name" -}} |
|||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} |
|||
{{- end }} |
|||
|
|||
{{/* |
|||
Create a default fully qualified app name. |
|||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). |
|||
If release name contains chart name it will be used as a full name. |
|||
*/}} |
|||
{{- define "nfs-provisioner.fullname" -}} |
|||
{{- if .Values.fullnameOverride }} |
|||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} |
|||
{{- else }} |
|||
{{- $name := default .Chart.Name .Values.nameOverride }} |
|||
{{- if contains $name .Release.Name }} |
|||
{{- .Release.Name | trunc 63 | trimSuffix "-" }} |
|||
{{- else }} |
|||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} |
|||
{{- end }} |
|||
{{- end }} |
|||
{{- end }} |
|||
|
|||
{{/* |
|||
Create chart name and version as used by the chart label. |
|||
*/}} |
|||
{{- define "nfs-provisioner.chart" -}} |
|||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} |
|||
{{- end }} |
|||
|
|||
{{/* |
|||
Create chart name and version as used by the chart label. |
|||
*/}} |
|||
{{- define "nfs-provisioner.provisionerName" -}} |
|||
{{- if .Values.storageClass.provisionerName }} |
|||
{{- printf .Values.storageClass.provisionerName }} |
|||
{{- else -}} |
|||
cluster.local/{{ include "nfs-provisioner.fullname" . }} |
|||
{{- end }} |
|||
{{- end }} |
@ -0,0 +1,34 @@ |
|||
{{- if .Values.rbac.create -}} |
|||
apiVersion: rbac.authorization.k8s.io/v1 |
|||
kind: ClusterRole |
|||
metadata: |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
rules: |
|||
- apiGroups: [""] |
|||
resources: ["persistentvolumes"] |
|||
verbs: ["get", "list", "watch", "create", "delete"] |
|||
- apiGroups: [""] |
|||
resources: ["persistentvolumeclaims"] |
|||
verbs: ["get", "list", "watch", "update"] |
|||
- apiGroups: ["storage.k8s.io"] |
|||
resources: ["storageclasses"] |
|||
verbs: ["get", "list", "watch"] |
|||
- apiGroups: [""] |
|||
resources: ["events"] |
|||
verbs: ["list", "watch", "create", "update", "patch"] |
|||
- apiGroups: [""] |
|||
resources: ["services", "endpoints"] |
|||
verbs: ["get"] |
|||
- apiGroups: ["extensions"] |
|||
resources: ["podsecuritypolicies"] |
|||
resourceNames: ["nfs-provisioner"] |
|||
verbs: ["use"] |
|||
- apiGroups: [""] |
|||
resources: ["endpoints"] |
|||
verbs: ["get", "list", "watch", "create", "delete", "update", "patch"] |
|||
{{- end }} |
@ -0,0 +1,14 @@ |
|||
{{- if .Values.priorityClass.create -}} |
|||
kind: PriorityClass |
|||
apiVersion: scheduling.k8s.io/v1 |
|||
metadata: |
|||
name: {{ .Values.priorityClass.name | default (include "nfs-provisioner.fullname" .) }} |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
value: {{ .Values.priorityClass.value }} |
|||
globalDefault: false |
|||
description: "This priority class should be used for nfs-provisioner pods only." |
|||
{{- end }} |
@ -0,0 +1,19 @@ |
|||
{{- if .Values.rbac.create -}} |
|||
apiVersion: rbac.authorization.k8s.io/v1 |
|||
kind: ClusterRoleBinding |
|||
metadata: |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
roleRef: |
|||
apiGroup: rbac.authorization.k8s.io |
|||
kind: ClusterRole |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
subjects: |
|||
- kind: ServiceAccount |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
namespace: {{ .Release.Namespace }} |
|||
{{- end }} |
@ -0,0 +1,106 @@ |
|||
apiVersion: v1 |
|||
kind: Service |
|||
metadata: |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
spec: |
|||
type: {{ .Values.service.type }} |
|||
ports: |
|||
- port: {{ .Values.service.nfsPort }} |
|||
targetPort: nfs |
|||
protocol: TCP |
|||
name: nfs |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nfsNodePort))) }} |
|||
nodePort: {{ .Values.service.nfsNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.nfsPort }} |
|||
targetPort: nfs-udp |
|||
protocol: UDP |
|||
name: nfs-udp |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nfsNodePort))) }} |
|||
nodePort: {{ .Values.service.nfsNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.nlockmgrPort }} |
|||
targetPort: nlockmgr |
|||
protocol: TCP |
|||
name: nlockmgr |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nlockmgrNodePort))) }} |
|||
nodePort: {{ .Values.service.nlockmgrNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.nlockmgrPort }} |
|||
targetPort: nlockmgr-udp |
|||
protocol: UDP |
|||
name: nlockmgr-udp |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nlockmgrPort))) }} |
|||
nodePort: {{ .Values.service.nlockmgrNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.mountdPort }} |
|||
targetPort: mountd |
|||
protocol: TCP |
|||
name: mountd |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.mountdNodePort))) }} |
|||
nodePort: {{ .Values.service.mountdNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.mountdPort }} |
|||
targetPort: mountd-udp |
|||
protocol: UDP |
|||
name: mountd-udp |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.mountdNodePort))) }} |
|||
nodePort: {{ .Values.service.mountdNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.rquotadPort }} |
|||
targetPort: rquotad |
|||
protocol: TCP |
|||
name: rquotad |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.rquotadNodePort))) }} |
|||
nodePort: {{ .Values.service.rquotadNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.rquotadPort }} |
|||
targetPort: rquotad-udp |
|||
protocol: UDP |
|||
name: rquotad-udp |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.rquotadNodePort))) }} |
|||
nodePort: {{ .Values.service.rquotadNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.rpcbindPort }} |
|||
targetPort: rpcbind |
|||
protocol: TCP |
|||
name: rpcbind |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.rpcbindNodePort))) }} |
|||
nodePort: {{ .Values.service.rpcbindNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.rpcbindPort }} |
|||
targetPort: rpcbind-udp |
|||
protocol: UDP |
|||
name: rpcbind-udp |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.rpcbindNodePort))) }} |
|||
nodePort: {{ .Values.service.rpcbindNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.statdPort }} |
|||
targetPort: statd |
|||
protocol: TCP |
|||
name: statd |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.statdPort))) }} |
|||
nodePort: {{ .Values.service.statdNodePort }} |
|||
{{- end }} |
|||
- port: {{ .Values.service.statdPort }} |
|||
targetPort: statd-udp |
|||
protocol: UDP |
|||
name: statd-udp |
|||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.statdPort))) }} |
|||
nodePort: {{ .Values.service.statdNodePort }} |
|||
{{- end }} |
|||
{{- with .Values.service.clusterIP }} |
|||
clusterIP: {{ . }} |
|||
{{- end }} |
|||
{{- with .Values.service.externalIPs }} |
|||
externalIPs: |
|||
{{- toYaml . | nindent 4 }} |
|||
{{- end }} |
|||
selector: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
release: {{ .Release.Name }} |
@ -0,0 +1,11 @@ |
|||
{{- if .Values.rbac.create -}} |
|||
apiVersion: v1 |
|||
kind: ServiceAccount |
|||
metadata: |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
{{- end }} |
@ -0,0 +1,146 @@ |
|||
apiVersion: apps/v1 |
|||
kind: StatefulSet |
|||
metadata: |
|||
name: {{ include "nfs-provisioner.fullname" . }} |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
spec: |
|||
# TODO: Investigate how/if nfs-provisioner can be scaled out beyond 1 replica |
|||
replicas: {{ .Values.replicaCount }} |
|||
selector: |
|||
matchLabels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
release: {{ .Release.Name }} |
|||
serviceName: {{ include "nfs-provisioner.fullname" . }} |
|||
template: |
|||
metadata: |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
spec: |
|||
# NOTE: This is 10 seconds longer than the default nfs-provisioner --grace-period value of 90sec |
|||
terminationGracePeriodSeconds: 100 |
|||
serviceAccountName: {{ if .Values.rbac.create }}{{ include "nfs-provisioner.fullname" . }}{{ else }}{{ .Values.rbac.serviceAccountName | quote }}{{ end }} |
|||
{{- with .Values.imagePullSecrets }} |
|||
imagePullSecrets: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
containers: |
|||
- name: {{ .Chart.Name }} |
|||
{{- with .Values.image }} |
|||
image: "{{ .repository }}{{ if .digest }}@{{ .digest }}{{ else }}:{{ .tag }}{{ end }}" |
|||
imagePullPolicy: {{ .pullPolicy }} |
|||
{{- end }} |
|||
ports: |
|||
- name: nfs |
|||
containerPort: 2049 |
|||
protocol: TCP |
|||
- name: nfs-udp |
|||
containerPort: 2049 |
|||
protocol: UDP |
|||
- name: nlockmgr |
|||
containerPort: 32803 |
|||
protocol: TCP |
|||
- name: nlockmgr-udp |
|||
containerPort: 32803 |
|||
protocol: UDP |
|||
- name: mountd |
|||
containerPort: 20048 |
|||
protocol: TCP |
|||
- name: mountd-udp |
|||
containerPort: 20048 |
|||
protocol: UDP |
|||
- name: rquotad |
|||
containerPort: 875 |
|||
protocol: TCP |
|||
- name: rquotad-udp |
|||
containerPort: 875 |
|||
protocol: UDP |
|||
- name: rpcbind |
|||
containerPort: 111 |
|||
protocol: TCP |
|||
- name: rpcbind-udp |
|||
containerPort: 111 |
|||
protocol: UDP |
|||
- name: statd |
|||
containerPort: 662 |
|||
protocol: TCP |
|||
- name: statd-udp |
|||
containerPort: 662 |
|||
protocol: UDP |
|||
securityContext: |
|||
capabilities: |
|||
add: |
|||
- DAC_READ_SEARCH |
|||
- SYS_RESOURCE |
|||
args: |
|||
- "-provisioner={{ include "nfs-provisioner.provisionerName" . }}" |
|||
{{- range $key, $value := .Values.extraArgs }} |
|||
- "-{{ $key }}={{ $value }}" |
|||
{{- end }} |
|||
env: |
|||
- name: POD_IP |
|||
valueFrom: |
|||
fieldRef: |
|||
fieldPath: status.podIP |
|||
- name: SERVICE_NAME |
|||
value: {{ include "nfs-provisioner.fullname" . }} |
|||
- name: POD_NAMESPACE |
|||
valueFrom: |
|||
fieldRef: |
|||
fieldPath: metadata.namespace |
|||
volumeMounts: |
|||
- name: data |
|||
mountPath: /export |
|||
{{- with .Values.resources }} |
|||
resources: |
|||
{{- toYaml . | nindent 12 }} |
|||
{{- end }} |
|||
{{- with .Values.podSecurityContext }} |
|||
securityContext: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
{{- with .Values.nodeSelector }} |
|||
nodeSelector: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
{{- with .Values.affinity }} |
|||
affinity: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
{{- with .Values.tolerations }} |
|||
tolerations: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
{{- if (or .Values.priorityClass.name .Values.priorityClass.create) }} |
|||
priorityClassName: {{ .Values.priorityClass.name | default (include "nfs-provisioner.fullname" .) | quote }} |
|||
{{- end }} |
|||
|
|||
{{- if not .Values.persistence.enabled }} |
|||
volumes: |
|||
- name: data |
|||
emptyDir: {} |
|||
{{- end }} |
|||
|
|||
{{- if .Values.persistence.enabled }} |
|||
volumeClaimTemplates: |
|||
- metadata: |
|||
name: data |
|||
spec: |
|||
accessModes: [ {{ .Values.persistence.accessMode | quote }} ] |
|||
{{- if .Values.persistence.storageClass }} |
|||
{{- if (eq "-" .Values.persistence.storageClass) }} |
|||
storageClassName: "" |
|||
{{- else }} |
|||
storageClassName: {{ .Values.persistence.storageClass | quote }} |
|||
{{- end }} |
|||
{{- end }} |
|||
resources: |
|||
requests: |
|||
storage: {{ .Values.persistence.size | quote }} |
|||
{{- end }} |
@ -0,0 +1,28 @@ |
|||
{{- if .Values.storageClass.create -}} |
|||
kind: StorageClass |
|||
apiVersion: storage.k8s.io/v1 |
|||
metadata: |
|||
name: {{ .Values.storageClass.name }} |
|||
labels: |
|||
app: {{ include "nfs-provisioner.name" . }} |
|||
chart: {{ include "nfs-provisioner.chart" . }} |
|||
heritage: {{ .Release.Service }} |
|||
release: {{ .Release.Name }} |
|||
{{- if .Values.storageClass.defaultClass }} |
|||
annotations: |
|||
storageclass.kubernetes.io/is-default-class: "true" |
|||
{{- end }} |
|||
provisioner: {{ include "nfs-provisioner.provisionerName" . }} |
|||
reclaimPolicy: {{ .Values.storageClass.reclaimPolicy }} |
|||
{{- if .Values.storageClass.allowVolumeExpansion }} |
|||
allowVolumeExpansion: {{ .Values.storageClass.allowVolumeExpansion }} |
|||
{{- end }} |
|||
{{- with .Values.storageClass.parameters }} |
|||
parameters: |
|||
{{- toYaml . | nindent 2 }} |
|||
{{- end }} |
|||
{{- with .Values.storageClass.mountOptions }} |
|||
mountOptions: |
|||
{{- toYaml . | nindent 2 }} |
|||
{{- end }} |
|||
{{- end }} |
@ -0,0 +1,112 @@ |
|||
# Default values for nfs-provisioner. |
|||
# This is a YAML-formatted file. |
|||
# Declare variables to be passed into your templates. |
|||
|
|||
replicaCount: 1 |
|||
|
|||
# imagePullSecrets: |
|||
|
|||
image: |
|||
repository: k8s.gcr.io/sig-storage/nfs-provisioner |
|||
tag: v3.0.0 |
|||
# digest: |
|||
pullPolicy: IfNotPresent |
|||
|
|||
# For a list of available arguments |
|||
# Please see https://github.com/kubernetes-incubator/external-storage/blob/HEAD/nfs/docs/deployment.md#arguments |
|||
extraArgs: {} |
|||
# device-based-fsids: false |
|||
# grace-period: 0 |
|||
|
|||
service: |
|||
type: ClusterIP |
|||
|
|||
nfsPort: 2049 |
|||
nlockmgrPort: 32803 |
|||
mountdPort: 20048 |
|||
rquotadPort: 875 |
|||
rpcbindPort: 111 |
|||
statdPort: 662 |
|||
# nfsNodePort: |
|||
# nlockmgrNodePort: |
|||
# mountdNodePort: |
|||
# rquotadNodePort: |
|||
# rpcbindNodePort: |
|||
# statdNodePort: |
|||
# clusterIP: |
|||
|
|||
externalIPs: [] |
|||
|
|||
persistence: |
|||
enabled: false |
|||
|
|||
## Persistent Volume Storage Class |
|||
## If defined, storageClassName: <storageClass> |
|||
## If set to "-", storageClassName: "", which disables dynamic provisioning |
|||
## If undefined (the default) or set to null, no storageClassName spec is |
|||
## set, choosing the default provisioner. (gp2 on AWS, standard on |
|||
## GKE, AWS & OpenStack) |
|||
## |
|||
# storageClass: "-" |
|||
|
|||
accessMode: ReadWriteOnce |
|||
size: 1Gi |
|||
|
|||
## For creating the StorageClass automatically: |
|||
storageClass: |
|||
create: true |
|||
|
|||
## Set a provisioner name. If unset, a name will be generated. |
|||
# provisionerName: |
|||
|
|||
## Set StorageClass as the default StorageClass |
|||
## Ignored if storageClass.create is false |
|||
defaultClass: false |
|||
|
|||
## Set a StorageClass name |
|||
## Ignored if storageClass.create is false |
|||
name: nfs |
|||
|
|||
# set to null to prevent expansion |
|||
allowVolumeExpansion: true |
|||
## StorageClass parameters |
|||
parameters: {} |
|||
|
|||
mountOptions: |
|||
- vers=3 |
|||
|
|||
## ReclaimPolicy field of the class, which can be either Delete or Retain |
|||
reclaimPolicy: Delete |
|||
|
|||
## For RBAC support: |
|||
rbac: |
|||
create: true |
|||
|
|||
## Ignored if rbac.create is true |
|||
## |
|||
serviceAccountName: default |
|||
|
|||
## For creating the PriorityClass automatically: |
|||
priorityClass: |
|||
## Enable creation of a PriorityClass resource for this nfs-server-provisioner instance |
|||
create: false |
|||
|
|||
## Set a PriorityClass name to override the default name |
|||
name: "" |
|||
|
|||
## PriorityClass value. The higher the value, the higher the scheduling priority |
|||
value: 5 |
|||
|
|||
resources: {} |
|||
# limits: |
|||
# cpu: 100m |
|||
# memory: 128Mi |
|||
# requests: |
|||
# cpu: 100m |
|||
# memory: 128Mi |
|||
|
|||
nodeSelector: {} |
|||
|
|||
tolerations: [] |
|||
|
|||
affinity: {} |
Loading…
Reference in new issue