Back to Rustfs

RustFS Helm Mode

helm/README.md

1.0.0-beta.116.8 KB
Original Source

RustFS Helm Mode

RustFS helm chart supports standalone and distributed mode. For standalone mode, there is only one pod and one pvc; for distributed mode, there are two styles, 4 pods and 16 pvcs(each pod has 4 pvcs), 16 pods and 16 pvcs(each pod has 1 pvc). You should decide which mode and style suits for your situation. You can specify the parameters mode and replicaCount to install different mode and style.

  • For standalone mode: Only one pod and one pvc acts as single node single disk; Specify parameters mode.standalone.enabled="true",mode.distributed.enabled="false" to install.
  • For distributed mode(default): Multiple pods and multiple pvcs, acts as multiple nodes multiple disks, there are two styles:
    • 4 pods and each pods has 4 pvcs(default)
    • 16 pods and each pods has 1 pvc: Specify parameters replicaCount with --set replicaCount="16" to install.

NOTE: Please make sure which mode suits for you situation and specify the right parameter to install rustfs on kubernetes.


Parameters Overview

ParameterTypeDefault valueDescription
affinity.nodeAffinityobject{}
affinity.podAntiAffinity.enabledbooltrue
affinity.podAntiAffinity.topologyKeystring"kubernetes.io/hostname"
commonLabelsobject{}Labels to add to all deployed objects.
config.rustfs.addressstring":9000"
config.rustfs.console_addressstring":9001"
config.rustfs.console_enablestring"true"
config.rustfs.domainsstring""Enable virtual host mode.
config.rustfs.log_levelstring"info"
config.rustfs.obs_environmentstring"development"
config.rustfs.obs_log_directorystring"/logs"
config.rustfs.regionstring"us-east-1"
config.rustfs.volumesstring""
config.rustfs.log_rotation.sizeint"100"Default log rotation size mb for rustfs.
config.rustfs.log_rotation.timestring"hour"Default log rotation time for rustfs.
config.rustfs.log_rotation.keep_filesint"30"Default log keep files for rustfs.
config.rustfs.metrics.enabledboolfalseToggle metrics export.
config.rustfs.metrics.endpointstring""Dedicated metrics endpoint.
config.rustfs.scanner.speedstring""Scanner speed preset: fastest, fast, default, slow, slowest.
config.rustfs.scanner.start_delay_secsstring""Override scanner cycle interval in seconds with RUSTFS_SCANNER_START_DELAY_SECS.
config.rustfs.scanner.idle_modestring""Override scanner idle throttling flag (RUSTFS_SCANNER_IDLE_MODE).
config.rustfs.scanner.cache_save_timeout_secsstring""Override scanner cache save timeout in seconds with RUSTFS_SCANNER_CACHE_SAVE_TIMEOUT_SECS (minimum 1).
config.rustfs.obs_endpoint.enabledboolfalseWhether to send metrics/logs/traces/profilings to remote endpoint, eg, OLTP.
config.rustfs.obs_endpoint.base_endpointstring""Root OTLP/HTTP endpoint, e.g. http://otel-collector:4318.
config.rustfs.obs_endpoint.use_stdoutboolfalseWhether to output logs to stdout in addition the OLTP.
config.rustfs.obs_endpoint.metrics.enabledboolfalseWhether to send metrics to remote endpoint.
config.rustfs.obs_endpoint.metrics.endpointstring""Remote endpoint url for metrics.
config.rustfs.obs_endpoint.trace.enabledboolfalseWhether to send trace to remote endpoint.
config.rustfs.obs_endpoint.trace.endpointstring""Remote endpoint url for trace.
config.rustfs.obs_endpoint.logs.enabledboolfalseWhether to send logs to remote endpoint.
config.rustfs.obs_endpoint.logs.endpointstring""Remote endpoint url for logs.
config.rustfs.obs_endpoint.profiling.enabledboolfalseWhether to send profiling to remote endpoint.
config.rustfs.obs_endpoint.profiling.endpointstring""Remote endpoint url for profiling.
config.rustfs.kms.enabledboolfalseWhether to enable kms.
config.rustfs.kms.typestringvaultThe kms type that RustFS supported.
config.rustfs.kms.vault.vault_backendstring""The vault backend, vault-kv2 or vault-transit.
config.rustfs.kms.vault.vault_addressstring""The vault address.
config.rustfs.kms.vault.vault_tokenstring""The vault token.
config.rustfs.kms.vault.vault_mount_pathstring"transit"The vault mount path, only works if vault_backend equals vault-transit .
config.rustfs.kms.vault.default_keystring"transit"The master key id for RustFS.
extraEnvmap[]Extra environment variables for RustFS container.
containerSecurityContext.capabilities.drop[0]string"ALL"
containerSecurityContext.readOnlyRootFilesystembooltrue
containerSecurityContext.runAsNonRootbooltrue
enableServiceLinksboolfalse
extraManifestslist[]List of additional k8s manifests.
fullnameOverridestring""
image.rustfs.pullPolicystring"IfNotPresent"
image.rustfs.repositorystring"rustfs/rustfs"RustFS docker image repository.
image.rustfs.tagstring""Chart appVersion default if unset.
imagePullSecretslist[]A List of secrets to pull image from private registry.
imageRegistryCredentials.emailstring""The email to pull rustfs image from private registry.
imageRegistryCredentials.enabledboolfalseTo indicate whether pull image from private registry.
imageRegistryCredentials.passwordstring""The password to pull rustfs image from private registry.
imageRegistryCredentials.registrystring""Private registry url to pull rustfs image.
imageRegistryCredentials.usernamestring""The username to pull rustfs image from private registry.
ingress.classNamestring"nginx"Specify the ingress class, traefik or nginx.
ingress.enabledbooltrue
ingress.hosts[0].hoststring"example.rustfs.com"
ingress.hosts[0].paths[0].pathstring"/"
ingress.hosts[0].paths[0].pathTypestring"ImplementationSpecific"
ingress.nginxAnnotations."nginx.ingress.kubernetes.io/affinity"string"cookie"
ingress.nginxAnnotations."nginx.ingress.kubernetes.io/session-cookie-expires"string"3600"
ingress.nginxAnnotations."nginx.ingress.kubernetes.io/session-cookie-hash"string"sha1"
ingress.nginxAnnotations."nginx.ingress.kubernetes.io/session-cookie-max-age"string"3600"
ingress.nginxAnnotations."nginx.ingress.kubernetes.io/session-cookie-name"string"rustfs"
ingress.customAnnotationsdict{}Additional custom annotations, merged with class-specific stickiness annotations.
ingress.traefikAnnotations."traefik.ingress.kubernetes.io/service.sticky.cookie"string"true"
ingress.traefikAnnotations."traefik.ingress.kubernetes.io/service.sticky.cookie.httponly"string"true"
ingress.traefikAnnotations."traefik.ingress.kubernetes.io/service.sticky.cookie.name"string"rustfs"
ingress.traefikAnnotations."traefik.ingress.kubernetes.io/service.sticky.cookie.samesite"string"none"
ingress.traefikAnnotations."traefik.ingress.kubernetes.io/service.sticky.cookie.secure"string"true"
ingress.tls.enabledboolfalseEnable tls and access rustfs via https.
ingress.tls.certManager.enabledstringfalseEnable cert manager support to generate certificate automatically.
ingress.tls.crtstring""The content of certificate file.
ingress.tls.keystring""The content of key file.
livenessProbe.failureThresholdint3
livenessProbe.httpGet.pathstring"/health"
livenessProbe.httpGet.portstring"endpoint"
livenessProbe.initialDelaySecondsint10
livenessProbe.periodSecondsint5
livenessProbe.successThresholdint1
livenessProbe.timeoutSecondsint3
mode.distributed.enabledbooltrueRustFS distributed mode support, namely multiple pod multiple pvc.
mode.standalone.enabledboolfalseRustFS standalone mode support, namely one pod one pvc.
mode.standalone.existingClaim.dataClaimstring""Whether to use existing pvc claim for data storage.
mode.standalone.existingClaim.logsClaimstring""Whether to use existing pvc claim for logs storage.
mtls.enabledboolfalseEnable mtls betweens pods.
mtls.clientCertPathstring/opt/tls/client_cert.pemThe path for client cert.
mtls.clientKeyPathstring/opt/tls/client_key.pemThe path for client key.
mtls.existingIssuerRef.enabledboolfalseEnable to use external/existing certificate issuer.
mtls.existingIssuerRef.namestring""The name of external/existing certificate issuer.
mtls.existingIssuerRef.kindstring""The kind of external/existing certificate iss
uer. ClusterIssuer or Issuer.
mtls.existingIssuerRef.groupstring""The group of external/existing certificate issuer.
nameOverridestring""
nodeSelectorobject{}
pdb.createboolfalseEnable/disable a Pod Disruption Budget creation
pdb.maxUnavailablestring1
pdb.minAvailablestring""
podAnnotationsobject{}
podLabelsobject{}
podSecurityContext.fsGroupint10001
podSecurityContext.runAsGroupint10001
podSecurityContext.runAsUserint10001
readinessProbe.failureThresholdint3
readinessProbe.httpGet.pathstring"/health/ready"
readinessProbe.httpGet.portstring"endpoint"
readinessProbe.initialDelaySecondsint30
readinessProbe.periodSecondsint5
readinessProbe.successThresholdint1
readinessProbe.timeoutSecondsint3
replicaCountint4Number of cluster nodes.
resources.limits.cpustring"200m"
resources.limits.memorystring"512Mi"
resources.requests.cpustring"100m"
resources.requests.memorystring"128Mi"
secret.existingSecretstring""Use existing secret with a credentials.
secret.rustfs.access_keystring"rustfsadmin"RustFS Access Key ID
secret.rustfs.secret_keystring"rustfsadmin"RustFS Secret Key ID
service.typestring"ClusterIP"
service.console.nodePortint32001
service.console.portint9001
service.endpoint.nodePortint32000
service.endpoint.portint9000
serviceAccount.annotationsobject{}
serviceAccount.automountbooltrue
serviceAccount.createbooltrue
serviceAccount.namestring""
storageclass.dataStorageSizestring"256Mi"The storage size for data PVC.
storageclass.logStorageSizestring"256Mi"The storage size for logs PVC.
storageclass.namestring"local-path"The name for StorageClass.
storageclass.pvcAnnotations.datamap{}Data pvc customized annotations.
storageclass.pvcAnnotations.logsmap{}Logs pvc customized annotations.
tolerationslist[]
gatewayApi.enabledboolfalseTo enable/disable gateway api support.
gatewayApi.gatewayClassstringtraefikGateway class implementation.
gatewayApi.listeners.http.namestringwebGateway API http listener name.
gatewayApi.listeners.http.portint8000Gateway API http listener port.
gatewayApi.listeners.https.namestringwebsecureGateway API https listener name.
gatewayApi.listeners.https.portint8443Gateway API https listener port.
gatewayApi.hostnamestringHostname to access RustFS via gateway api.
gatewayApi.secretNamestringSecret tls to via RustFS using HTTPS.
gatewayApi.existingGateway.namestring""The existing gateway name, instead of creating a new one.
gatewayApi.existingGateway.namespacestring""The namespace of the existing gateway, if not the local namespace.

