{"id":34503106,"url":"https://github.com/fenio/tns-csi","last_synced_at":"2026-04-02T12:30:43.246Z","repository":{"id":326747782,"uuid":"1088980523","full_name":"fenio/tns-csi","owner":"fenio","description":"Kubernetes CSI driver for TrueNAS Scale","archived":false,"fork":false,"pushed_at":"2026-03-21T18:21:46.000Z","size":120338,"stargazers_count":88,"open_issues_count":3,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-22T07:59:26.930Z","etag":null,"topics":["csi","csi-driver","iscsi","k8s","kubectl-plugin","kubernetes","nfs","nvme-of","persistent-volume","persistent-volume-claim","smb","storage","truenas","zfs"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fenio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"fenio","patreon":null,"open_collective":null,"ko_fi":"fenio","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2025-11-03T18:08:54.000Z","updated_at":"2026-03-21T18:21:48.000Z","dependencies_parsed_at":"2026-02-08T10:00:51.039Z","dependency_job_id":null,"html_url":"https://github.com/fenio/tns-csi","commit_stats":null,"previous_names":["fenio/tns-csi"],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/fenio/tns-csi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenio%2Ftns-csi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenio%2Ftns-csi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenio%2Ftns-csi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenio%2Ftns-csi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fenio","download_url":"https://codeload.github.com/fenio/tns-csi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fenio%2Ftns-csi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31306053,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T09:48:21.550Z","status":"ssl_error","status_checked_at":"2026-04-02T09:48:19.196Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csi","csi-driver","iscsi","k8s","kubectl-plugin","kubernetes","nfs","nvme-of","persistent-volume","persistent-volume-claim","smb","storage","truenas","zfs"],"created_at":"2025-12-24T02:25:34.015Z","updated_at":"2026-04-02T12:30:43.237Z","avatar_url":"https://github.com/fenio.png","language":"Go","funding_links":["https://github.com/sponsors/fenio","https://ko-fi.com/fenio"],"categories":[],"sub_categories":[],"readme":"# TNS CSI Driver\n\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![Go Version](https://img.shields.io/badge/Go-1.26.0-00ADD8?logo=go)](https://go.dev/)\n[![Go Report Card](https://goreportcard.com/badge/github.com/fenio/tns-csi)](https://goreportcard.com/report/github.com/fenio/tns-csi)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=fenio_tns-csi\u0026metric=coverage)](https://sonarcloud.io/summary/overall?id=fenio_tns-csi)\n[![CI](https://github.com/fenio/tns-csi/actions/workflows/ci.yml/badge.svg)](https://github.com/fenio/tns-csi/actions/workflows/ci.yml)\n[![Integration Tests](https://github.com/fenio/tns-csi/actions/workflows/integration.yml/badge.svg)](https://github.com/fenio/tns-csi/actions/workflows/integration.yml)\n[![Distro Compatibility](https://github.com/fenio/tns-csi/actions/workflows/distro-compatibility.yml/badge.svg)](https://github.com/fenio/tns-csi/actions/workflows/distro-compatibility.yml)\n[![Test Dashboard](https://img.shields.io/badge/Test%20Dashboard-View-blue)](https://fenio.github.io/tns-csi/dashboard/)\n[![Docker Hub](https://img.shields.io/docker/pulls/bfenski/tns-csi?logo=docker)](https://hub.docker.com/r/bfenski/tns-csi)\n[![Driver](https://img.shields.io/github/v/release/fenio/tns-csi?filter=v*\u0026label=driver\u0026logo=github)](https://github.com/fenio/tns-csi/releases/latest)\n[![Plugin](https://img.shields.io/github/v/release/fenio/tns-csi?filter=plugin-*\u0026label=plugin\u0026logo=github)](https://github.com/fenio/tns-csi/releases)\n\nA Kubernetes CSI (Container Storage Interface) driver for TrueNAS Scale 25.10+.\n\n## Important Disclaimer\n\n**This project is in early development phase and is NOT production-ready**\n- Use of this software is entirely at your own risk\n- Extensive testing and validation required before production use\n\n## Overview\n\nThis CSI driver enables Kubernetes to provision and manage persistent volumes on TrueNAS Scale 25.10+. It currently supports:\n\n- **NFS** - Network File System for file-based storage\n- **NVMe-oF** - NVMe over Fabrics for high-performance block storage\n- **iSCSI** - Traditional block storage protocol with broad compatibility\n- **SMB/CIFS** - Authenticated file sharing with Windows compatibility\n\n## Supporting This Project\n\nIf you find this driver useful, please consider helping keep it alive.\n\nEvery commit is tested against a **real TrueNAS server** and a **real Kubernetes cluster** across 6 distributions and 4 storage protocols. That infrastructure isn't free — GitHub-hosted runners can't do nested virtualization, so reliable testing requires dedicated self-hosted servers.\n\n**What it takes to run this:**\n- **Self-hosted GitHub Actions runner** with nested virtualization (OVH dedicated server)\n- **Dedicated TrueNAS server** (Akamai/Linode) running real ZFS pools, NFS/SMB shares, NVMe-oF subsystems, and iSCSI targets\n\nThese costs are currently paid out of pocket by the maintainer. This is a community project with **no corporate backing** — I reached out to iXsystems (the company behind TrueNAS) asking for any kind of support for a driver that directly benefits their platform and users. They didn't respond.\n\n[![GitHub Sponsors](https://img.shields.io/badge/Sponsor-%E2%9D%A4-pink?logo=github)](https://github.com/sponsors/fenio)\n\nEven small contributions help keep the test infrastructure running. Stars, bug reports, and code contributions are equally appreciated.\n\n## Comparison with Other Drivers\n\n| | TNS-CSI | truenas-csi (Official) | Democratic-CSI |\n|---|---------|------------------------|----------------|\n| **Best for** | Modern TrueNAS with NVMe-oF | Scheduled snapshots, CHAP auth | Broad compatibility |\n| **Block protocols** | NVMe-oF, iSCSI | iSCSI | iSCSI (+ NVMe-oF for ZoL) |\n| **File protocols** | NFS, SMB | NFS | NFS, SMB |\n| **Unique strength** | kubectl plugin, metrics, adoption, encryption | Scheduled snapshots | Multi-backend, Windows |\n| **Trade-off** | WebSocket API only | No NVMe-oF, no plugin | SSH complexity |\n| **Maturity** | Early development | Very new (Dec 2025) | Mature, production-ready |\n\nSee detailed comparisons:\n- [TNS-CSI vs truenas-csi (Official)](docs/COMPARISON-TRUENAS-CSI.md)\n- [TNS-CSI vs Democratic-CSI](docs/COMPARISON-DEMOCRATIC-CSI.md)\n\n## Dashboard and Observability\n\n\u003cimg width=\"1380\" height=\"914\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5d2ce624-2031-442d-8f6f-5422bce9bab7\" /\u003e\n\nThe driver includes two dashboard options and a pre-built Grafana dashboard:\n\n- **In-cluster dashboard** — runs inside the controller pod (port 9090), enable with `controller.dashboard.enabled: true`\n- **kubectl plugin dashboard** — runs locally via `kubectl tns-csi dashboard` (port 2137)\n- **Grafana dashboard** — pre-built Prometheus dashboard, enable with `grafana.dashboards.enabled: true`\n\nBoth web dashboards show volume health, Kubernetes binding, snapshots, clones, and metrics. See [METRICS.md](docs/METRICS.md) for setup details.\n\n### Protocol Selection Guide\n\nThis driver supports four storage protocols:\n\n- **NFS**: Best for shared file storage where multiple pods need concurrent access (ReadWriteMany)\n- **NVMe-oF**: Best for high-performance block storage with lowest latency and highest IOPS - ideal for databases and latency-sensitive workloads\n- **iSCSI**: Traditional block storage with broad compatibility - useful when NVMe-oF is not available or for environments already using iSCSI\n- **SMB/CIFS**: Authenticated file sharing with user-level access control - useful when you need Windows-compatible storage or per-user credentials\n\n## Features\n\n- **Dynamic volume provisioning** - Automatically create and delete storage volumes\n- **Multiple protocol support** - NFS and SMB for file storage, NVMe-oF and iSCSI for block storage\n- **Volume lifecycle management** - Full create, delete, attach, detach, mount, unmount operations\n- **Volume snapshots** - Create, delete, and restore from snapshots (all protocols)\n- **Volume cloning** - Create new volumes from existing snapshots\n- **Volume expansion** - Resize volumes dynamically (all protocols)\n- **Volume retention** - Optional `deleteStrategy: retain` to keep volumes on PVC deletion\n- **Volume adoption** - Automatically adopt orphaned volumes for GitOps and disaster recovery workflows (see [Adoption Guide](docs/ADOPTION.md))\n- **Configurable mount options** - Customize NFS/NVMe-oF/iSCSI/SMB mount options via StorageClass\n- **Configurable ZFS properties** - Set compression, dedup, recordsize, etc. via StorageClass parameters\n- **Access modes** - ReadWriteOnce (RWO), ReadWriteOncePod (RWOP), and ReadWriteMany (RWX) support\n- **Raw block RWX** - Block volumes with RWX access for KubeVirt live migration (NVMe-oF, iSCSI)\n- **Storage classes** - Flexible configuration via Kubernetes storage classes\n- **Connection resilience** - Automatic reconnection with exponential backoff for WebSocket API\n\n## kubectl Plugin\n\nThe project includes a kubectl plugin (`kubectl tns-csi`) for managing volumes directly from the command line:\n\n```bash\n# Install via krew (recommended)\nkubectl krew install tns-csi\n\n# Or download from GitHub releases\n```\n\n**Key Commands:**\n| Command | Description |\n|---------|-------------|\n| `kubectl tns-csi summary` | Dashboard overview of all resources |\n| `kubectl tns-csi list` | List all managed volumes |\n| `kubectl tns-csi list-snapshots` | List snapshots with source volumes |\n| `kubectl tns-csi health` | Check health of all volumes |\n| `kubectl tns-csi troubleshoot \u003cpvc\u003e` | Diagnose PVC issues |\n| `kubectl tns-csi cleanup` | Delete orphaned volumes |\n| `kubectl tns-csi dashboard` | Start web dashboard on http://localhost:2137 |\n\nThe plugin **auto-discovers credentials** from the installed driver, so it works out of the box on clusters with tns-csi installed.\n\nSee [kubectl Plugin Documentation](docs/KUBECTL-PLUGIN.md) for full details.\n\n## Kubernetes Distribution Compatibility\n\nThis driver is tested and verified to work on **6 Kubernetes distributions** with NFS, NVMe-oF, iSCSI, and SMB protocols:\n\n| Distribution | NFS | NVMe-oF | iSCSI | SMB | Description |\n|--------------|:---:|:-------:|:-----:|:---:|-------------|\n| K3s | ✅ | ✅ | ✅ | ✅ | Lightweight Kubernetes by Rancher |\n| K0s | ✅ | ✅ | ✅ | ✅ | Zero-friction Kubernetes by Mirantis |\n| KubeSolo | ✅ | ✅ | ✅ | ✅ | Single-node Kubernetes |\n| Minikube | ✅ | ✅ | ✅ | ✅ | Local Kubernetes for development |\n| Talos | ✅ | ✅ | ✅ | ✅ | Secure, immutable Kubernetes OS |\n| MicroK8s | ✅ | ✅ | ✅ | ✅ | Lightweight Kubernetes by Canonical |\n\nCompatibility tests run weekly and on-demand. See [Distro Compatibility Tests](docs/DISTRO-COMPATIBILITY.md) for details.\n\n**OpenShift** is also confirmed to work by community users. Set `openshift.enabled=true` in Helm values to create the required SecurityContextConstraints. See [DEPLOYMENT.md](docs/DEPLOYMENT.md#openshift) for details.\n\n## Prerequisites\n\n- Kubernetes 1.27+ (earlier versions may work but are not tested)\n- **TrueNAS Scale 25.10 or later** (required for full feature support including NVMe-oF)\n- For NFS: NFS client utilities on all nodes (`nfs-common` on Debian/Ubuntu, `nfs-utils` on RHEL/CentOS)\n- For NVMe-oF:\n  - TrueNAS Scale 25.10+\n  - **TrueNAS must have a static IP configured** (DHCP not supported for NVMe-oF)\n  - At least one NVMe-oF TCP port configured in TrueNAS (Shares \u003e NVMe-oF Targets \u003e Ports, default: 4420)\n  - `nvme-cli` package installed on all Kubernetes nodes\n  - Kernel modules: `nvme-tcp`, `nvme-fabrics`\n  - Network connectivity from Kubernetes nodes to TrueNAS on port 4420\n- For iSCSI:\n  - TrueNAS Scale 25.10+\n  - iSCSI service enabled in TrueNAS (System \u003e Services \u003e iSCSI)\n  - `open-iscsi` package installed on all Kubernetes nodes (`iscsid` service running)\n  - Network connectivity from Kubernetes nodes to TrueNAS on port 3260\n- For SMB:\n  - TrueNAS Scale 25.10+\n  - SMB service enabled in TrueNAS (System \u003e Services \u003e SMB)\n  - SMB user account created (Credentials \u003e Local Users)\n  - `cifs-utils` package installed on all Kubernetes nodes\n  - Kubernetes Secret with SMB credentials (username/password)\n  - Network connectivity from Kubernetes nodes to TrueNAS on port 445\n\n## Quick Start\n\nSee [DEPLOYMENT.md](docs/DEPLOYMENT.md) for detailed installation and configuration instructions.\n\n### Installation via Helm (Recommended)\n\nThe TNS CSI Driver is published to both Docker Hub and GitHub Container Registry as OCI artifacts:\n\n**Always use a specific version in production.** See [docs/VERSIONING.md](docs/VERSIONING.md) for details.\n\n#### Docker Hub (recommended)\n```bash\nhelm install tns-csi oci://registry-1.docker.io/bfenski/tns-csi-driver \\\n  --version 0.17.4 \\\n  --namespace kube-system \\\n  --create-namespace \\\n  --set truenas.url=\"wss://YOUR-TRUENAS-IP:443/api/current\" \\\n  --set truenas.apiKey=\"YOUR-API-KEY\" \\\n  --set storageClasses[0].name=tns-csi-nfs \\\n  --set storageClasses[0].enabled=true \\\n  --set storageClasses[0].protocol=nfs \\\n  --set storageClasses[0].pool=\"YOUR-POOL-NAME\" \\\n  --set storageClasses[0].server=\"YOUR-TRUENAS-IP\"\n```\n\n**NVMe-oF Example:**\n```bash\nhelm install tns-csi oci://registry-1.docker.io/bfenski/tns-csi-driver \\\n  --version 0.17.4 \\\n  --namespace kube-system \\\n  --create-namespace \\\n  --set truenas.url=\"wss://YOUR-TRUENAS-IP:443/api/current\" \\\n  --set truenas.apiKey=\"YOUR-API-KEY\" \\\n  --set storageClasses[0].name=tns-csi-nvmeof \\\n  --set storageClasses[0].enabled=true \\\n  --set storageClasses[0].protocol=nvmeof \\\n  --set storageClasses[0].pool=\"YOUR-POOL-NAME\" \\\n  --set storageClasses[0].server=\"YOUR-TRUENAS-IP\" \\\n  --set storageClasses[0].transport=tcp \\\n  --set storageClasses[0].port=4420\n```\n\n**Note:** NVMe-oF requires a TCP port to be pre-configured in TrueNAS (Shares \u003e NVMe-oF Targets \u003e Ports). Subsystems are automatically created per volume.\n\n**iSCSI Example:**\n```bash\nhelm install tns-csi oci://registry-1.docker.io/bfenski/tns-csi-driver \\\n  --version 0.17.4 \\\n  --namespace kube-system \\\n  --create-namespace \\\n  --set truenas.url=\"wss://YOUR-TRUENAS-IP:443/api/current\" \\\n  --set truenas.apiKey=\"YOUR-API-KEY\" \\\n  --set storageClasses[0].name=tns-csi-iscsi \\\n  --set storageClasses[0].enabled=true \\\n  --set storageClasses[0].protocol=iscsi \\\n  --set storageClasses[0].pool=\"YOUR-POOL-NAME\" \\\n  --set storageClasses[0].server=\"YOUR-TRUENAS-IP\"\n```\n\n**Note:** iSCSI requires the iSCSI service to be enabled in TrueNAS (System \u003e Services). Targets and extents are automatically created per volume.\n\n**SMB Example:**\n```bash\nhelm install tns-csi oci://registry-1.docker.io/bfenski/tns-csi-driver \\\n  --version 0.17.4 \\\n  --namespace kube-system \\\n  --create-namespace \\\n  --set truenas.url=\"wss://YOUR-TRUENAS-IP:443/api/current\" \\\n  --set truenas.apiKey=\"YOUR-API-KEY\" \\\n  --set storageClasses[0].name=tns-csi-smb \\\n  --set storageClasses[0].enabled=true \\\n  --set storageClasses[0].protocol=smb \\\n  --set storageClasses[0].pool=\"YOUR-POOL-NAME\" \\\n  --set storageClasses[0].server=\"YOUR-TRUENAS-IP\" \\\n  --set storageClasses[0].smbCredentialsSecret.name=smb-credentials \\\n  --set storageClasses[0].smbCredentialsSecret.namespace=kube-system\n```\n\n**Note:** SMB requires a credentials Secret and the SMB service enabled in TrueNAS. See [QUICKSTART-SMB.md](docs/QUICKSTART-SMB.md) for setup instructions.\n\nSee the [Helm chart README](charts/tns-csi-driver/README.md) for detailed configuration options.\n\n## Configuration\n\nThe driver is configured via command-line flags and Kubernetes secrets:\n\n### Command-Line Flags\n\n- `--endpoint` - CSI endpoint (default: `unix:///var/lib/kubelet/plugins/tns.csi.io/csi.sock`)\n- `--node-id` - Node identifier (typically the node name)\n- `--driver-name` - CSI driver name (default: `tns.csi.io`)\n- `--api-url` - TrueNAS API URL (e.g., `ws://YOUR-TRUENAS-IP/api/v2.0/websocket`)\n- `--api-key` - TrueNAS API key\n- `--max-concurrent-nvme-connects` - Maximum concurrent NVMe-oF connect operations per node (default: `5`)\n\n### Storage Class Parameters\n\n**NFS Volumes:**\n```yaml\nparameters:\n  protocol: nfs\n  server: YOUR-TRUENAS-IP\n  pool: tank\n  path: /mnt/tank/k8s\n```\n\n**NVMe-oF Volumes:**\n```yaml\nparameters:\n  protocol: nvmeof\n  server: YOUR-TRUENAS-IP\n  pool: tank\n  path: /mnt/tank/k8s/nvmeof\n  fsType: ext4  # or xfs\n```\n\n**Note:** Subsystems are automatically created per volume. Ensure an NVMe-oF TCP port is configured in TrueNAS (Shares \u003e NVMe-oF Targets \u003e Ports).\n\n## Testing\n\n**Comprehensive Testing on Real Infrastructure**\n\nThis driver is tested extensively using **real hardware and software** - not mocks or simulators:\n\n- **Self-hosted GitHub Actions runner** on dedicated OVH infrastructure\n- **Real Kubernetes cluster** (k3s) provisioned for each test run\n- **Real TrueNAS Scale server** with actual storage pools and network services on dedicated sponsored by Akamai/Linode infrastructure\n- **Full protocol stack testing** - NFS mounts, NVMe-oF connections, actual I/O operations\n\n### Automated Test Suite\n\nEvery commit triggers comprehensive integration tests:\n\n**Core Functionality Tests:**\n- Basic volume provisioning and deletion (NFS, NVMe-oF, iSCSI \u0026 SMB)\n- Volume expansion (dynamic resizing)\n- Snapshot creation and restoration\n- Volume cloning from snapshots\n- Volume adoption (GitOps workflows)\n- StatefulSet volume management\n- Data persistence across pod restarts\n\n**Stress \u0026 Reliability Tests:**\n- Concurrent volume creation (5 simultaneous volumes)\n- Connection resilience (WebSocket reconnection)\n- Orphaned resource detection and cleanup\n\n**CSI Specification Compliance:**\n- Passes [Kubernetes CSI sanity tests](https://github.com/kubernetes-csi/csi-test) (v5.4.0)\n- Full CSI spec compliance verified\n\nView test results and history: [![Test Dashboard](https://img.shields.io/badge/Test%20Dashboard-View-blue)](https://fenio.github.io/tns-csi/dashboard/)\n\n## Project Status and Limitations\n\n**⚠️ EARLY DEVELOPMENT - NOT PRODUCTION READY**\n\nThis driver is in early development and requires extensive testing before production use. Key considerations:\n\n- **Development Phase**: Active development with ongoing testing and validation\n- **Protocol Support**: Currently supports NFS, NVMe-oF, iSCSI, and SMB.\n- **Volume Expansion**: Implemented and functional for all protocols when `allowVolumeExpansion: true` is set in the StorageClass (Helm chart enables this by default)\n- **Snapshots**: Implemented for all protocols, functional and tested\n- **Testing**: Comprehensive automated testing on real infrastructure (see Testing section above)\n- **Stability**: Core features functional but may have undiscovered edge cases or bugs\n\n**Recommended Use**: Development, testing, and evaluation environments only. Use at your own risk.\n\n## Troubleshooting\n\nSee [DEPLOYMENT.md](docs/DEPLOYMENT.md#troubleshooting) for detailed troubleshooting steps.\n\n**Common Issues:**\n\n1. **Pods stuck in ContainerCreating**:\n   - For NFS: Check that NFS client utilities are installed on nodes\n   - For NVMe-oF: Check that nvme-cli is installed and kernel modules are loaded\n   - For SMB: Check that cifs-utils is installed and credentials Secret exists\n2. **Failed to create volume**: Verify storage API credentials and network connectivity\n3. **Mount failed**:\n   - For NFS: Ensure NFS service is running on TrueNAS and accessible from nodes\n   - For NVMe-oF: Ensure NVMe-oF service is enabled and firewall allows port 4420\n   - For SMB: Ensure SMB service is running and firewall allows port 445\n\n**View Logs:**\n\n```bash\n# Controller logs\nkubectl logs -n kube-system -l app.kubernetes.io/name=tns-csi-driver,app.kubernetes.io/component=controller\n\n# Node logs\nkubectl logs -n kube-system -l app.kubernetes.io/name=tns-csi-driver,app.kubernetes.io/component=node\n\n# Check version\nkubectl logs -n kube-system deployment/tns-csi-controller 2\u003e\u00261 | head -1\n```\n\n## Documentation\n\n- [Features Documentation](docs/FEATURES.md) - Comprehensive feature support reference\n- [Deployment Guide](docs/DEPLOYMENT.md) - Detailed installation and configuration\n- [kubectl Plugin](docs/KUBECTL-PLUGIN.md) - Command-line tool for volume management\n- [Quick Start - NFS](docs/QUICKSTART.md) - Get started with NFS volumes\n- [Quick Start - NVMe-oF](docs/QUICKSTART-NVMEOF.md) - Get started with NVMe-oF volumes\n- [Quick Start - iSCSI](docs/QUICKSTART-ISCSI.md) - Get started with iSCSI volumes\n- [Quick Start - SMB](docs/QUICKSTART-SMB.md) - Get started with SMB volumes\n- [Snapshots Guide](docs/SNAPSHOTS.md) - Volume snapshots and cloning\n- [Versioning](docs/VERSIONING.md) - Version management and checking installed version\n- [Distro Compatibility](docs/DISTRO-COMPATIBILITY.md) - Kubernetes distribution compatibility testing\n- [Metrics Guide](docs/METRICS.md) - Prometheus metrics and monitoring\n- [Kind Setup](docs/KIND.md) - Local development with Kind\n- [Comparison with truenas-csi](docs/COMPARISON-TRUENAS-CSI.md) - vs official TrueNAS CSI driver\n- [Comparison with Democratic-CSI](docs/COMPARISON-DEMOCRATIC-CSI.md) - vs democratic-csi\n\n## Volume Adoption\n\nThe driver supports **cross-cluster volume adoption** - importing existing tns-csi managed volumes into a new Kubernetes cluster. This is useful for:\n- Disaster recovery scenarios\n- Cluster migrations\n- Re-importing retained volumes after upgrades\n\nVolumes are adoptable if they have proper `tns-csi:*` ZFS user properties set. See [Volume Adoption](docs/FEATURES.md#volume-adoption-cross-cluster) in the Features documentation for details.\n\n## Development\n\n### Prerequisites\n\n- Go 1.21+\n- Docker (for building images)\n- Kubernetes cluster for testing\n\n### Building\n\n```bash\nmake build\n```\n\n### Testing\n\nTests are automated via GitHub Actions CI/CD running on self-hosted infrastructure with real TrueNAS hardware. See `.github/workflows/` for workflow configuration.\n\n**Local Testing:**\n```bash\n# Run unit tests\nmake test\n\n# Run specific test\ngo test -v ./pkg/driver/...\n\n# Run CSI sanity tests (requires TrueNAS connection)\ncd tests/sanity \u0026\u0026 ./test-sanity.sh\n\n# Run Ginkgo E2E tests (requires TrueNAS and Kubernetes cluster)\nginkgo -v --timeout=25m ./tests/e2e/nfs/...\nginkgo -v --timeout=40m ./tests/e2e/nvmeof/...\nginkgo -v --timeout=40m ./tests/e2e/iscsi/...\nginkgo -v --timeout=55m ./tests/e2e/smb/...\n```\n\nSee [docs/TESTING.md](docs/TESTING.md) for comprehensive testing documentation.\n\n### Building Container Image\n\n```bash\nmake docker-build\n```\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0 (GPL-3.0) - see the LICENSE file for details.\n\n## Acknowledgments\n\n- [Akamai/Linode](https://www.linode.com/) — for providing infrastructure credits that power the TrueNAS test server\n- This driver is designed to work with [TrueNAS Scale](https://www.truenas.com/truenas-scale/) 25.10+\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffenio%2Ftns-csi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffenio%2Ftns-csi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffenio%2Ftns-csi/lists"}