Administrator guide
Documentation home · User guide · Operator runbook
Use this guide to plan installation, expose storage to applications, monitor it and coordinate maintenance. The detailed references linked here define lifecycle, filesystem and recovery contracts. Application teams can start with the user guide after you provide a working StorageClass.
The documented release is 4.1.1, a documentation update to the 4.1.0 runtime. The shared NODE runtime requires local CSI 2.1.0 and is for staging evaluation. Repository records establish compilation and static review, not cluster runtime recovery or footprint measurements for this release. Confirm actual image publication before promotion; see builds and images. Earlier runtime reports retain their original source/image scope.
Plan the installation
The intended audience is small to medium VM deployments, roughly 4–16 GB RAM and 4–16 vCPUs per node. These are design targets, not measured capacity guarantees. Shared workers accept a common process failure boundary. Read the support scope before choosing workloads or availability expectations.
| Requirement | Administrative decision |
|---|---|
| Hosts | Linux, kernel FUSE, /dev/fuse, kubelet host paths, mount propagation and permission for the privileged mount owner. |
| Backing storage | Existing local CSI; backing class uses csi.local.tak-os.org, WaitForFirstConsumer and Delete reclaim. |
| Placement | One distinct Ready eligible local-storage node per full replica; application-only mount nodes need no backing assignment. |
| Failure domains | Check the underlying hosts, disks and power/network dependencies; different Node names alone do not provide independent resilience. |
| Capacity | Budget each full copy plus journal/checkpoint/transfer overhead against real free space; requested PVC bytes provide no quota or reservation. |
| Networking | DNS, API access, client-to-worker and peer connectivity, plus synchronized clocks. |
| Security | Trusted administrators/storage nodes, restricted monitoring endpoints, private host state and protected original per-volume credentials. |
| Recovery | External backups, application quiescence, maintenance ownership and a documented accepted recovery point. |
The required majorities for one through four replicas are respectively one, two, two and three. RF1 has no redundancy and RF2 needs both members. The driver never silently lowers quorum. Permanent original-node loss can leave replacement and reclamation blocked; plan for external recovery.
Install through the deployment repository
This source repository supplies runtime code, a CRD and integration fragments.
Installation is managed in the separate Orbit GitOps repository. The
orbit-deployment symlink points outside this repository; deployment edits
follow that repository's instructions and operational authorization.
Follow getting started in order:
- Establish the local driver and delayed-binding backing class. For shared mode, deliver local CSI 2.1.0 consumer publication and its explicit consumer root.
- Install the current CRD before provisioning or transitioning volumes. Preserve its immutable request and runtime rules.
- Configure manager, external-provisioner, CSI NODE frontend, FUSE owner,
registrar, service accounts and RBAC. The provisioner needs
--extra-create-metadata. Set CSIDriverattachRequired: falseandfsGroupPolicy: None. - Supply matching manager, node and replica images. Retain
--worker-imagefor legacy workers. Select--replica-runtimeexplicitly: it defaults tosharedfor new generations;podis the legacy compatibility path. Existing activated volumes retain their persisted mode until an explicit transition. - For shared mode, merge the NODE integration fragment
into the existing DaemonSet. Preserve frontend, mount owner and registrar.
Add
/node --role=replica-host, downward-API Node/Pod identity, host label, local-CSI socket, persistent state/mount roots and additive RBAC. - Configure real cluster DNS, network access, resources and health monitoring consistently, then deliver through the deployment repository's process.
The source YAML fragments are incomplete installation examples. The shared replica host needs HostToContainer propagation for the same backing directory that local CSI publishes with Bidirectional propagation. Preserve its private state root across restarts. Mount-owner FUSE privileges and kubelet propagation remain separate requirements. Use configuration for flags, defaults, socket paths and DNS settings.
Every scratch image needs an explicit executable command and contains no shell. The NODE image supplies both FUSE/client roles and the shared replica host; the standalone replica image remains for legacy compatibility. A new shared volume has individual backing PVCs and worker endpoints without per-volume worker or controller Pods.
Publish application storage policy
Create a replicated StorageClass through your managed deployment. The
StorageClass example uses
three copies, Immediate binding, Retain reclaim and disabled expansion.
Choose and communicate:
parameters.replicasfrom one through four; omission defaults to one.parameters.backingStorageClassnaming the existing local class.- Outer
RetainorDeletebased on the intended application lifecycle. - Whether teams may override replicas with the creation-time PVC annotation.
- Shared UID/GID, directory initialization, backup and support procedures.
Keep the outer class distinct from the delayed-binding local backing class. Caller topology constraints, fsType, mount options, clones and unrecognized StorageClass parameters are rejected. Replica count and access mode are immutable creation inputs; edits do not resize membership or migrate data.
Application teams use RWX for multiple nodes or RWO for one owning node. RWO is
not a single-Pod policy. ReadWriteOncePod, ReadOnlyMany provisioning and raw
block are unsupported. Communicate the workload exclusions and permissions in
the user guide before handing over a class.
Inspect a deployment and volume
Use an explicitly selected authorized kubeconfig for every cluster command. Replace these example values with your deployment's identities:
CSI_KUBECONFIG=/absolute/path/to/authorized-kubeconfig
CSI_CONTEXT=your-context-name
CSI_NAMESPACE=kube-system
APP_NAMESPACE=your-application-namespace
CSI_CLAIM=site-content
kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" get nodes \
-o custom-columns=NAME:.metadata.name,UID:.metadata.uid
kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" \
-n "$APP_NAMESPACE" get pvc "$CSI_CLAIM" -o wide
kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" \
-n "$CSI_NAMESPACE" get replicatedvolumes.replicated.csi.tak-os.org
kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" \
-n "$CSI_NAMESPACE" get pods -o wide
Resolve the bound PV and exact CSI handle, then inspect that generation:
CSI_PV=$(kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" \
-n "$APP_NAMESPACE" get pvc "$CSI_CLAIM" -o jsonpath='{.spec.volumeName}')
kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" get pv "$CSI_PV" \
-o custom-columns=NAME:.metadata.name,DRIVER:.spec.csi.driver,HANDLE:.spec.csi.volumeHandle,RECLAIM:.spec.persistentVolumeReclaimPolicy
Continue only after the claim is bound and the PV's driver is
csi.replicated.tak-os.org. Set CSI_VOLUME to the displayed handle; the
ReplicatedVolume UID is its protocol generation:
CSI_VOLUME=rv-your-exact-volume-handle
kubectl --kubeconfig "$CSI_KUBECONFIG" --context "$CSI_CONTEXT" \
-n "$CSI_NAMESPACE" get replicatedvolumes.replicated.csi.tak-os.org "$CSI_VOLUME" \
-o custom-columns=NAME:.metadata.name,GENERATION:.metadata.uid,RUNTIME:.spec.runtime,PHASE:.status.phase,REASON:.status.reason
Keep the source PVC UID, volume/generation, original Node UIDs, backing PVC/PV
identities, membership and CA through maintenance. Names alone do not establish
ownership. Record actual running image identities/build metadata: the CSI
vendor-version string still reports 3.2.0 for this image release.
Monitor and diagnose
Readiness has several layers. A Ready supervisor Pod does not establish worker
quorum, and a reachable endpoint does not prove the volume can serve. In shared
mode, inspect the per-replica EndpointSlices and correlated host/worker logs as
well as ReplicatedVolume phase/reason. ReplicaStateLost indicates known retained
replica-state loss with unknown application-file extent; unavailable nodes or
one missing redundant copy alone do not prove total data loss.
Use observability for metrics, JSON log fields, dashboards and alerts, and capacity for storage pressure and implementation limits. Monitor inventory freshness, desired/ready members, credential renewal, quorum, backing free space, journal/checkpoint/rebuild progress and shared host resources. Health probes must not restart workers solely because quorum or backing storage is unavailable.
Collect bounded control-plane diagnostics from a checkout with Python and kubectl available:
KUBECONFIG="$CSI_KUBECONFIG" python3 tools/support-bundle.py \
--context "$CSI_CONTEXT" --namespace "$CSI_NAMESPACE" \
--volume "$CSI_VOLUME" --output /private/path/incident-volume.json
Run source tool commands from the repository root. The output path must be new and its parent must exist. The bundle excludes Secret bytes, file contents and application logs. Review infrastructure identities before sharing it. For an incident, use the runbook to distinguish dependency, quorum, credentials, disk-full, permission and ownership failures.
Repair and maintain existing volumes
| Task | Procedure and completion boundary |
|---|---|
| Replace a member | Controlled replacement: current quorum, distinct spare, verified learner and original-member durable fence before removal. |
| Recover expired credentials | Certificate recovery: restore renewal under the original CA/signer, observe worker recovery and normal mounting. |
| Request early rotation | Rotation intent: preserve one request ID and observe refresh/previous-token cutoff. |
| Recover a disconnected mount | Mount recovery: stop consumers and complete normal unpublish/unstage/remount. |
| Upgrade binaries | Compatibility: quiesce all consumers, observe unmount, preserve authority, update compatible roles and remount. |
| Move legacy workers to shared mode | Shared-runtime transition: deliver prerequisites, quiesce and use generation-guarded intent; observe normal old-worker termination and shared readiness. |
The repair tool renders intent by default. Applying an operational request
requires the intended maintenance authorization; an accepted API patch does not
prove repair completed. Shared transitions are one-way and require --quiesced
when applying. Active mixed-version upgrades and shared-generation downgrades
are unsupported.
Preserve uncertain storage and restore original dependencies. Never reset a journal, lower quorum, substitute Node names for original UIDs, force-delete workers or strip finalizers to make an operation finish. The runbook maps bounded cleanup reasons to their required dependencies. Permanent-node disposal is parked.
Back up, retire and uninstall
Establish external backups before an incident. The backup/recovery guide documents Python 3.11+ archive tools, application quiescence, checksums, independently protected storage and restoration to an empty new volume. Restore requires recorded isolation of old authority and an accepted recovery point; restoration does not dispose of the old storage.
For normal retirement, stop consumers and inspect the actual outer PV policy.
Delete requests durable volume fencing and normal backing reclamation. Retain
keeps original CR, trust, assignments and backing storage for deliberate handling.
Direct deletion of the original ReplicatedVolume is destructive intent even for
retained storage. Follow lifecycle rather than deleting backing
claims individually.
Keep manager, NODE/legacy cleanup components, local CSI, CRD, RBAC and Secrets until deletion completes or retained authority is deliberately preserved. Shared cleanup must stop the worker, unpublish via local CSI and record exact backing release before ordinary reclamation. Follow the uninstall sequence before removing runtime resources through GitOps.