NOTE:

The chart pulls the rustfs image from Docker Hub by default. For private registries, provide either:

  • Existing secrets: Set imagePullSecrets with an array of secret names

    yaml
    imagePullSecrets:
      - name: my-existing-secret
    
  • Auto-generated secret: Enable imageRegistryCredentials.enabled: true and specify credentials plus your image details

    yaml
    imageRegistryCredentials:
      enabled: true
      registry: myregistry.com
      username: myuser
      password: mypass
      email: [email protected]
    

Both approaches support pulling from private registries seamlessly and you can also combine them.

  • The chart default pull rustfs image from dockerhub, if your rustfs image stores in private registry, you can use either existing image Pull secrets with parameter imagePullSecrets or create one setting imageRegistryCredentials.enabled to true,and then specify the imageRegistryCredentials.registry/username/password/email as well as image.rustfs.repository,image.rustfs.tag to pull rustfs image from your private registry.

  • The default storageclass is local-path,if you want to specify your own storageclass, try to set parameter storageclass.name.

  • The default size for data and logs dir is 256Mi which must satisfy the production usage,you should specify storageclass.dataStorageSize and storageclass.logStorageSize to change the size, for example, 1Ti for data and 1Gi for logs.

Installation

Requirement

  • Helm V3
  • RustFS >= 1.0.0-alpha.69

