Kubernetes بدون storage پایدار یعنی هر Pod restart = از دست رفتن داده. روی cloud، EBS/PD/Azure Disk هست؛ روی bare-metal یا multi-cloud، تیمها اغلب میمانند بین:
NFS تکنقطه شکست
آرایه SAN گران و غیرقابلحمل
Ceph قدرتمند اما سنگین برای cluster کوچک/متوسطLonghorn پاسخ Rancher (حالا SUSE) است:
Cloud native distributed block storage for Kubernetes — Easy to use, 100% open source, run anywhere.
یعنی block storage با replication داخل خود cluster — بدون SAN خارجی، بدون license open-core.
CNCF Incubating Project. آخرین docs پایدار: v1.12.1.
مشکل persistent storage روی Kubernetes
local PV:
سریع — بدون HA؛ node down = data risk
cloud disk CSI:
HA در cloud — vendor lock، هزینه، latency بین AZ
external NFS:
ساده — SPOF، performance محدود
Longhorn:
PVC استاندارد → volume با N replica روی nodeهای مختلف
UI + snapshot + backup به S3| معیار | local-path | NFS | Ceph RBD | Longhorn |
|---|---|---|---|---|
| نوع | local disk | file | block | block |
| HA / replica | ❌ | وابسته به backend | ✅ | ✅ sync replica |
| نصب | خیلی ساده | متوسط | سنگین | ساده (Helm) |
| UI مدیریت | ❌ | ❌ | داشبورد جدا | ✅ built-in |
| Backup خارجی | دستی | دستی | پیچیده | S3 / NFS native |
| مناسب | lab | shared file | large scale | small–mid K8s |
| CNCF | — | — | — | ✅ Incubating |
Longhorn برای block (RWO) طراحی شده — دیتابیس، stateful app، VM disk. برای shared filesystem چند-writer همزمان، CubeFS یا NFS/CephFS مناسبتر است.
Longhorn چیست؟
Longhorn سیستم distributed block storage سبک برای Kubernetes است که:
- هر volume را با controller اختصاصی (Engine) و چند Replica همگام نگه میدارد
- همه چیز را بهصورت microservices داخل cluster اجرا میکند
- از CSI برای PVC/PV استاندارد استفاده میکند
- snapshot افزایشی و backup به S3-compatible یا NFS دارد
- Disaster Recovery volume بین clusterها میسازد
- با UI مدیریت volume، disk، node، backup را ساده میکند
- upgrade بدون قطع کامل IO را هدف میگیرد
Repo: github.com/longhorn/longhorn
Originally: Rancher Labs → CNCF
License: Apache 2.0
معماری: Control Plane و Data Plane
طبق Concepts:
Pod (workload)
│ CSI mount
▼
Longhorn Engine ← روی همان node که Pod attach شده
│ sync write
├── Replica A (node-1 disk)
├── Replica B (node-2 disk)
└── Replica C (node-3 disk)
Longhorn Manager (DaemonSet روی هر node)
└── CR volumes / engines / replicas + API برای UI و CSILonghorn Manager (control plane)
- DaemonSet روی هر node
- الگوی Kubernetes controller / operator
- ساخت Volume CR، Engine، Replica
- پاسخ به CSI plugin و Longhorn UI
Longhorn Engine (data plane)
- یک Engine per volume — failure یک controller فقط همان volume را میزند
- همیشه روی nodeی که volume به آن attach است اجرا میشود
- write را synchronous به همه replicaهای سالم میفرستد
- با
Nreplica، تحمل تاN−1شکست replica (حداقل یک replica سالم لازم است)
Replicas
- هر replica روی node/disk جدا ترجیح دارد
- داده بهصورت thin provisioned (sparse files در V1)
- chain از snapshotها = حالت فعلی volume
CSI Driver / Plugin
PVC → csi-provisioner → Longhorn Manager → Volume CR
Pod schedule → csi-attacher → Engine on node
kubelet → CSI node plugin → format/mount → Podقابلیتهای CSI: create، delete، attach، detach، mount، snapshot. بقیه قابلیتها (backup target، recurring، DR، disk management) عمدتاً از Longhorn UI/API.
Longhorn UI
داشبورد برای:
- volumes و replicas
- snapshots / backups
- nodes و disks (space usage)
- settings و recurring jobs
V1 vs V2 Data Engine
| V1 (default) | V2 (SPDK) | |
|---|---|---|
| Backend | iSCSI + Linux sparse files | SPDK bdev / RAID |
| هدف | پایداری، سازگاری گسترده | latency کمتر، IOPS/throughput بالاتر |
| پیشنیاز | open-iscsi / iscsiadm | hugepages، vfio_pci، uio_pci_generic، nvme_tcp / ublk |
| دیسک | filesystem path روی node | raw block disks (NVMe توصیه) |
| وضعیت | production پیشفرض | performance path — طبق release notes ارزیابی کنید |
فعالسازی V2 (پس از نصب و آمادهسازی node):
kubectl patch settings.longhorn.io v2-data-engine \
-n longhorn-system \
--type merge \
-p '{"value":"true"}'StorageClass با V2:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-v2
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Delete
parameters:
numberOfReplicas: "3"
dataEngine: "v2"Preflight با SPDK:
longhornctl --kubeconfig ~/.kube/config \
--image longhornio/longhorn-cli:v1.12.1 \
install preflight --enable-spdkبرای workload حیاتی، مگر validation کامل روی نسخه خودتان، V1 مسیر امنتر است.
Snapshot، Backup، Disaster Recovery
Snapshot (primary / داخل cluster)
- Point-in-time روی replicaها
- زنجیره differencing disk (مثل لایههای image)
- read index برای پیدا کردن آخرین داده هر 4K block
- حداکثر حدود ۲۵۴ snapshot per volume (محدودیت اندازه read index)
- CSI VolumeSnapshot از v1.3 میتواند snapshot یا backup بسازد
Backup (secondary storage)
Backup به Backupstore خارج cluster:
- S3-compatible (AWS S3، MinIO، …)
- NFS
بر اساس change block detection — incremental و کارآمدتر از کپی کامل هر بار.
Snapshot (local) → سریع، وابسته به cluster
Backup (S3/NFS) → محافظت در برابر از دست رفتن کل clusterRecurring jobs
زمانبندی snapshot و backup از UI یا CR:
apiVersion: longhorn.io/v1beta2
kind: RecurringJob
metadata:
name: backup-daily
namespace: longhorn-system
spec:
cron: "0 2 * * *"
task: backup
groups:
- default
retain: 7
concurrency: 2PVC را با label به group وصل کنید تا job اعمال شود.
Disaster Recovery (DR) Volume
Longhorn میتواند از backupstore یک DR volume در cluster دیگر بسازد:
- replication خارجی کل datastore را از صفر بازسازی نمیکند
- granularity در سطح volume
- در حادثه: failover با RPO/RTO تعریفشده
این برای multi-cluster DR سبکتر از «بازسازی کامل SAN» است.
Thin provisioning و اندازه volume
- Volume فقط فضای مصرفشده واقعی را روی دیسک میگیرد (مثلاً PVC ۲۰GB با ۱GB داده ≈ ۱GB روی disk × replica count)
- Shrink خودکار بعد از delete فایل در filesystem نیست — Longhorn سطح block است، نه FS؛ حذف فایل داخل ext4 لزوماً space روی sparse را آزاد نمیکند مگر عملیات خاص (trim و غیره در محدودیتهای نسخه)
Volume expansion از StorageClass با allowVolumeExpansion: true پشتیبانی میشود.
نصب
پیشنیاز عمومی
- Kubernetes (نسخه پشتیبانیشده در docs همان release)
- هر worker: فضای دیسک کافی، open-iscsi برای V1
- شبکه پایدار بین nodeها (replication sync حساس به latency)
- Privileged pods / مناسب برای storage CSI
Helm (توصیهشده)
helm repo add longhorn https://charts.longhorn.io
helm repo update
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--version 1.12.1
kubectl -n longhorn-system get podkubectl manifest
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.12.1/deploy/longhorn.yamlدسترسی به UI
kubectl -n longhorn-system get svc
# longhorn-frontend — معمولاً ClusterIP
kubectl -n longhorn-system port-forward svc/longhorn-frontend 8080:80
# باز کردن http://localhost:8080در production: Ingress + TLS با cert-manager و auth مناسب — UI را بدون محافظت expose نکنید.
استفاده روزمره: StorageClass و PVC
StorageClass پیشفرض
پس از نصب معمولاً longhorn ساخته میشود:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: Immediate
parameters:
numberOfReplicas: "3"
staleReplicaTimeout: "30"
fromBackup: ""
fsType: "ext4"
dataLocality: "disabled" # یا best-effort / strict-localPVC + Pod
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql-dataReadWriteOnce — یک node writer در زمان. برای چند Pod writer همزمان روی یک PVC، Longhorn مدل file RWX عمومی (مثل NFS) نیست؛ از RWX مبتنی بر share manager در سناریوهای خاص پشتیبانی دارد اما use-case اصلی block RWO است.
Volume CR مستقیم
kubectl get volumes.longhorn.io -n longhorn-system
kubectl describe volume.longhorn.io <name> -n longhorn-systemتنظیمات مهم production
| Setting | معنی |
|---|---|
| Default Replica Count | معمولاً ۳ برای HA |
| Backup Target | s3://bucket@region/ یا nfs://server:/path |
| Storage Over Provisioning | درصد مجاز thin overcommit |
| Replica Auto Balance | توزیع مجدد replicaها |
| Data Locality | تلاش برای نگه داشتن replica روی همان node Pod |
| Node Drain Policy | رفتار هنگام drain |
| Guaranteed Engine/Replica Manager CPU | جلوگیری از starvation |
Backup target مثال (S3)
در UI یا Settings:
s3://my-backups@us-east-1/Secret با access key در longhorn-system. برای MinIO endpoint سفارشی، پارامترهای S3 در docs همان نسخه را دنبال کنید.
Disk و Node
- چند disk per node از UI قابل تعریف است
- node/disk را میتوان disable / eviction کرد برای maintenance
- tag برای placement (مثلاً
ssd,nvme)
Rebuild و failure
Replica fail (disk/node down)
→ Engine با replicaهای سالم ادامه میدهد
→ Manager replica جدید میسازد
→ sync از healthy replicas
→ volume به replica count هدف برمیگردداگر همه replicaهای یک volume از دست بروند و backup نباشد — data loss. برای همین:
numberOfReplicas ≥ 3در production- backup دورهای به S3/NFS
- antiaffinity واقعی (replicas روی nodeهای جدا)
مقایسه: Longhorn در کجای stack storage؟
| نیاز | انتخاب |
|---|---|
| Block RWO برای DB روی bare-metal K8s | Longhorn |
| Shared POSIX/S3 در مقیاس PB | CubeFS |
| SDS کامل با Ceph | Rook/Ceph — ops سنگینتر |
| Cloud managed disk | EBS/PD/Azure Disk CSI |
| فقط lab بدون HA | local-path provisioner |
Longhorn جایگزین object store یا data lake نیست — block برای stateful workloads داخل Kubernetes است.
Observability و troubleshooting
kubectl -n longhorn-system get pod
kubectl -n longhorn-system get volumes.longhorn.io
kubectl -n longhorn-system logs -l app=longhorn-manager --tail=100
# PVC events
kubectl describe pvc mysql-dataمشکلات رایج:
| علامت | بررسی |
|---|---|
| PVC Pending | CSI pods، StorageClass، disk space روی nodes |
| Attach fail | Engine/replica unhealthy، node taint، iscsi |
| Degraded volume | replica rebuild در UI؛ disk full؟ |
| Slow IO | network بین nodes؛ disk نوع HDD؛ CPU throttle |
| Backup fail | backup target credentials، network به S3 |
Metrics: Longhorn و instance managerها Prometheus metrics دارند — latency، rebuild، space.
شبکه پایدار مهم است — CNI مثل Cilium و latency بین node روی sync write اثر مستقیم دارد.
امنیت
- UI را پشت auth / SSO / network policy بگذارید
- Backup bucket با encryption و IAM محدود
- RBAC Kubernetes روی PVC و Longhorn CRها
- Volume encryption (طبق قابلیت نسخه — تنظیمات encrypt در docs)
- جدا کردن disk Longhorn از OS disk وقتی ممکن است
- NetworkPolicy برای محدود کردن longhorn-system
State خود Longhorn CRها در etcd است — backup etcd control plane را فراموش نکنید؛ backup volume داده جدا از backup etcd است.
ارتباط با stack شما
StatefulSet / Deployment
└── PVC (Longhorn CSI)
├── Engine + Replicas روی worker disks
└── Backup → S3 / NFS
Cluster foundation
├── [etcd](/blog/etcd-distributed-key-value-store-guide/) — CRD state
├── CRI ([containerd](/blog/containerd-container-runtime-guide/))
├── CNI ([Cilium](/blog/cilium-ebpf-kubernetes-networking/))
└── [CoreDNS](/blog/coredns-kubernetes-dns-guide/)
Ops
├── [Argo CD](/blog/argo-project-kubernetes-gitops-cicd/) — deploy Longhorn + apps
├── [cert-manager](/blog/cert-manager-kubernetes-tls-certificates/) — TLS برای UI/Ingress
└── [Crossplane](/blog/crossplane-kubernetes-control-plane-guide/) — optional: provision backup bucketبرای VM روی Kubernetes (KubeVirt)، Longhorn اغلب بهعنوان backend disk volume استفاده میشود.
Best practices
- حداقل ۳ node با disk جدا برای replica
numberOfReplicas: 3برای production- Backup target از روز اول — نه بعد از حادثه
- Recurring backup + retain سیاست مشخص
- Monitor disk usage قبل از ۹۰٪ — rebuild به space نیاز دارد
- Data locality را آگاهانه انتخاب کنید (عملکرد vs توزیع)
- Drain با سیاست Longhorn — نه فقط
kubectl drainکور - V1 برای critical path تا V2 را با workload واقعی تست کنید
- جدا کردن OS و data disk روی nodeها
- تست restore از backup — backup بدون restore تستشده بیفایده است
چه زمانی Longhorn؟
✅ استفاده کنید
- Kubernetes روی bare-metal / edge / homelab با نیاز HA block
- StatefulSets: MySQL، PostgreSQL، Redis (با درک RWO)
- نیاز به snapshot/backup ساده بدون تیم Ceph
- DR بین دو cluster با backupstore مشترک
- تیمهایی که UI و سادگی ops میخواهند
⚠️ شاید نه
- هزاران volume با IOPS بسیار بالا بدون sizing درست → ممکن است Ceph/cloud disk بهتر باشد
- نیاز RWX file سنگین برای AI dataset → CubeFS / NFS
- فقط یک node → replication معنی ندارد
- managed Kubernetes که cloud disk ارزان و کافی است
جمعبندی
| مفهوم | توضیح |
|---|---|
| Longhorn | cloud-native distributed block storage برای K8s |
| Engine | controller per volume — data plane |
| Replica | کپی همگام روی node/diskهای جدا |
| CSI | PVC استاندارد Kubernetes |
| Snapshot | محلی، زنجیرهای، افزایشی |
| Backup | S3 یا NFS خارج cluster |
| DR Volume | failover بین clusterها |
| V1 / V2 | iSCSI+sparse vs SPDK performance |
| CNCF | Incubating — اصل از Rancher |
Longhorn فاصله بین «PVC بدون HA» و «Ceph سنگین» را پر میکند: block storage واقعی، replicateشده، قابل backup، با UI — داخل همان Kubernetes که اپ را اجرا میکنید.
قدم بعدی
- سه node با disk آزاد +
open-iscsi helm install longhornنسخه ۱.۱۲.x- یک PVC تست + Pod write/read
- Backup target به MinIO/S3 وصل کنید و یک backup بگیرید
- Restore را در namespace دیگر تمرین کنید
- (اختیاری) V2 را روی node آزمایشی با NVMe ارزیابی کنید
دوره رایگان: Longhorn Basics از سایت پروژه.
منابع
- Longhorn — longhorn.io
- Documentation v1.12.1
- Architecture & Concepts
- Install with Helm
- GitHub — longhorn/longhorn
- CNCF Longhorn
منتشر شده در P30Light — بخش زیرساخت و سرور.