diff --git a/k8s/README.md b/k8s/README.md
new file mode 100644
index 000000000..5ec3ab407
--- /dev/null
+++ b/k8s/README.md
@@ -0,0 +1,23 @@
+## SEAWEEDFS - helm chart (2.x)
+
+### info:
+* master/filer/volume are stateful sets with anti-affinity on the hostname,
+so your deployment will be spread/HA.
+* chart is using memsql(mysql) as the filer backend to enable HA (multiple filer instances)
+and backup/HA memsql can provide.
+* mysql user/password are created in a k8s secret (secret-seaweedfs-db.yaml) and injected to the filer
+with ENV.
+* cert config exists and can be enabled, but not been tested.
+
+### current instances config (AIO):
+1 instance for each type (master/filer/volume/s3)
+
+instances need node labels:
+* sw-volume: true (for volume instance, specific tag)
+* sw-backend: true (for all others, as they less resource demanding)
+
+you can update the replicas count for each node type in values.yaml,
+need to add more nodes with the corresponding label.
+
+most of the configuration are available through values.yaml
+
diff --git a/k8s/seaweedfs/.helmignore b/k8s/seaweedfs/.helmignore
new file mode 100644
index 000000000..50af03172
--- /dev/null
+++ b/k8s/seaweedfs/.helmignore
@@ -0,0 +1,22 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml
new file mode 100644
index 000000000..00033e4c6
--- /dev/null
+++ b/k8s/seaweedfs/Chart.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+description: SeaweedFS
+name: seaweedfs
+version: 1.57
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/_helpers.tpl b/k8s/seaweedfs/templates/_helpers.tpl
new file mode 100644
index 000000000..04a782f8b
--- /dev/null
+++ b/k8s/seaweedfs/templates/_helpers.tpl
@@ -0,0 +1,114 @@
+{{/*
+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 "seaweedfs.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 "seaweedfs.chart" -}}
+{{- printf "%s-helm" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "seaweedfs.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Inject extra environment vars in the format key:value, if populated
+*/}}
+{{- define "seaweedfs.extraEnvironmentVars" -}}
+{{- if .extraEnvironmentVars -}}
+{{- range $key, $value := .extraEnvironmentVars }}
+- name: {{ $key }}
+ value: {{ $value | quote }}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Return the proper filer image */}}
+{{- define "filer.image" -}}
+{{- if .Values.filer.imageOverride -}}
+{{- $imageOverride := .Values.filer.imageOverride -}}
+{{- printf "%s" $imageOverride -}}
+{{- else -}}
+{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}}
+{{- $repositoryName := .Values.image.repository | toString -}}
+{{- $name := .Values.global.imageName | toString -}}
+{{- $tag := .Values.global.imageTag | toString -}}
+{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Return the proper postgresqlSchema image */}}
+{{- define "filer.dbSchema.image" -}}
+{{- if .Values.filer.dbSchema.imageOverride -}}
+{{- $imageOverride := .Values.filer.dbSchema.imageOverride -}}
+{{- printf "%s" $imageOverride -}}
+{{- else -}}
+{{- $registryName := default .Values.global.registry .Values.global.localRegistry | toString -}}
+{{- $repositoryName := .Values.global.repository | toString -}}
+{{- $name := .Values.filer.dbSchema.imageName | toString -}}
+{{- $tag := .Values.filer.dbSchema.imageTag | toString -}}
+{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Return the proper master image */}}
+{{- define "master.image" -}}
+{{- if .Values.master.imageOverride -}}
+{{- $imageOverride := .Values.master.imageOverride -}}
+{{- printf "%s" $imageOverride -}}
+{{- else -}}
+{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}}
+{{- $repositoryName := .Values.image.repository | toString -}}
+{{- $name := .Values.global.imageName | toString -}}
+{{- $tag := .Values.global.imageTag | toString -}}
+{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Return the proper s3 image */}}
+{{- define "s3.image" -}}
+{{- if .Values.s3.imageOverride -}}
+{{- $imageOverride := .Values.s3.imageOverride -}}
+{{- printf "%s" $imageOverride -}}
+{{- else -}}
+{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}}
+{{- $repositoryName := .Values.image.repository | toString -}}
+{{- $name := .Values.global.imageName | toString -}}
+{{- $tag := .Values.global.imageTag | toString -}}
+{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Return the proper volume image */}}
+{{- define "volume.image" -}}
+{{- if .Values.volume.imageOverride -}}
+{{- $imageOverride := .Values.volume.imageOverride -}}
+{{- printf "%s" $imageOverride -}}
+{{- else -}}
+{{- $registryName := default .Values.image.registry .Values.global.localRegistry | toString -}}
+{{- $repositoryName := .Values.image.repository | toString -}}
+{{- $name := .Values.global.imageName | toString -}}
+{{- $tag := .Values.global.imageTag | toString -}}
+{{- printf "%s%s%s:%s" $registryName $repositoryName $name $tag -}}
+{{- end -}}
+{{- end -}}
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/ca-cert.yaml b/k8s/seaweedfs/templates/ca-cert.yaml
new file mode 100644
index 000000000..056f01502
--- /dev/null
+++ b/k8s/seaweedfs/templates/ca-cert.yaml
@@ -0,0 +1,14 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+ name: {{ template "seaweedfs.name" . }}-ca-cert
+ namespace: {{ .Release.Namespace }}
+spec:
+ secretName: {{ template "seaweedfs.name" . }}-ca-cert
+ commonName: "{{ template "seaweedfs.name" . }}-root-ca"
+ isCA: true
+ issuerRef:
+ name: {{ template "seaweedfs.name" . }}-clusterissuer
+ kind: ClusterIssuer
+{{- end }}
diff --git a/k8s/seaweedfs/templates/cert-clusterissuer.yaml b/k8s/seaweedfs/templates/cert-clusterissuer.yaml
new file mode 100644
index 000000000..d0bd42593
--- /dev/null
+++ b/k8s/seaweedfs/templates/cert-clusterissuer.yaml
@@ -0,0 +1,8 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: ClusterIssuer
+metadata:
+ name: {{ template "seaweedfs.name" . }}-clusterissuer
+spec:
+ selfSigned: {}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/client-cert.yaml b/k8s/seaweedfs/templates/client-cert.yaml
new file mode 100644
index 000000000..4d27b5659
--- /dev/null
+++ b/k8s/seaweedfs/templates/client-cert.yaml
@@ -0,0 +1,33 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+ name: {{ template "seaweedfs.name" . }}-client-cert
+ namespace: {{ .Release.Namespace }}
+spec:
+ secretName: {{ template "seaweedfs.name" . }}-client-cert
+ issuerRef:
+ name: {{ template "seaweedfs.name" . }}-clusterissuer
+ kind: ClusterIssuer
+ commonName: {{ .Values.certificates.commonName }}
+ organization:
+ - "SeaweedFS CA"
+ dnsNames:
+ - '*.{{ .Release.Namespace }}'
+ - '*.{{ .Release.Namespace }}.svc'
+ - '*.{{ .Release.Namespace }}.svc.cluster.local'
+ - '*.{{ template "seaweedfs.name" . }}-master'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc.cluster.local'
+{{- if .Values.certificates.ipAddresses }}
+ ipAddresses:
+ {{- range .Values.certificates.ipAddresses }}
+ - {{ . }}
+ {{- end }}
+{{- end }}
+ keyAlgorithm: {{ .Values.certificates.keyAlgorithm }}
+ keySize: {{ .Values.certificates.keySize }}
+ duration: {{ .Values.certificates.duration }}
+ renewBefore: {{ .Values.certificates.renewBefore }}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/filer-cert.yaml b/k8s/seaweedfs/templates/filer-cert.yaml
new file mode 100644
index 000000000..855183c54
--- /dev/null
+++ b/k8s/seaweedfs/templates/filer-cert.yaml
@@ -0,0 +1,33 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+ name: {{ template "seaweedfs.name" . }}-filer-cert
+ namespace: {{ .Release.Namespace }}
+spec:
+ secretName: {{ template "seaweedfs.name" . }}-filer-cert
+ issuerRef:
+ name: {{ template "seaweedfs.name" . }}-clusterissuer
+ kind: ClusterIssuer
+ commonName: {{ .Values.certificates.commonName }}
+ organization:
+ - "SeaweedFS CA"
+ dnsNames:
+ - '*.{{ .Release.Namespace }}'
+ - '*.{{ .Release.Namespace }}.svc'
+ - '*.{{ .Release.Namespace }}.svc.cluster.local'
+ - '*.{{ template "seaweedfs.name" . }}-master'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc.cluster.local'
+{{- if .Values.certificates.ipAddresses }}
+ ipAddresses:
+ {{- range .Values.certificates.ipAddresses }}
+ - {{ . }}
+ {{- end }}
+{{- end }}
+ keyAlgorithm: {{ .Values.certificates.keyAlgorithm }}
+ keySize: {{ .Values.certificates.keySize }}
+ duration: {{ .Values.certificates.duration }}
+ renewBefore: {{ .Values.certificates.renewBefore }}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/filer-service.yaml b/k8s/seaweedfs/templates/filer-service.yaml
new file mode 100644
index 000000000..493859e36
--- /dev/null
+++ b/k8s/seaweedfs/templates/filer-service.yaml
@@ -0,0 +1,22 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "seaweedfs.name" . }}-filer
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ component: filer
+spec:
+ clusterIP: None
+ ports:
+ - name: "swfs-filer"
+ port: {{ .Values.filer.port }}
+ targetPort: {{ .Values.filer.port }}
+ protocol: TCP
+ - name: "swfs-filer-grpc"
+ port: {{ .Values.filer.grpcPort }}
+ targetPort: {{ .Values.filer.grpcPort }}
+ protocol: TCP
+ selector:
+ app: {{ template "seaweedfs.name" . }}
+ component: filer
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/filer-statefulset.yaml b/k8s/seaweedfs/templates/filer-statefulset.yaml
new file mode 100644
index 000000000..6ee57edf7
--- /dev/null
+++ b/k8s/seaweedfs/templates/filer-statefulset.yaml
@@ -0,0 +1,210 @@
+{{- if .Values.filer.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: {{ template "seaweedfs.name" . }}-filer
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ .Release.Name }}
+spec:
+ serviceName: {{ template "seaweedfs.name" . }}-filer
+ podManagementPolicy: Parallel
+ replicas: {{ .Values.filer.replicas }}
+ {{- if (gt (int .Values.filer.updatePartition) 0) }}
+ updateStrategy:
+ type: RollingUpdate
+ rollingUpdate:
+ partition: {{ .Values.filer.updatePartition }}
+ {{- end }}
+ selector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: filer
+ template:
+ metadata:
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: filer
+ spec:
+ restartPolicy: {{ default .Values.global.restartPolicy .Values.filer.restartPolicy }}
+ {{- if .Values.filer.affinity }}
+ affinity:
+ {{ tpl .Values.filer.affinity . | nindent 8 | trim }}
+ {{- end }}
+ {{- if .Values.filer.tolerations }}
+ tolerations:
+ {{ tpl .Values.filer.tolerations . | nindent 8 | trim }}
+ {{- end }}
+ {{- if .Values.global.imagePullSecrets }}
+ imagePullSecrets:
+ - name: {{ .Values.global.imagePullSecrets }}
+ {{- end }}
+ serviceAccountName: seaweefds-rw-sa #hack for delete pod master after migration
+ terminationGracePeriodSeconds: 60
+ {{- if .Values.filer.priorityClassName }}
+ priorityClassName: {{ .Values.filer.priorityClassName | quote }}
+ {{- end }}
+ enableServiceLinks: false
+ containers:
+ - name: seaweedfs
+ image: {{ template "filer.image" . }}
+ imagePullPolicy: {{ default "IfNotPresent" .Values.global.imagePullPolicy }}
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: WEED_MYSQL_USERNAME
+ valueFrom:
+ secretKeyRef:
+ name: secret-seaweedfs-db
+ key: user
+ - name: WEED_MYSQL_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: secret-seaweedfs-db
+ key: password
+ - name: SEAWEEDFS_FULLNAME
+ value: "{{ template "seaweedfs.name" . }}"
+ {{- if .Values.filer.extraEnvironmentVars }}
+ {{- range $key, $value := .Values.filer.extraEnvironmentVars }}
+ - name: {{ $key }}
+ value: {{ $value | quote }}
+ {{- end }}
+ {{- end }}
+ command:
+ - "/bin/sh"
+ - "-ec"
+ - |
+ exec /usr/bin/weed -logdir=/logs \
+ {{- if .Values.filer.loggingOverrideLevel }}
+ -v={{ .Values.filer.loggingOverrideLevel }} \
+ {{- else }}
+ -v={{ .Values.global.loggingLevel }} \
+ {{- end }}
+ filer \
+ -port={{ .Values.filer.port }} \
+ {{- if .Values.filer.redirectOnRead }}
+ -redirectOnRead \
+ {{- end }}
+ {{- if .Values.filer.disableHttp }}
+ -disableHttp \
+ {{- end }}
+ {{- if .Values.filer.disableDirListing }}
+ -disableDirListing \
+ {{- end }}
+ -dirListLimit={{ .Values.filer.dirListLimit }} \
+ -ip=${POD_IP} \
+ -master={{ range $index := until (.Values.master.replicas | int) }}${SEAWEEDFS_FULLNAME}-master-{{ $index }}.${SEAWEEDFS_FULLNAME}-master:{{ $.Values.master.port }}{{ if lt $index (sub ($.Values.master.replicas | int) 1) }},{{ end }}{{ end }}
+ {{- if or (.Values.global.enableSecurity) (.Values.filer.extraVolumeMounts) }}
+ volumeMounts:
+ - name: seaweedfs-filer-log-volume
+ mountPath: "/logs/"
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ readOnly: true
+ mountPath: /etc/seaweedfs/security.toml
+ subPath: security.toml
+ - name: ca-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/ca/
+ - name: master-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/master/
+ - name: volume-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/volume/
+ - name: filer-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/filer/
+ - name: client-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/client/
+ {{- end }}
+ {{ tpl .Values.filer.extraVolumeMounts . | nindent 12 | trim }}
+ {{- end }}
+ ports:
+ - containerPort: {{ .Values.filer.port }}
+ name: swfs-filer
+ - containerPort: {{ .Values.filer.grpcPort }}
+ #name: swfs-filer-grpc
+ readinessProbe:
+ httpGet:
+ path: /
+ port: {{ .Values.filer.port }}
+ scheme: HTTP
+ initialDelaySeconds: 10
+ periodSeconds: 15
+ successThreshold: 1
+ failureThreshold: 100
+ livenessProbe:
+ httpGet:
+ path: /
+ port: {{ .Values.filer.port }}
+ scheme: HTTP
+ initialDelaySeconds: 20
+ periodSeconds: 30
+ successThreshold: 1
+ failureThreshold: 5
+ {{- if .Values.filer.resources }}
+ resources:
+ {{ tpl .Values.filer.resources . | nindent 12 | trim }}
+ {{- end }}
+ volumes:
+ - name: seaweedfs-filer-log-volume
+ hostPath:
+ path: /storage/logs/seaweedfs/filer
+ type: DirectoryOrCreate
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ configMap:
+ name: {{ template "seaweedfs.name" . }}-security-config
+ - name: ca-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-ca-cert
+ - name: master-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-master-cert
+ - name: volume-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-volume-cert
+ - name: filer-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-filer-cert
+ - name: client-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-client-cert
+ {{- end }}
+ {{ tpl .Values.filer.extraVolumes . | indent 8 | trim }}
+ {{- if .Values.filer.nodeSelector }}
+ nodeSelector:
+ {{ tpl .Values.filer.nodeSelector . | indent 8 | trim }}
+ {{- end }}
+{{/* volumeClaimTemplates:*/}}
+{{/* - metadata:*/}}
+{{/* name: data-{{ .Release.Namespace }}*/}}
+{{/* spec:*/}}
+{{/* accessModes:*/}}
+{{/* - ReadWriteOnce*/}}
+{{/* resources:*/}}
+{{/* requests:*/}}
+{{/* storage: {{ .Values.filer.storage }}*/}}
+{{/* {{- if .Values.filer.storageClass }}*/}}
+{{/* storageClassName: {{ .Values.filer.storageClass }}*/}}
+{{/* {{- end }}*/}}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/ingress.yaml b/k8s/seaweedfs/templates/ingress.yaml
new file mode 100644
index 000000000..dcd52c138
--- /dev/null
+++ b/k8s/seaweedfs/templates/ingress.yaml
@@ -0,0 +1,59 @@
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+ name: ingress-{{ template "seaweedfs.name" . }}-filer
+ annotations:
+ kubernetes.io/ingress.class: "nginx"
+ nginx.ingress.kubernetes.io/auth-type: "basic"
+ nginx.ingress.kubernetes.io/auth-secret: "default/ingress-basic-auth-secret"
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - SW-Filer'
+ nginx.ingress.kubernetes.io/service-upstream: "true"
+ nginx.ingress.kubernetes.io/rewrite-target: /$1
+ nginx.ingress.kubernetes.io/use-regex: "true"
+ nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
+ nginx.ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/configuration-snippet: |
+ sub_filter '
' ' '; #add base url
+ sub_filter '="/' '="./'; #make absolute paths to relative
+ sub_filter '=/' '=./';
+ sub_filter '/seaweedfsstatic' './seaweedfsstatic';
+ sub_filter_once off;
+spec:
+ rules:
+ - http:
+ paths:
+ - path: /sw-filer/?(.*)
+ backend:
+ serviceName: {{ template "seaweedfs.name" . }}-filer
+ servicePort: {{ .Values.filer.port }}
+---
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+ name: ingress-{{ template "seaweedfs.name" . }}-master
+ annotations:
+ kubernetes.io/ingress.class: "nginx"
+ nginx.ingress.kubernetes.io/auth-type: "basic"
+ nginx.ingress.kubernetes.io/auth-secret: "default/ingress-basic-auth-secret"
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - SW-Master'
+ nginx.ingress.kubernetes.io/service-upstream: "true"
+ nginx.ingress.kubernetes.io/rewrite-target: /$1
+ nginx.ingress.kubernetes.io/use-regex: "true"
+ nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
+ nginx.ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/configuration-snippet: |
+ sub_filter '' ' '; #add base url
+ sub_filter '="/' '="./'; #make absolute paths to relative
+ sub_filter '=/' '=./';
+ sub_filter '/seaweedfsstatic' './seaweedfsstatic';
+ sub_filter_once off;
+spec:
+ rules:
+ - http:
+ paths:
+ - path: /sw-master/?(.*)
+ backend:
+ serviceName: {{ template "seaweedfs.name" . }}-master
+ servicePort: {{ .Values.master.port }}
diff --git a/k8s/seaweedfs/templates/master-cert.yaml b/k8s/seaweedfs/templates/master-cert.yaml
new file mode 100644
index 000000000..a8b0fc1d1
--- /dev/null
+++ b/k8s/seaweedfs/templates/master-cert.yaml
@@ -0,0 +1,33 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+ name: {{ template "seaweedfs.name" . }}-master-cert
+ namespace: {{ .Release.Namespace }}
+spec:
+ secretName: {{ template "seaweedfs.name" . }}-master-cert
+ issuerRef:
+ name: {{ template "seaweedfs.name" . }}-clusterissuer
+ kind: ClusterIssuer
+ commonName: {{ .Values.certificates.commonName }}
+ organization:
+ - "SeaweedFS CA"
+ dnsNames:
+ - '*.{{ .Release.Namespace }}'
+ - '*.{{ .Release.Namespace }}.svc'
+ - '*.{{ .Release.Namespace }}.svc.cluster.local'
+ - '*.{{ template "seaweedfs.name" . }}-master'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc.cluster.local'
+{{- if .Values.certificates.ipAddresses }}
+ ipAddresses:
+ {{- range .Values.certificates.ipAddresses }}
+ - {{ . }}
+ {{- end }}
+{{- end }}
+ keyAlgorithm: {{ .Values.certificates.keyAlgorithm }}
+ keySize: {{ .Values.certificates.keySize }}
+ duration: {{ .Values.certificates.duration }}
+ renewBefore: {{ .Values.certificates.renewBefore }}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/master-service.yaml b/k8s/seaweedfs/templates/master-service.yaml
new file mode 100644
index 000000000..f7603bd91
--- /dev/null
+++ b/k8s/seaweedfs/templates/master-service.yaml
@@ -0,0 +1,24 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "seaweedfs.name" . }}-master
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ component: master
+ annotations:
+ service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
+spec:
+ clusterIP: None
+ ports:
+ - name: "swfs-master"
+ port: {{ .Values.master.port }}
+ targetPort: {{ .Values.master.port }}
+ protocol: TCP
+ - name: "swfs-master-grpc"
+ port: {{ .Values.master.grpcPort }}
+ targetPort: {{ .Values.master.grpcPort }}
+ protocol: TCP
+ selector:
+ app: {{ template "seaweedfs.name" . }}
+ component: master
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/master-statefulset.yaml b/k8s/seaweedfs/templates/master-statefulset.yaml
new file mode 100644
index 000000000..87050534f
--- /dev/null
+++ b/k8s/seaweedfs/templates/master-statefulset.yaml
@@ -0,0 +1,199 @@
+{{- if .Values.master.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: {{ template "seaweedfs.name" . }}-master
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ .Release.Name }}
+spec:
+ serviceName: {{ template "seaweedfs.name" . }}-master
+ podManagementPolicy: Parallel
+ replicas: {{ .Values.master.replicas }}
+ {{- if (gt (int .Values.master.updatePartition) 0) }}
+ updateStrategy:
+ type: RollingUpdate
+ rollingUpdate:
+ partition: {{ .Values.master.updatePartition }}
+ {{- end }}
+ selector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: master
+ template:
+ metadata:
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: master
+ spec:
+ restartPolicy: {{ default .Values.global.restartPolicy .Values.master.restartPolicy }}
+ {{- if .Values.master.affinity }}
+ affinity:
+ {{ tpl .Values.master.affinity . | nindent 8 | trim }}
+ {{- end }}
+ {{- if .Values.master.tolerations }}
+ tolerations:
+ {{ tpl .Values.master.tolerations . | nindent 8 | trim }}
+ {{- end }}
+ {{- if .Values.global.imagePullSecrets }}
+ imagePullSecrets:
+ - name: {{ .Values.global.imagePullSecrets }}
+ {{- end }}
+ terminationGracePeriodSeconds: 60
+ {{- if .Values.master.priorityClassName }}
+ priorityClassName: {{ .Values.master.priorityClassName | quote }}
+ {{- end }}
+ enableServiceLinks: false
+ containers:
+ - name: seaweedfs
+ image: {{ template "master.image" . }}
+ imagePullPolicy: {{ default "IfNotPresent" .Values.global.imagePullPolicy }}
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: SEAWEEDFS_FULLNAME
+ value: "{{ template "seaweedfs.name" . }}"
+ command:
+ - "/bin/sh"
+ - "-ec"
+ - |
+ exec /usr/bin/weed -logdir=/logs \
+ {{- if .Values.master.loggingOverrideLevel }}
+ -v={{ .Values.master.loggingOverrideLevel }} \
+ {{- else }}
+ -v={{ .Values.global.loggingLevel }} \
+ {{- end }}
+ master \
+ -port={{ .Values.master.port }} \
+ -mdir=/data \
+ -ip.bind={{ .Values.master.ipBind }} \
+ {{- if .Values.master.volumePreallocate }}
+ -volumePreallocate \
+ {{- end }}
+ {{- if .Values.global.monitoring.enabled }}
+ -metrics.address="{{ .Values.global.monitoring.gatewayHost }}:{{ .Values.global.monitoring.gatewayPort }}" \
+ {{- end }}
+ -volumeSizeLimitMB={{ .Values.master.volumeSizeLimitMB }} \
+ {{- if .Values.master.disableHttp }}
+ -disableHttp \
+ {{- end }}
+ -ip=${POD_NAME}.${SEAWEEDFS_FULLNAME}-master \
+ -peers={{ range $index := until (.Values.master.replicas | int) }}${SEAWEEDFS_FULLNAME}-master-{{ $index }}.${SEAWEEDFS_FULLNAME}-master:{{ $.Values.master.port }}{{ if lt $index (sub ($.Values.master.replicas | int) 1) }},{{ end }}{{ end }}
+ volumeMounts:
+ - name : data-{{ .Release.Namespace }}
+ mountPath: /data
+ - name: seaweedfs-master-log-volume
+ mountPath: "/logs/"
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ readOnly: true
+ mountPath: /etc/seaweedfs/security.toml
+ subPath: security.toml
+ - name: ca-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/ca/
+ - name: master-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/master/
+ - name: volume-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/volume/
+ - name: filer-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/filer/
+ - name: client-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/client/
+ {{- end }}
+ {{ tpl .Values.master.extraVolumeMounts . | nindent 12 | trim }}
+ ports:
+ - containerPort: {{ .Values.master.port }}
+ name: swfs-master
+ - containerPort: {{ .Values.master.grpcPort }}
+ #name: swfs-master-grpc
+ readinessProbe:
+ httpGet:
+ path: /cluster/status
+ port: {{ .Values.master.port }}
+ scheme: HTTP
+ initialDelaySeconds: 5
+ periodSeconds: 15
+ successThreshold: 2
+ failureThreshold: 100
+ livenessProbe:
+ httpGet:
+ path: /cluster/status
+ port: {{ .Values.master.port }}
+ scheme: HTTP
+ initialDelaySeconds: 20
+ periodSeconds: 10
+ successThreshold: 1
+ failureThreshold: 6
+ {{- if .Values.master.resources }}
+ resources:
+ {{ tpl .Values.master.resources . | nindent 12 | trim }}
+ {{- end }}
+ volumes:
+ - name: seaweedfs-master-log-volume
+ hostPath:
+ path: /storage/logs/seaweedfs/master
+ type: DirectoryOrCreate
+ - name: data-{{ .Release.Namespace }}
+ hostPath:
+ path: /ssd/seaweed-master/
+ type: DirectoryOrCreate
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ configMap:
+ name: {{ template "seaweedfs.name" . }}-security-config
+ - name: ca-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-ca-cert
+ - name: master-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-master-cert
+ - name: volume-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-volume-cert
+ - name: filer-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-filer-cert
+ - name: client-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-client-cert
+ {{- end }}
+ {{ tpl .Values.master.extraVolumes . | indent 8 | trim }}
+ {{- if .Values.master.nodeSelector }}
+ nodeSelector:
+ {{ tpl .Values.master.nodeSelector . | indent 8 | trim }}
+ {{- end }}
+{{/* volumeClaimTemplates:*/}}
+{{/* - metadata:*/}}
+{{/* name: data-{{ .Release.Namespace }}*/}}
+{{/* spec:*/}}
+{{/* accessModes:*/}}
+{{/* - ReadWriteOnce*/}}
+{{/* resources:*/}}
+{{/* requests:*/}}
+{{/* storage: {{ .Values.master.storage }}*/}}
+{{/* {{- if .Values.master.storageClass }}*/}}
+{{/* storageClassName: {{ .Values.master.storageClass }}*/}}
+{{/* {{- end }}*/}}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/s3-deployment.yaml b/k8s/seaweedfs/templates/s3-deployment.yaml
new file mode 100644
index 000000000..c124af287
--- /dev/null
+++ b/k8s/seaweedfs/templates/s3-deployment.yaml
@@ -0,0 +1,159 @@
+{{- if .Values.s3.enabled }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ template "seaweedfs.name" . }}-s3
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ .Release.Name }}
+spec:
+ serviceName: {{ template "seaweedfs.name" . }}-s3
+ replicas: {{ .Values.s3.replicas }}
+ selector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: s3
+ template:
+ metadata:
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: s3
+ spec:
+ restartPolicy: {{ default .Values.global.restartPolicy .Values.s3.restartPolicy }}
+ {{- if .Values.s3.tolerations }}
+ tolerations:
+ {{ tpl .Values.s3.tolerations . | nindent 8 | trim }}
+ {{- end }}
+ {{- if .Values.global.imagePullSecrets }}
+ imagePullSecrets:
+ - name: {{ .Values.global.imagePullSecrets }}
+ {{- end }}
+ terminationGracePeriodSeconds: 10
+ {{- if .Values.s3.priorityClassName }}
+ priorityClassName: {{ .Values.s3.priorityClassName | quote }}
+ {{- end }}
+ enableServiceLinks: false
+ containers:
+ - name: seaweedfs
+ image: {{ template "s3.image" . }}
+ imagePullPolicy: {{ default "IfNotPresent" .Values.global.imagePullPolicy }}
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: SEAWEEDFS_FULLNAME
+ value: "{{ template "seaweedfs.name" . }}"
+ command:
+ - "/bin/sh"
+ - "-ec"
+ - |
+ exec /usr/bin/weed \
+ {{- if .Values.s3.loggingOverrideLevel }}
+ -v={{ .Values.s3.loggingOverrideLevel }} \
+ {{- else }}
+ -v={{ .Values.global.loggingLevel }} \
+ {{- end }}
+ s3 \
+ -port={{ .Values.s3.port }} \
+ {{- if .Values.global.enableSecurity }}
+ -cert.file=/usr/local/share/ca-certificates/client/tls.crt \
+ -key.file=/usr/local/share/ca-certificates/client/tls.key \
+ {{- end }}
+ -filer.dir.buckets={{ .Values.s3.filerDirBuckets }} \
+ {{- if .Values.s3.domainName }}
+ -domainName={{ .Values.s3.domainName }} \
+ {{- end }}
+ -filer={{ template "seaweedfs.name" . }}-filer:{{ .Values.filer.port }}
+ {{- if or (.Values.global.enableSecurity) (.Values.s3.extraVolumeMounts) }}
+ volumeMounts:
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ readOnly: true
+ mountPath: /etc/seaweedfs/security.toml
+ subPath: security.toml
+ - name: ca-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/ca/
+ - name: master-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/master/
+ - name: volume-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/volume/
+ - name: filer-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/filer/
+ - name: client-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/client/
+ {{- end }}
+ {{ tpl .Values.s3.extraVolumeMounts . | nindent 12 | trim }}
+ {{- end }}
+ ports:
+ - containerPort: {{ .Values.s3.port }}
+ name: swfs-s3
+ readinessProbe:
+ httpGet:
+ path: /
+ port: {{ .Values.s3.port }}
+ scheme: HTTP
+ initialDelaySeconds: 15
+ periodSeconds: 15
+ successThreshold: 1
+ failureThreshold: 100
+ livenessProbe:
+ httpGet:
+ path: /
+ port: {{ .Values.s3.port }}
+ scheme: HTTP
+ initialDelaySeconds: 20
+ periodSeconds: 60
+ successThreshold: 1
+ failureThreshold: 20
+ {{- if .Values.s3.resources }}
+ resources:
+ {{ tpl .Values.s3.resources . | nindent 12 | trim }}
+ {{- end }}
+ volumes:
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ configMap:
+ name: {{ template "seaweedfs.name" . }}-security-config
+ - name: ca-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-ca-cert
+ - name: master-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-master-cert
+ - name: volume-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-volume-cert
+ - name: filer-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-filer-cert
+ - name: client-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-client-cert
+ {{- end }}
+ {{ tpl .Values.s3.extraVolumes . | indent 8 | trim }}
+ {{- if .Values.s3.nodeSelector }}
+ nodeSelector:
+ {{ tpl .Values.s3.nodeSelector . | indent 8 | trim }}
+ {{- end }}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/s3-service.yaml b/k8s/seaweedfs/templates/s3-service.yaml
new file mode 100644
index 000000000..b088e25fa
--- /dev/null
+++ b/k8s/seaweedfs/templates/s3-service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "seaweedfs.name" . }}-s3
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ component: s3
+spec:
+ ports:
+ - name: "swfs-s3"
+ port: {{ .Values.s3.port }}
+ targetPort: {{ .Values.s3.port }}
+ protocol: TCP
+ selector:
+ app: {{ template "seaweedfs.name" . }}
+ component: s3
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/seaweefs-grafana-dashboard.yaml b/k8s/seaweedfs/templates/seaweefs-grafana-dashboard.yaml
new file mode 100644
index 000000000..c943ea50f
--- /dev/null
+++ b/k8s/seaweedfs/templates/seaweefs-grafana-dashboard.yaml
@@ -0,0 +1,1352 @@
+{{- if .Values.global.monitoring.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: seaweefsfs-grafana-dashboard
+ labels:
+ grafana_dashboard: "1"
+data:
+ seaweedfs.json: |-
+ {
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "Prometheus",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "limit": 100,
+ "name": "Annotations & Alerts",
+ "showIn": 0,
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": 10423,
+ "graphTooltip": 0,
+ "hideControls": false,
+ "id": null,
+ "links": [],
+ "refresh": "30s",
+ "rows": [
+ {
+ "collapse": false,
+ "height": 251,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 46,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.80, sum(rate(SeaweedFS_filer_request_seconds_bucket[1m])) by (le))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "average",
+ "refId": "A",
+ "step": 60
+ },
+ {
+ "expr": "histogram_quantile(0.80, sum(rate(SeaweedFS_filer_request_seconds_bucket[1m])) by (le, type))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "B",
+ "step": 60
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Request Duration 95th percentile",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 49,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.95, sum(rate(SeaweedFS_filer_request_seconds_bucket[1m])) by (le))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "average",
+ "refId": "A",
+ "step": 60
+ },
+ {
+ "expr": "histogram_quantile(0.95, sum(rate(SeaweedFS_filer_request_seconds_bucket[1m])) by (le, type))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "B",
+ "step": 60
+ },
+ {
+ "expr": "",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Request Duration 95th percentile",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 45,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(SeaweedFS_filer_request_seconds_bucket[1m])) by (le))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "average",
+ "refId": "A",
+ "step": 60
+ },
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(SeaweedFS_filer_request_seconds_bucket[1m])) by (le, type))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "B",
+ "step": 60
+ },
+ {
+ "expr": "",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Request Duration 99th percentile",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 0,
+ "grid": {},
+ "id": 2,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": true,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": 250,
+ "sort": "max",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "minSpan": 12,
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "total",
+ "lines": false
+ }
+ ],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "rate(SeaweedFS_filer_request_total[1m]) * 5",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "A",
+ "step": 30
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer QPS",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Filer",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": 252,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 47,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": false,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(SeaweedFS_volumeServer_request_seconds_bucket[1m])) by (le, exported_instance))",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{exported_instance}}`}}",
+ "refId": "B"
+ },
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(SeaweedFS_volumeServer_request_seconds_bucket[1m])) by (le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "average",
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Volume Server Request Duration 99th percentile",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 40,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sort": "total",
+ "sortDesc": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(SeaweedFS_volumeServer_request_total[1m])) by (type)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Volume Server QPS",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 1,
+ "id": 48,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(SeaweedFS_volumeServer_volumes) by (collection, type)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{collection}}`}} {{`{{type}}`}}",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(SeaweedFS_volumeServer_max_volumes)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Total",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Volume Count",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 1,
+ "id": 50,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(SeaweedFS_volumeServer_total_disk_size) by (collection, type)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{collection}}`}} {{`{{type}}`}}",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(SeaweedFS_volumeServer_total_disk_size)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Total",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Used Disk Space by Collection and Type",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 1,
+ "id": 51,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(SeaweedFS_volumeServer_total_disk_size) by (exported_instance)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{exported_instance}}`}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Used Disk Space by Host",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Volume Server",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": 251,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 12,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": false,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(SeaweedFS_filerStore_request_seconds_bucket[1m])) by (le, type))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Store Request Duration 99th percentile",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 14,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(SeaweedFS_filerStore_request_total [1m])) by (type)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{type}}`}}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Store QPS",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Filer Store",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": 242,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 52,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": false,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "go_memstats_alloc_bytes{exported_job=\"filer\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "bytes allocated",
+ "refId": "B"
+ },
+ {
+ "expr": "rate(go_memstats_alloc_bytes_total{exported_job=\"filer\"}[30s])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "alloc rate",
+ "refId": "A"
+ },
+ {
+ "expr": "go_memstats_stack_inuse_bytes{exported_job=\"filer\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "stack inuse",
+ "refId": "C"
+ },
+ {
+ "expr": "go_memstats_heap_inuse_bytes{exported_job=\"filer\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "heap inuse",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Go Memory Stats",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 54,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": false,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "go_gc_duration_seconds{exported_job=\"filer\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{quantile}}`}}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Go GC duration quantiles",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {},
+ "id": 53,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": false,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "go_goroutines{exported_job=\"filer\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{`{{exported_instance}}`}}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Filer Go Routines",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "none",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Filer Instances",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 250,
+ "panels": [],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6"
+ }
+ ],
+ "schemaVersion": 14,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-15m",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "browser",
+ "title": "SeaweedFS",
+ "version": 3
+ }
+{{- end }}
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/secret-seaweedfs-db.yaml b/k8s/seaweedfs/templates/secret-seaweedfs-db.yaml
new file mode 100644
index 000000000..c397824ad
--- /dev/null
+++ b/k8s/seaweedfs/templates/secret-seaweedfs-db.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: Secret
+type: Opaque
+metadata:
+ name: secret-seaweedfs-db
+ namespace: {{ .Release.Namespace }}
+ annotations:
+ "helm.sh/resource-policy": keep
+ "helm.sh/hook": "pre-install"
+stringData:
+ user: {{ "YourSWUser" | b64enc }}
+ password: "HardCodedPassword"
+ # better to random generate and create in DB
+ # password: {{ randAlphaNum 10 | sha256sum | b64enc | trunc 32 }}
diff --git a/k8s/seaweedfs/templates/security-configmap.yaml b/k8s/seaweedfs/templates/security-configmap.yaml
new file mode 100644
index 000000000..7d06614ec
--- /dev/null
+++ b/k8s/seaweedfs/templates/security-configmap.yaml
@@ -0,0 +1,52 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ template "seaweedfs.name" . }}-security-config
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ .Release.Name }}
+data:
+ security.toml: |-
+ # this file is read by master, volume server, and filer
+
+ # the jwt signing key is read by master and volume server
+ # a jwt expires in 10 seconds
+ [jwt.signing]
+ key = "{{ randAlphaNum 10 | b64enc }}"
+
+ # all grpc tls authentications are mutual
+ # the values for the following ca, cert, and key are paths to the PERM files.
+ [grpc]
+ ca = "/usr/local/share/ca-certificates/ca/tls.crt"
+
+ [grpc.volume]
+ cert = "/usr/local/share/ca-certificates/volume/tls.crt"
+ key = "/usr/local/share/ca-certificates/volume/tls.key"
+
+ [grpc.master]
+ cert = "/usr/local/share/ca-certificates/master/tls.crt"
+ key = "/usr/local/share/ca-certificates/master/tls.key"
+
+ [grpc.filer]
+ cert = "/usr/local/share/ca-certificates/filer/tls.crt"
+ key = "/usr/local/share/ca-certificates/filer/tls.key"
+
+ # use this for any place needs a grpc client
+ # i.e., "weed backup|benchmark|filer.copy|filer.replicate|mount|s3|upload"
+ [grpc.client]
+ cert = "/usr/local/share/ca-certificates/client/tls.crt"
+ key = "/usr/local/share/ca-certificates/client/tls.key"
+
+ # volume server https options
+ # Note: work in progress!
+ # this does not work with other clients, e.g., "weed filer|mount" etc, yet.
+ [https.client]
+ enabled = false
+ [https.volume]
+ cert = ""
+ key = ""
+{{- end }}
diff --git a/k8s/seaweedfs/templates/service-account.yaml b/k8s/seaweedfs/templates/service-account.yaml
new file mode 100644
index 000000000..e82ef7d62
--- /dev/null
+++ b/k8s/seaweedfs/templates/service-account.yaml
@@ -0,0 +1,29 @@
+#hack for delete pod master after migration
+---
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1beta1
+metadata:
+ name: seaweefds-rw-cr
+rules:
+ - apiGroups: [""]
+ resources: ["pods"]
+ verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: seaweefds-rw-sa
+ namespace: {{ .Release.Namespace }}
+---
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1beta1
+metadata:
+ name: system:serviceaccount:seaweefds-rw-sa:default
+subjects:
+- kind: ServiceAccount
+ name: seaweefds-rw-sa
+ namespace: {{ .Release.Namespace }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: seaweefds-rw-cr
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/volume-cert.yaml b/k8s/seaweedfs/templates/volume-cert.yaml
new file mode 100644
index 000000000..72c62a0f5
--- /dev/null
+++ b/k8s/seaweedfs/templates/volume-cert.yaml
@@ -0,0 +1,33 @@
+{{- if .Values.global.enableSecurity }}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+ name: {{ template "seaweedfs.name" . }}-volume-cert
+ namespace: {{ .Release.Namespace }}
+spec:
+ secretName: {{ template "seaweedfs.name" . }}-volume-cert
+ issuerRef:
+ name: {{ template "seaweedfs.name" . }}-clusterissuer
+ kind: ClusterIssuer
+ commonName: {{ .Values.certificates.commonName }}
+ organization:
+ - "SeaweedFS CA"
+ dnsNames:
+ - '*.{{ .Release.Namespace }}'
+ - '*.{{ .Release.Namespace }}.svc'
+ - '*.{{ .Release.Namespace }}.svc.cluster.local'
+ - '*.{{ template "seaweedfs.name" . }}-master'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc'
+ - '*.{{ template "seaweedfs.name" . }}-master.{{ .Release.Namespace }}.svc.cluster.local'
+{{- if .Values.certificates.ipAddresses }}
+ ipAddresses:
+ {{- range .Values.certificates.ipAddresses }}
+ - {{ . }}
+ {{- end }}
+{{- end }}
+ keyAlgorithm: {{ .Values.certificates.keyAlgorithm }}
+ keySize: {{ .Values.certificates.keySize }}
+ duration: {{ .Values.certificates.duration }}
+ renewBefore: {{ .Values.certificates.renewBefore }}
+{{- end }}
diff --git a/k8s/seaweedfs/templates/volume-service.yaml b/k8s/seaweedfs/templates/volume-service.yaml
new file mode 100644
index 000000000..fc7716681
--- /dev/null
+++ b/k8s/seaweedfs/templates/volume-service.yaml
@@ -0,0 +1,22 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "seaweedfs.name" . }}-volume
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ component: volume
+spec:
+ clusterIP: None
+ ports:
+ - name: "swfs-volume"
+ port: {{ .Values.volume.port }}
+ targetPort: {{ .Values.volume.port }}
+ protocol: TCP
+ - name: "swfs-volume-18080"
+ port: {{ .Values.volume.grpcPort }}
+ targetPort: {{ .Values.volume.grpcPort }}
+ protocol: TCP
+ selector:
+ app: {{ template "seaweedfs.name" . }}
+ component: volume
\ No newline at end of file
diff --git a/k8s/seaweedfs/templates/volume-statefulset.yaml b/k8s/seaweedfs/templates/volume-statefulset.yaml
new file mode 100644
index 000000000..9c6ddcd9f
--- /dev/null
+++ b/k8s/seaweedfs/templates/volume-statefulset.yaml
@@ -0,0 +1,187 @@
+{{- if .Values.volume.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: {{ template "seaweedfs.name" . }}-volume
+ namespace: {{ .Release.Namespace }}
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ .Release.Name }}
+spec:
+ serviceName: {{ template "seaweedfs.name" . }}-volume
+ replicas: {{ .Values.volume.replicas }}
+ selector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: volume
+ template:
+ metadata:
+ labels:
+ app: {{ template "seaweedfs.name" . }}
+ chart: {{ template "seaweedfs.chart" . }}
+ release: {{ .Release.Name }}
+ component: volume
+ spec:
+ {{- if .Values.volume.affinity }}
+ affinity:
+ {{ tpl .Values.volume.affinity . | nindent 8 | trim }}
+ {{- end }}
+ restartPolicy: {{ default .Values.global.restartPolicy .Values.volume.restartPolicy }}
+ {{- if .Values.volume.tolerations }}
+ tolerations:
+ {{ tpl .Values.volume.tolerations . | nindent 8 | trim }}
+ {{- end }}
+ {{- if .Values.global.imagePullSecrets }}
+ imagePullSecrets:
+ - name: {{ .Values.global.imagePullSecrets }}
+ {{- end }}
+ terminationGracePeriodSeconds: 10
+ {{- if .Values.volume.priorityClassName }}
+ priorityClassName: {{ .Values.volume.priorityClassName | quote }}
+ {{- end }}
+ enableServiceLinks: false
+ containers:
+ - name: seaweedfs
+ image: {{ template "volume.image" . }}
+ imagePullPolicy: {{ default "IfNotPresent" .Values.global.imagePullPolicy }}
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ - name: SEAWEEDFS_FULLNAME
+ value: "{{ template "seaweedfs.name" . }}"
+ command:
+ - "/bin/sh"
+ - "-ec"
+ - |
+ exec /usr/bin/weed -logdir=/logs \
+ {{- if .Values.volume.loggingOverrideLevel }}
+ -v={{ .Values.volume.loggingOverrideLevel }} \
+ {{- else }}
+ -v={{ .Values.global.loggingLevel }} \
+ {{- end }}
+ volume \
+ -port={{ .Values.volume.port }} \
+ -dir={{ .Values.volume.dir }} \
+ -max={{ .Values.volume.maxVolumes }} \
+ {{- if .Values.volume.rack }}
+ -rack={{ .Values.volume.rack }} \
+ {{- end }}
+ {{- if .Values.volume.dataCenter }}
+ -dataCenter={{ .Values.volume.dataCenter }} \
+ {{- end }}
+ -ip.bind={{ .Values.volume.ipBind }} \
+ -read.redirect={{ .Values.volume.readRedirect }} \
+ {{- if .Values.volume.whiteList }}
+ -whiteList={{ .Values.volume.whiteList }} \
+ {{- end }}
+ {{- if .Values.volume.imagesFixOrientation }}
+ -images.fix.orientation \
+ {{- end }}
+ -ip=${POD_NAME}.${SEAWEEDFS_FULLNAME}-volume \
+ -compactionMBps={{ .Values.volume.compactionMBps }} \
+ -mserver={{ range $index := until (.Values.master.replicas | int) }}${SEAWEEDFS_FULLNAME}-master-{{ $index }}.${SEAWEEDFS_FULLNAME}-master:{{ $.Values.master.port }}{{ if lt $index (sub ($.Values.master.replicas | int) 1) }},{{ end }}{{ end }}
+ volumeMounts:
+ - name: seaweedfs-volume-storage
+ mountPath: "/data/"
+ - name: seaweedfs-volume-log-volume
+ mountPath: "/logs/"
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ readOnly: true
+ mountPath: /etc/seaweedfs/security.toml
+ subPath: security.toml
+ - name: ca-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/ca/
+ - name: master-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/master/
+ - name: volume-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/volume/
+ - name: filer-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/filer/
+ - name: client-cert
+ readOnly: true
+ mountPath: /usr/local/share/ca-certificates/client/
+ {{- end }}
+ {{ tpl .Values.volume.extraVolumeMounts . | nindent 12 | trim }}
+ ports:
+ - containerPort: {{ .Values.volume.port }}
+ name: swfs-vol
+ - containerPort: {{ .Values.volume.grpcPort }}
+ #name: swfs-vol-grpc
+ readinessProbe:
+ httpGet:
+ path: /status
+ port: {{ .Values.volume.port }}
+ scheme: HTTP
+ initialDelaySeconds: 5
+ periodSeconds: 15
+ successThreshold: 1
+ failureThreshold: 100
+ livenessProbe:
+ httpGet:
+ path: /status
+ port: {{ .Values.volume.port }}
+ scheme: HTTP
+ initialDelaySeconds: 20
+ periodSeconds: 30
+ successThreshold: 1
+ failureThreshold: 10
+ {{- if .Values.volume.resources }}
+ resources:
+ {{ tpl .Values.volume.resources . | nindent 12 | trim }}
+ {{- end }}
+ volumes:
+ - name: seaweedfs-volume-log-volume
+ hostPath:
+ path: /storage/logs/seaweedfs/volume
+ type: DirectoryOrCreate
+ - name: seaweedfs-volume-storage
+ hostPath:
+ path: /storage/object_store/
+ type: DirectoryOrCreate
+ {{- if .Values.global.enableSecurity }}
+ - name: security-config
+ configMap:
+ name: {{ template "seaweedfs.name" . }}-security-config
+ - name: ca-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-ca-cert
+ - name: master-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-master-cert
+ - name: volume-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-volume-cert
+ - name: filer-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-filer-cert
+ - name: client-cert
+ secret:
+ secretName: {{ template "seaweedfs.name" . }}-client-cert
+ {{- end }}
+ {{- if .Values.volume.extraVolumes }}
+ {{ tpl .Values.volume.extraVolumes . | indent 8 | trim }}
+ {{- end }}
+ {{- if .Values.volume.nodeSelector }}
+ nodeSelector:
+ {{ tpl .Values.volume.nodeSelector . | indent 8 | trim }}
+ {{- end }}
+{{- end }}
diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml
new file mode 100644
index 000000000..b7d93ff4a
--- /dev/null
+++ b/k8s/seaweedfs/values.yaml
@@ -0,0 +1,314 @@
+# Available parameters and their default values for the SeaweedFS chart.
+
+global:
+ registry: ""
+ repository: ""
+ imageName: chrislusf/seaweedfs
+ imageTag: "1.58"
+ imagePullPolicy: IfNotPresent
+ imagePullSecrets: imagepullsecret
+ restartPolicy: Always
+ loggingLevel: 1
+ enableSecurity: false
+ monitoring:
+ enabled: false
+ gatewayHost: null
+ gatewayPort: null
+
+image:
+ registry: ""
+ repository: ""
+
+master:
+ enabled: true
+ repository: null
+ imageName: null
+ imageTag: null
+ imageOverride: null
+ restartPolicy: null
+ replicas: 1
+ port: 9333
+ grpcPort: 19333
+ ipBind: "0.0.0.0"
+ volumePreallocate: false
+ volumeSizeLimitMB: 30000
+ loggingOverrideLevel: null
+
+ # Disable http request, only gRpc operations are allowed
+ disableHttp: false
+
+ extraVolumes: ""
+ extraVolumeMounts: ""
+
+ # storage and storageClass are the settings for configuring stateful
+ # storage for the master pods. storage should be set to the disk size of
+ # the attached volume. storageClass is the class of storage which defaults
+ # to null (the Kube cluster will pick the default).
+ storage: 25Gi
+ storageClass: null
+
+ # Resource requests, limits, etc. for the master cluster placement. This
+ # should map directly to the value of the resources field for a PodSpec,
+ # formatted as a multi-line string. By default no direct resource request
+ # is made.
+ resources: null
+
+ # updatePartition is used to control a careful rolling update of SeaweedFS
+ # masters.
+ updatePartition: 0
+
+ # Affinity Settings
+ # Commenting out or setting as empty the affinity variable, will allow
+ # deployment to single node services such as Minikube
+ affinity: |
+ podAntiAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ - labelSelector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ release: "{{ .Release.Name }}"
+ component: master
+ topologyKey: kubernetes.io/hostname
+
+ # Toleration Settings for master pods
+ # This should be a multi-line string matching the Toleration array
+ # in a PodSpec.
+ tolerations: ""
+
+ # nodeSelector labels for master pod assignment, formatted as a muli-line string.
+ # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
+ # Example:
+ # nodeSelector: |
+ # beta.kubernetes.io/arch: amd64
+ nodeSelector: |
+ sw-backend: "true"
+
+ # used to assign priority to master pods
+ # ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
+ priorityClassName: ""
+
+
+volume:
+ enabled: true
+ repository: null
+ imageName: null
+ imageTag: null
+ imageOverride: null
+ restartPolicy: null
+ port: 8080
+ grpcPort: 18080
+ ipBind: "0.0.0.0"
+ replicas: 1
+ loggingOverrideLevel: null
+
+ # limit background compaction or copying speed in mega bytes per second
+ compactionMBps: "40"
+
+ # Directories to store data files. dir[,dir]... (default "/tmp")
+ dir: "/data"
+
+ # Maximum numbers of volumes, count[,count]... (default "7")
+ maxVolumes: "10000"
+
+ # Volume server's rack name
+ rack: null
+
+ # Volume server's data center name
+ dataCenter: null
+
+ # Redirect moved or non-local volumes. (default true)
+ readRedirect: true
+
+ # Comma separated Ip addresses having write permission. No limit if empty.
+ whiteList: null
+
+ # Adjust jpg orientation when uploading.
+ imagesFixOrientation: false
+
+ extraVolumes: ""
+ extraVolumeMounts: ""
+
+ # Affinity Settings
+ # Commenting out or setting as empty the affinity variable, will allow
+ # deployment to single node services such as Minikube
+ affinity: |
+ podAntiAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ - labelSelector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ release: "{{ .Release.Name }}"
+ component: volume
+ topologyKey: kubernetes.io/hostname
+
+ # Resource requests, limits, etc. for the server cluster placement. This
+ # should map directly to the value of the resources field for a PodSpec,
+ # formatted as a multi-line string. By default no direct resource request
+ # is made.
+ resources: null
+
+ # Toleration Settings for server pods
+ # This should be a multi-line string matching the Toleration array
+ # in a PodSpec.
+ tolerations: ""
+
+ # nodeSelector labels for server pod assignment, formatted as a muli-line string.
+ # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
+ # Example:
+ # nodeSelector: |
+ # beta.kubernetes.io/arch: amd64
+ nodeSelector: |
+ sw-volume: "true"
+
+ # used to assign priority to server pods
+ # ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
+ priorityClassName: ""
+
+
+filer:
+ enabled: true
+ repository: null
+ imageName: null
+ imageTag: null
+ imageOverride: null
+ restartPolicy: null
+ replicas: 1
+ port: 8888
+ grpcPort: 18888
+ loggingOverrideLevel: null
+
+ # Whether proxy or redirect to volume server during file GET request
+ redirectOnRead: false
+
+ # Limit sub dir listing size (default 100000)
+ dirListLimit: 100000
+
+ # Turn off directory listing
+ disableDirListing: false
+
+ # Disable http request, only gRpc operations are allowed
+ disableHttp: false
+
+ # storage and storageClass are the settings for configuring stateful
+ # storage for the master pods. storage should be set to the disk size of
+ # the attached volume. storageClass is the class of storage which defaults
+ # to null (the Kube cluster will pick the default).
+ storage: 25Gi
+ storageClass: null
+
+ extraVolumes: ""
+ extraVolumeMounts: ""
+
+ # Affinity Settings
+ # Commenting out or setting as empty the affinity variable, will allow
+ # deployment to single node services such as Minikube
+ affinity: |
+ podAntiAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ - labelSelector:
+ matchLabels:
+ app: {{ template "seaweedfs.name" . }}
+ release: "{{ .Release.Name }}"
+ component: filer
+ topologyKey: kubernetes.io/hostname
+
+ # updatePartition is used to control a careful rolling update of SeaweedFS
+ # masters.
+ updatePartition: 0
+
+ # Resource requests, limits, etc. for the server cluster placement. This
+ # should map directly to the value of the resources field for a PodSpec,
+ # formatted as a multi-line string. By default no direct resource request
+ # is made.
+ resources: null
+
+ # Toleration Settings for server pods
+ # This should be a multi-line string matching the Toleration array
+ # in a PodSpec.
+ tolerations: ""
+
+ # nodeSelector labels for server pod assignment, formatted as a muli-line string.
+ # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
+ # Example:
+ # nodeSelector: |
+ # beta.kubernetes.io/arch: amd64
+ nodeSelector: |
+ sw-backend: "true"
+
+ # used to assign priority to server pods
+ # ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
+ priorityClassName: ""
+
+ dbSchema:
+ imageName: db-schema
+ imageTag: "development"
+ imageOverride: ""
+
+ # extraEnvVars is a list of extra enviroment variables to set with the stateful set.
+ extraEnvironmentVars:
+ WEED_MYSQL_ENABLED: "true"
+ WEED_MYSQL_HOSTNAME: "mysql-db-host"
+ WEED_MYSQL_PORT: "3306"
+ WEED_MYSQL_DATABASE: "sw-database"
+ WEED_MYSQL_CONNECTION_MAX_IDLE: "10"
+ WEED_MYSQL_CONNECTION_MAX_OPEN: "150"
+ # enable usage of memsql as filer backend
+ WEED_MYSQL_INTERPOLATEPARAMS: "true"
+ WEED_LEVELDB2_ENABLED: "false"
+ # with http DELETE, by default the filer would check whether a folder is empty.
+ # recursive_delete will delete all sub folders and files, similar to "rm -Rf"
+ WEED_FILER_OPTIONS_RECURSIVE_DELETE: "false"
+ # directories under this folder will be automatically creating a separate bucket
+ WEED_FILER_BUCKETS_FOLDER: "/buckets"
+ # directories under this folder will be store message queue data
+ WEED_FILER_QUEUES_FOLDER: "/queues"
+
+s3:
+ enabled: true
+ repository: null
+ imageName: null
+ imageTag: null
+ restartPolicy: null
+ replicas: 1
+ port: 8333
+ loggingOverrideLevel: null
+
+ # Folder on filer to store all buckets (default "/buckets")
+ filerDirBuckets: "/buckets"
+
+ # Suffix of the host name, {bucket}.{domainName}
+ domainName: ""
+
+ extraVolumes: ""
+ extraVolumeMounts: ""
+
+ # Resource requests, limits, etc. for the server cluster placement. This
+ # should map directly to the value of the resources field for a PodSpec,
+ # formatted as a multi-line string. By default no direct resource request
+ # is made.
+ resources: null
+
+ # Toleration Settings for server pods
+ # This should be a multi-line string matching the Toleration array
+ # in a PodSpec.
+ tolerations: ""
+
+ # nodeSelector labels for server pod assignment, formatted as a muli-line string.
+ # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
+ # Example:
+ # nodeSelector: |
+ # beta.kubernetes.io/arch: amd64
+ nodeSelector: |
+ sw-backend: "true"
+
+ # used to assign priority to server pods
+ # ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
+ priorityClassName: ""
+
+certificates:
+ commonName: "SeaweedFS CA"
+ ipAddresses: []
+ keyAlgorithm: rsa
+ keySize: 2048
+ duration: 2160h # 90d
+ renewBefore: 360h # 15d