Due to the traefik and ingress has different session sticky/affinity annotations, and rustfs support both those two controller, you should specify parameter ingress.className to select the right one which suits for you.

Installation with traefik controller

If your ingress class is traefik, running the command:

helm install rustfs -n rustfs --create-namespace ./ --set ingress.className="traefik"

Installation with nginx controller

If your ingress class is nginx, running the command:

helm install rustfs -n rustfs --create-namespace ./ --set ingress.className="nginx"

Installation check and rustfs login

Check the pod status

kubectl -n rustfs get pods -w
NAME       READY   STATUS    RESTARTS        AGE
rustfs-0   1/1     Running   0               2m27s
rustfs-1   1/1     Running   0               2m27s
rustfs-2   1/1     Running   0               2m27s
rustfs-3   1/1     Running   0               2m27s

Check the ingress status

kubectl -n rustfs get ing
NAME     CLASS   HOSTS            ADDRESS         PORTS     AGE
rustfs   nginx   example.rustfs.com   10.43.237.152   80, 443   29m

Access the rustfs cluster via https://example.rustfs.com with the default username and password rustfsadmin.

Replace the example.rustfs.com with your own domain as well as the certificates.

TLS configuration

By default, tls is not enabled. If you want to enable tls(recommendated),you can follow below steps:

  • Step 1: Certification generation

You can request cert and key from CA or use the self-signed cert(not recommendated on prod), and put those two files(eg, tls.crt and tls.key) under some directory on server, for example tls directory.

  • Step 2: Certification specifying

You should use --set-file parameter when running helm install command, for example, running the below command can enable ingress tls and generate tls secret:

helm install rustfs rustfs/rustfs -n rustfs --set tls.enabled=true,--set-file tls.crt=./tls.crt,--set-file tls.key=./tls.key

Gateway API support (alpha)

Due to ingress nginx retirement in March 2026, so RustFS adds support for gateway api. Currently, RustFS only supports traefik as gateway class, more and more gateway class support will be added in the future after those classes are tested. If you want to enable gateway api, specify gatewayApi.enabled to true while specify ingress.enabled to false. After installation, you can find the Gateway and HttpRoute resources,

$ kubectl -n rustfs get gateway
NAME             CLASS     ADDRESS   PROGRAMMED   AGE
rustfs-gateway   traefik             True         169m

$ kubectl -n rustfs get httproute
NAME           HOSTNAMES            AGE
rustfs-route   ["example.rustfs.com"]   172m

Then, via RustFS instance via https://example.rustfs.com or http://example.rustfs.com.

Uninstall

Uninstalling the rustfs installation with command,

helm uninstall rustfs -n rustfs