0.3.0: Longhorn CSI skeleton (#347 phase 1) — additive, default-off

This commit is contained in:
OdooSky Bot
2026-05-02 21:11:41 +03:00
parent 4a545946ab
commit 81ec240e03
3 changed files with 92 additions and 2 deletions

View File

@@ -23,8 +23,8 @@ description: |
Git). Git).
type: application type: application
version: 0.2.6 version: 0.3.0
appVersion: "0.2.6" appVersion: "0.3.0"
dependencies: dependencies:
- name: cert-manager - name: cert-manager
@@ -35,3 +35,12 @@ dependencies:
version: "33.2.1" version: "33.2.1"
repository: "https://traefik.github.io/charts" repository: "https://traefik.github.io/charts"
condition: traefik.enabled condition: traefik.enabled
# Longhorn — CSI block storage with snapshot + clone primitives.
# See ADR 0003 (in odooskyv3 monorepo). Phase 1 declares the
# dependency but the chart's default is `longhorn.enabled=false`,
# so `helm dep update` skips it on render unless a per-cluster
# Argo Application sets the flag.
- name: longhorn
version: "1.7.2"
repository: "https://charts.longhorn.io"
condition: longhorn.enabled

43
templates/longhorn.yaml Normal file
View File

@@ -0,0 +1,43 @@
{{- if .Values.longhorn.enabled }}
# Tenant data StorageClass. Tower's instance overlays don't pin a
# storageClassName today (they let the cluster default decide). Phase
# 1 of ADR 0003 just defines this class so Phase 2/3 can flip new
# instances to bind here without further chart changes.
#
# `replicaCount` comes from values; Standalone tier ships replicas=1
# (durability is hourly S3, not local mirrors).
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-tenants
annotations:
# Not the cluster default in Phase 1 — explicit opt-in only.
storageclass.kubernetes.io/is-default-class: "false"
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: Immediate
parameters:
numberOfReplicas: "{{ .Values.longhorn.replicas }}"
staleReplicaTimeout: "30"
fromBackup: ""
# fsType: ext4 is the default; explicit so the contract is in Git.
fsType: "ext4"
---
# VolumeSnapshotClass — the API surface the Tower backend will
# consume in Phase 3 to take snapshots of source PVCs before
# spawn-env / Refresh ↓.
#
# `type: snap` (Longhorn's in-place snapshot) is what we want for
# the fast Clone path: the snapshot is a CoW reference, not an S3
# upload. `type: bak` is the slower S3-bound block backup, used
# only by the daily DR layer.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: longhorn-snapshot-class
driver: driver.longhorn.io
deletionPolicy: Delete
parameters:
type: snap
{{- end }}

View File

@@ -112,3 +112,41 @@ registry:
limits: limits:
cpu: 500m cpu: 500m
memory: 256Mi memory: 256Mi
# longhorn — CSI block storage. See ADR 0003 (odooskyv3 monorepo) for
# the full design. Phase 1 (this commit): declared but disabled.
# Per-server enablement happens via the per-cluster Argo Application's
# helm.parameters (set `longhorn.enabled=true`).
#
# Host prerequisites (already satisfied on bootstrap.sh-Connect'd
# servers): `open-iscsi` package + `iscsi_tcp` kernel module +
# `iscsid` service. Servers provisioned out-of-band must run
# `apt-get install -y open-iscsi && modprobe iscsi_tcp &&
# systemctl enable --now iscsid` before flipping enabled=true.
#
# When `longhorn.enabled=true`, the chart additionally renders:
# - StorageClass `longhorn-tenants` (replicaCount = .replicas)
# - VolumeSnapshotClass `longhorn-snapshot-class` for the future
# VolumeClone Refresh ↓ path
# Existing instances on `local-path` are unaffected — Longhorn
# co-exists, doesn't replace local-path.
longhorn:
enabled: false
# Replicas per Longhorn volume. Standard tier (single server) =
# 1 — durability story is hourly S3 backup, not local replicas.
# HA-Active sets this to 2 across the cluster's worker nodes.
replicas: 1
# Default data path. k3s nodes get `/var/lib/longhorn` by default;
# production servers may want this on a separate disk for IOPS
# isolation from the OS root volume.
defaultDataPath: /var/lib/longhorn
# S3 backup target for Longhorn's own block-level backups (DR
# layer alongside Tower's application-level pg_dump path). When
# set, Longhorn writes block-incremental backups to this prefix
# daily. Empty = block-level backup disabled, application backup
# only.
backupTarget: ""
# Same S3 secret Tower's application backup already uses.
backupCredsSecret:
namespace: tenants
name: s3-backup-creds