# PersistentVolumes auf einer SMB-Freigabe (csi-driver-smb, smb.csi.k8s.io). # # VORAUSSETZUNG: csi-driver-smb im Cluster installiert, z. B.: # helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts # helm install csi-driver-smb csi-driver-smb/csi-driver-smb -n kube-system # und das Zugangs-Secret "artista-modelcamp-smb" (k8s/secret.example.yaml). # # ANZUPASSEN: "source" (////) je Volume. Die Ordner # muessen auf der Freigabe bereits existieren; der Postgres-Ordner leer. # # Beide Verbindungen verschluesselt (SMB 3.1.1 + seal); das NAS muss # SMB-Verschluesselung erlauben. fsGroup wirkt auf SMB nicht: Besitz und # Rechte setzen uid/gid/dir_mode/file_mode. reclaimPolicy Retain: Loeschen # von PVC/PV laesst die Dateien auf dem NAS. # Keine eigene Sicherung im Cluster: die Freigabe wird auf dem NAS gesichert. # --- PostgreSQL-Datenverzeichnis ------------------------------------------------ # BEWUSSTE AUSNAHME (Entscheidung des Betreibers): Datenbank auf SMB. # Risiko: SMB garantiert Sperren/fsync nicht in jedem Fall wie ein lokales # Dateisystem; bei Netzwerk- oder NAS-Ausfall waehrend Schreibvorgaengen kann # die Datenbank beschaedigt werden. Die Optionen unten minimieren das: # hard E/A wartet bei Netzstoerung statt Fehler an PostgreSQL zu # melden (kein "soft"-Abbruch mitten im Schreiben) # cache=strict strikte Cache-Kohaerenz, fsync geht bis zum Server # nobrl keine Byte-Range-Locks (PostgreSQL braucht sie nicht) # uid/gid 70, 0700/0600 PostgreSQL verlangt ein privates Datenverzeichnis # Sicherung: nur NAS-Snapshots, die atomar sind (Btrfs/ZFS-Snapshot der ganzen # Freigabe), sind fuer ein laufendes Datenverzeichnis konsistent. Einfaches # Dateikopieren waehrend des Betriebs ergibt KEINE brauchbare Sicherung. apiVersion: v1 kind: PersistentVolume metadata: name: artista-modelcamp-postgres-smb spec: capacity: storage: 10Gi accessModes: ["ReadWriteOnce"] persistentVolumeReclaimPolicy: Retain storageClassName: "" mountOptions: - vers=3.1.1 - seal - hard - cache=strict - uid=70 - gid=70 - dir_mode=0700 - file_mode=0600 - mfsymlinks - nobrl csi: driver: smb.csi.k8s.io volumeHandle: artista-modelcamp-postgres-smb volumeAttributes: source: //nas.example.lan/artista/modelcamp-postgres nodeStageSecretRef: name: artista-modelcamp-smb namespace: artista --- # --- Medien (Bilder/Videos) ------------------------------------------------------ # Die App liest nur. Neue Bilder legst du direkt ueber die SMB-Freigabe ab, # z. B. vom Windows-Explorer aus. apiVersion: v1 kind: PersistentVolume metadata: name: artista-modelcamp-media-smb spec: capacity: storage: 5Gi accessModes: ["ReadWriteMany"] persistentVolumeReclaimPolicy: Retain storageClassName: "" mountOptions: - vers=3.1.1 - seal - uid=1001 # Containerbenutzer "nextjs" (Dockerfile) - gid=1001 - dir_mode=0550 # App liest nur; Schreiben ausschliesslich ueber das NAS - file_mode=0440 - mfsymlinks - nobrl csi: driver: smb.csi.k8s.io volumeHandle: artista-modelcamp-media-smb volumeAttributes: source: //nas.example.lan/artista/modelcamp-media nodeStageSecretRef: name: artista-modelcamp-smb namespace: artista