Merge pull request #88 from lexfrei/feature/add-cache-persistence
This commit is contained in:
7 files changed
+247
No files matched your search
@@ -12,6 +12,8 @@ version: 2.5.1
|
|||||||
appVersion: 10.11.2
|
appVersion: 10.11.2
|
||||||
annotations:
|
annotations:
|
||||||
artifacthub.io/changes: |
|
artifacthub.io/changes: |
|
||||||
|
- kind: added
|
||||||
|
description: Add persistence.cache configuration for dedicated cache volume support
|
||||||
- kind: added
|
- kind: added
|
||||||
description: Add comprehensive IPv6 and dual-stack networking documentation
|
description: Add comprehensive IPv6 and dual-stack networking documentation
|
||||||
- kind: changed
|
- kind: changed
|
||||||
|
|||||||
@@ -87,6 +87,13 @@ helm install my-jellyfin jellyfin/jellyfin -f values.yaml
|
|||||||
| metrics.serviceMonitor.tlsConfig | object | `{}` | TLS configuration for scraping metrics |
|
| metrics.serviceMonitor.tlsConfig | object | `{}` | TLS configuration for scraping metrics |
|
||||||
| nameOverride | string | `""` | Override the default name of the chart. |
|
| nameOverride | string | `""` | Override the default name of the chart. |
|
||||||
| nodeSelector | object | `{}` | Node selector for pod scheduling. |
|
| nodeSelector | object | `{}` | Node selector for pod scheduling. |
|
||||||
|
| persistence.cache.accessMode | string | `"ReadWriteOnce"` | PVC specific settings, only used if type is 'pvc'. |
|
||||||
|
| persistence.cache.annotations | object | `{}` | Custom annotations to be added to the PVC |
|
||||||
|
| persistence.cache.enabled | bool | `false` | set to false to use emptyDir |
|
||||||
|
| persistence.cache.hostPath | string | `""` | Path on the host node for cache storage, only used if type is 'hostPath'. |
|
||||||
|
| persistence.cache.size | string | `"10Gi"` | |
|
||||||
|
| persistence.cache.storageClass | string | `""` | If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. |
|
||||||
|
| persistence.cache.type | string | `"pvc"` | Type of volume for cache storage (pvc, hostPath, emptyDir). If 'enabled' is false, 'emptyDir' is used regardless of this setting. |
|
||||||
| persistence.config.accessMode | string | `"ReadWriteOnce"` | |
|
| persistence.config.accessMode | string | `"ReadWriteOnce"` | |
|
||||||
| persistence.config.annotations | object | `{}` | Custom annotations to be added to the PVC |
|
| persistence.config.annotations | object | `{}` | Custom annotations to be added to the PVC |
|
||||||
| persistence.config.enabled | bool | `true` | set to false to use emptyDir |
|
| persistence.config.enabled | bool | `true` | set to false to use emptyDir |
|
||||||
|
|||||||
@@ -22,6 +22,28 @@ To access Jellyfin, you can use port-forwarding:
|
|||||||
Then visit http://localhost:{{ .Values.service.port }} in your browser.
|
Then visit http://localhost:{{ .Values.service.port }} in your browser.
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
Persistence Configuration:
|
||||||
|
Config: {{ if .Values.persistence.config.enabled }}{{ .Values.persistence.config.type | default "pvc" }}{{ if .Values.persistence.config.existingClaim }} (existing: {{ .Values.persistence.config.existingClaim }}){{ end }}{{ else }}emptyDir{{ end }}
|
||||||
|
Media: {{ if .Values.persistence.media.enabled }}{{ .Values.persistence.media.type | default "pvc" }}{{ if .Values.persistence.media.existingClaim }} (existing: {{ .Values.persistence.media.existingClaim }}){{ end }}{{ else }}emptyDir{{ end }}
|
||||||
|
Cache: {{ if .Values.persistence.cache.enabled }}{{ .Values.persistence.cache.type | default "pvc" }}{{ if .Values.persistence.cache.existingClaim }} (existing: {{ .Values.persistence.cache.existingClaim }}){{ end }}{{ else }}emptyDir{{ end }}
|
||||||
|
|
||||||
|
{{- if and .Values.persistence.cache.enabled (eq .Values.persistence.cache.type "pvc") }}
|
||||||
|
Cache Volume:
|
||||||
|
Dedicated cache volume is enabled for improved performance.
|
||||||
|
Size: {{ .Values.persistence.cache.size }}
|
||||||
|
Access Mode: {{ .Values.persistence.cache.accessMode }}
|
||||||
|
{{- if .Values.persistence.cache.storageClass }}
|
||||||
|
Storage Class: {{ .Values.persistence.cache.storageClass }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
- Faster transcoding and metadata operations
|
||||||
|
- Separate cache lifecycle from config/media
|
||||||
|
- Can use faster storage class (SSD) for cache
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if and .Values.persistence.cache.enabled (eq .Values.persistence.cache.type "hostPath") }}
|
||||||
|
⚠ WARNING: Using hostPath for cache - ensure {{ .Values.persistence.cache.hostPath }} exists on the node
|
||||||
{{- if or .Values.service.ipFamilyPolicy .Values.service.ipFamilies }}
|
{{- if or .Values.service.ipFamilyPolicy .Values.service.ipFamilies }}
|
||||||
|
|
||||||
Service IP Configuration:
|
Service IP Configuration:
|
||||||
|
|||||||
@@ -122,6 +122,8 @@ spec:
|
|||||||
name: config
|
name: config
|
||||||
- mountPath: /media
|
- mountPath: /media
|
||||||
name: media
|
name: media
|
||||||
|
- mountPath: /cache
|
||||||
|
name: cache
|
||||||
{{- with .Values.volumeMounts }}
|
{{- with .Values.volumeMounts }}
|
||||||
{{- toYaml . | nindent 12 }}
|
{{- toYaml . | nindent 12 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
@@ -155,6 +157,21 @@ spec:
|
|||||||
{{- else }}
|
{{- else }}
|
||||||
emptyDir: {}
|
emptyDir: {}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
- name: cache
|
||||||
|
{{- if .Values.persistence.cache.enabled }}
|
||||||
|
{{- if eq .Values.persistence.cache.type "pvc" }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ if .Values.persistence.cache.existingClaim }}{{ .Values.persistence.cache.existingClaim }}{{- else }}{{ template "jellyfin.fullname" . }}-cache{{- end }}
|
||||||
|
{{- else if eq .Values.persistence.cache.type "hostPath" }}
|
||||||
|
hostPath:
|
||||||
|
path: {{ .Values.persistence.cache.hostPath }}
|
||||||
|
type: Directory
|
||||||
|
{{- else }}
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
{{- with .Values.volumes }}
|
{{- with .Values.volumes }}
|
||||||
{{- toYaml . | nindent 8 }}
|
{{- toYaml . | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|||||||
@@ -43,3 +43,26 @@ spec:
|
|||||||
storageClassName: {{ . | quote }}
|
storageClassName: {{ . | quote }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if and .Values.persistence.cache.enabled (eq .Values.persistence.cache.type "pvc") (not .Values.persistence.cache.existingClaim) }}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ include "jellyfin.fullname" . }}-cache
|
||||||
|
labels:
|
||||||
|
{{- include "jellyfin.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.persistence.cache.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.persistence.cache.accessMode | quote }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.cache.size | quote }}
|
||||||
|
{{- with .Values.persistence.cache.storageClass }}
|
||||||
|
storageClassName: {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,160 @@
|
|||||||
|
suite: test cache persistence
|
||||||
|
templates:
|
||||||
|
- deployment.yaml
|
||||||
|
- persistentVolumeClaim.yaml
|
||||||
|
tests:
|
||||||
|
# Deployment volume mount tests
|
||||||
|
- it: should mount cache as emptyDir by default
|
||||||
|
template: deployment.yaml
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.template.spec.volumes
|
||||||
|
content:
|
||||||
|
name: cache
|
||||||
|
emptyDir: {}
|
||||||
|
|
||||||
|
- it: should mount cache PVC when enabled
|
||||||
|
template: deployment.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.template.spec.volumes
|
||||||
|
content:
|
||||||
|
name: cache
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: RELEASE-NAME-jellyfin-cache
|
||||||
|
|
||||||
|
- it: should mount cache from hostPath when configured
|
||||||
|
template: deployment.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: hostPath
|
||||||
|
persistence.cache.hostPath: /mnt/jellyfin-cache
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.template.spec.volumes
|
||||||
|
content:
|
||||||
|
name: cache
|
||||||
|
hostPath:
|
||||||
|
path: /mnt/jellyfin-cache
|
||||||
|
|
||||||
|
- it: should mount cache at correct path
|
||||||
|
template: deployment.yaml
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.template.spec.containers[0].volumeMounts
|
||||||
|
content:
|
||||||
|
name: cache
|
||||||
|
mountPath: /cache
|
||||||
|
|
||||||
|
# PVC tests
|
||||||
|
- it: should not create cache PVC by default
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 2 # config and media only
|
||||||
|
|
||||||
|
- it: should create cache PVC when enabled
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 3 # config, media, and cache
|
||||||
|
- contains:
|
||||||
|
path: metadata.name
|
||||||
|
content: RELEASE-NAME-jellyfin-cache
|
||||||
|
|
||||||
|
- it: should not create cache PVC when type is hostPath
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: hostPath
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 2 # config and media only
|
||||||
|
|
||||||
|
- it: should not create cache PVC when type is emptyDir
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: emptyDir
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 2
|
||||||
|
|
||||||
|
- it: should set cache PVC size correctly
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
documentIndex: 2
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
persistence.cache.size: 20Gi
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: spec.resources.requests.storage
|
||||||
|
value: 20Gi
|
||||||
|
|
||||||
|
- it: should set cache PVC access mode
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
documentIndex: 2
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
persistence.cache.accessMode: ReadWriteMany
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.accessModes
|
||||||
|
content: ReadWriteMany
|
||||||
|
|
||||||
|
- it: should set cache PVC storage class
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
documentIndex: 2
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
persistence.cache.storageClass: fast-ssd
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: spec.storageClassName
|
||||||
|
value: fast-ssd
|
||||||
|
|
||||||
|
- it: should add annotations to cache PVC
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
documentIndex: 2
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
persistence.cache.annotations:
|
||||||
|
my-annotation: my-value
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: metadata.annotations.my-annotation
|
||||||
|
value: my-value
|
||||||
|
|
||||||
|
- it: should use existing claim when specified
|
||||||
|
template: deployment.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
persistence.cache.existingClaim: my-existing-cache-claim
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.template.spec.volumes
|
||||||
|
content:
|
||||||
|
name: cache
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: my-existing-cache-claim
|
||||||
|
|
||||||
|
- it: should not create PVC when existing claim used
|
||||||
|
template: persistentVolumeClaim.yaml
|
||||||
|
set:
|
||||||
|
persistence.cache.enabled: true
|
||||||
|
persistence.cache.type: pvc
|
||||||
|
persistence.cache.existingClaim: my-existing-cache-claim
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 2 # config and media only, not cache
|
||||||
@@ -241,6 +241,22 @@ persistence:
|
|||||||
storageClass: ''
|
storageClass: ''
|
||||||
## -- Use an existing PVC for this mount
|
## -- Use an existing PVC for this mount
|
||||||
# existingClaim: ''
|
# existingClaim: ''
|
||||||
|
cache:
|
||||||
|
# -- set to false to use emptyDir
|
||||||
|
enabled: false
|
||||||
|
# -- Type of volume for cache storage (pvc, hostPath, emptyDir). If 'enabled' is false, 'emptyDir' is used regardless of this setting.
|
||||||
|
type: pvc
|
||||||
|
# -- Path on the host node for cache storage, only used if type is 'hostPath'.
|
||||||
|
hostPath: ""
|
||||||
|
# -- PVC specific settings, only used if type is 'pvc'.
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
size: 10Gi
|
||||||
|
# -- Custom annotations to be added to the PVC
|
||||||
|
annotations: {}
|
||||||
|
# -- If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner.
|
||||||
|
storageClass: ''
|
||||||
|
## -- Use an existing PVC for this mount
|
||||||
|
# existingClaim: ''
|
||||||
|
|
||||||
# -- Configuration for metrics collection and monitoring
|
# -- Configuration for metrics collection and monitoring
|
||||||
metrics:
|
metrics:
|
||||||
|
|||||||
Reference in new issue
Block a user