Pod ephemeral است؛ دیسک داخل container با مرگ Pod میمیرد. برای داده پایدار، کوبرنتیز مدل PersistentVolume را دارد و امروز تقریباً همهٔ provisioning پویا از مسیر CSI (Container Storage Interface) میگذرد.
طبق مستندات Volumes، انواع volume زیادند؛ اما برای production مدرن، تمرکز روی CSI + StorageClass است — نه hostPath یا درایورهای in-tree منسوخ.
این مقاله deep dive همهٔ گزینههای مهم CSI، تفاوتها و use caseهاست — با لینک به Longhorn و CubeFS.
CSI چیست؟
CSI قرارداد استاندارد بین Kubernetes و سیستمهای storage است (مشابه نقش CNI برای شبکه — مقاله CNI).
| قبل (in-tree) | بعد (CSI) |
|---|---|
| درایور داخل کد Kubernetes | درایور out-of-tree بهصورت sidecar/controller |
| ارتقا storage = ارتقا K8s | درایور جدا، نسخه مستقل |
| محدود به vendorهای داخل tree | هر vendor میتواند CSI بنویسد |
اجزای رایج یک درایور CSI:
CSI Controller (provision / snapshot / expand)
CSI Node plugin (mount / stage روی نود)
External-provisioner / attacher / resizer / snapshotter (sidecars)بدون CSI سازگار، StorageClass پویا و قابلیتهایی مثل VolumeSnapshot کار نمیکنند (یا ناقصاند).
مدل ذهنی: PVC · PV · StorageClass
Developer:
PersistentVolumeClaim (درخواست: ۱۰Gi، RWO، کلاس X)
│
▼ dynamic provisioning
StorageClass → CSI Driver → PersistentVolume
│
▼
Pod.spec.volumes.persistentVolumeClaim| شیء | نقش |
|---|---|
| StorageClass | «چه نوع دیسکی بساز» — provisioner، پارامترها، reclaim، binding |
| PVC | درخواست مصرفکننده |
| PV | حجم واقعی provisionشده (یا دستی) |
| VolumeSnapshotClass / VolumeSnapshot | نقطه زمانی (اگر درایور پشتیبانی کند) |
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: ebs.csi.aws.com # یا driver.longhorn.io و ...
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Delete
parameters:
type: gp3apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: fast-ssd
resources:
requests:
storage: 20GiAccess Modes و نوع داده — قبل از انتخاب برند
| Mode | معنی | مناسب |
|---|---|---|
| ReadWriteOnce (RWO) | یک نود read-write | دیتابیس، اکثر block |
| ReadWriteMany (RWX) | چند نود همزمان RW | اشتراک فایل، CMS، بعضی AI datasets |
| ReadOnlyMany (ROX) | چند نود read-only | محتوا ثابت |
| ReadWriteOncePod | فقط یک Pod | قفل سختگیرانهتر |
| نوع | مثال CSI | نکته |
|---|---|---|
| Block | EBS، Longhorn، Ceph RBD، Mayastor | معمولاً RWO؛ بهترین برای DB |
| Filesystem اشتراکی | EFS، Azure Files، CephFS، NFS CSI | RWX؛ latency برای DB اغلب نامناسب |
| Object | CubeFS، Ceph RGW، S3 | گاهی خارج از PVC کلاسیک؛ API شیء |
قانون طلایی: PostgreSQL/MySQL روی EFS/NFS معمولاً اشتباه است؛ برای اشتراک چندwriter به RWX واقعی نیاز دارید نه «چند Pod روی یک RWO».
قابلیتهای CSI که همه ندارند
| قابلیت | معنی | چک کنید |
|---|---|---|
| Dynamic provisioning | PVC → ساخت خودکار PV | پایه تقریباً همه |
| Volume expansion | بزرگ کردن PVC آنلاین/آفلاین | allowVolumeExpansion |
| Snapshot | VolumeSnapshot API | snapshot-controller + درایور |
| Clone | PVC از PVC دیگر | |
| Topology / WaitForFirstConsumer | دیسک در zone همان نود Pod | حیاتی در cloud |
| Raw block | volumeMode: Block | بعضی DBها/VMها |
| RWX | اشتراک چندنود | Longhorn کلاسیک ضعیف/محدود؛ CephFS/NFS/EFS قویتر |
جدول مقایسه کلان
| راهحل | نوع | RWO | RWX | پیچیدگی | HA داخلی | بهترین fit |
|---|---|---|---|---|---|---|
| AWS EBS CSI | Block ابری | ✅ | ❌ | کم | AZ-level ابری | EKS دیتابیس |
| AWS EFS CSI | File ابری | ✅ | ✅ | کم | ابری | اشتراک فایل روی AWS |
| GCE PD CSI | Block | ✅ | ❌ | کم | ابری | GKE |
| Filestore CSI | File | ✅ | ✅ | کم | ابری | اشتراک روی GCP |
| Azure Disk CSI | Block | ✅ | ❌ | کم | ابری | AKS |
| Azure Files CSI | File | ✅ | ✅ | کم | ابری | RWX روی Azure |
| Longhorn | Block توزیعشده | ✅ | محدود/با NFS | کم–متوسط | replica روی نودها | K8s/K3s خودمیزبان |
| Rook-Ceph | Block+FS+Object | ✅ RBD | ✅ CephFS | بالا | Ceph | پلتفرم storage کامل |
| OpenEBS Mayastor | Block NVMe-oF | ✅ | ❌ | متوسط | replica | DB حساس به latency |
| OpenEBS LocalPV | Local | ✅ | ❌ | کم | ❌ (اپ باید replicate کند) | کش، DB با replication خودش |
| Portworx | Block (+enterprise) | ✅ | ✅ (ویژگیها) | متوسط–تجاری | بله | regulated / پشتیبانی تجاری |
| CubeFS | توزیعشده + object | وابسته | بله در مدل FS | متوسط–بالا | بله | cloud-native مقیاس بزرگ |
| NFS CSI | File به NFS خارجی | ✅ | ✅ | کم | وابسته به NFS سرور | NAS موجود |
| local-path / hostpath-csi | دیسک نود | ✅ | ❌ | خیلی کم | ❌ | K3s lab |
| Gluster CSI | توزیعشده file | ✅ | ✅ | بالا | بله | میراث؛ کمتر greenfield |
Deep Dive هر خانواده
۱. CSIهای ابری (مدیریتشده)
AWS EBS / GCE Persistent Disk / Azure Disk
- Block با IOPS قابل تنظیم (مثلاً gp3)
- تقریباً همیشه RWO و مقید به zone
volumeBindingMode: WaitForFirstConsumerالزامی در عمل
AWS EFS / Azure Files / Filestore
- RWX برای چند Pod روی چند نود
- عالی برای محتوا اشتراکی؛ ضعیف برای OLTP DB
Use case: cluster روی همان cloud — اول درایور رسمی provider، مگر نیاز replication بیننودی خارج از مدل ابری داشته باشید.
۲. Longhorn — block ساده برای Kubernetes
- CNCF Graduated
- volume بهصورت replica روی دیسک نودها
- UI داخلی، backup به S3/NFS
- نصب نسبتاً آسان (اغلب Helm)
- مناسب ۳–۲۰ نود؛ تیم K8s بدون تخصص Ceph
جزئیات: مقاله Longhorn.
Use case: bare metal / K3s / on-prem که EBS ندارید و میخواهید PVC replicated.
۳. Rook + Ceph — پلتفرم storage
- Rook = Operator؛ Ceph = موتور
- RBD (block)، CephFS (RWX)، RGW (S3)
- مقیاس petabyte-class؛ ops سنگین (OSD، CRUSH، mon، …)
- CNCF / اکوسیستم بسیار بالغ
Use case: یک مجموعه دیسک برای block + file + object؛ تیم storage دارید؛ خوشه بزرگ پایدار.
۴. OpenEBS — چند موتور
| موتور | نقش |
|---|---|
| Mayastor (Replicated PV) | NVMe-oF، latency پایین برای DB |
| LocalPV (hostpath/LVM/ZFS) | سریع، بدون replication — اپ باید HA باشد |
Use case: Mayastor وقتی IOPS/latency سخت است؛ LocalPV برای Redis/Kafka که خودشان replicate میکنند یا داده دورریختنی.
۵. Portworx
- تجاری، پشتیبانی enterprise، ابزار مهاجرت چندابری
- وقتی قرارداد پشتیبانی/compliance ارزش license دارد
۶. CubeFS
- فایل و شیء cloud-native در مقیاس
- وقتی الگوی دسترسی فراتر از یک PVC ساده block است
مقاله: CubeFS.
۷. NFS CSI (csi-driver-nfs و مشابه)
- به یک NFS server موجود وصل میشود
- RWX آسان اگر NAS دارید
- SPOF = خود NFS مگر NAS HA باشد
Use case: سازمان با NetApp/TrueNAS؛ بدون ساخت Ceph.
۸. local-path / Hostpath CSI
- پیشفرض ساده K3s (
local-path) - داده روی همان نود؛ با رفتن Pod به نود دیگر داده «نمیآید» مگر sticky / replica اپ
Use case: lab، CI، توسعه؛ نه HA production بدون آگاهی.
۹. Gluster و میراث
- زمانی محبوب برای RWX
- امروز معمولاً CephFS / NFS / EFS جایگزین greenfield میشوند
VolumeSnapshot و DR
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: db-snap
spec:
volumeSnapshotClassName: csi-snapclass
source:
persistentVolumeClaimName: db-dataپیشنیازها:
- snapshot-controller در cluster
- CSI driver با capability snapshot
- VolumeSnapshotClass
Backup کامل اپ اغلب Velero (+ snapshot یا restic/kopia) است — فقط snapshot دیسک کافی نیست (ترتیب، چند PVC، DB consistency).
Topology، Expansion، Binding
| فیلد / الگو | چرا مهم است |
|---|---|
| WaitForFirstConsumer | جلوگیری از PV در zone بدون Pod |
| Immediate | فوری؛ خطر mismatch zone |
| allowVolumeExpansion: true | رشد PVC؛ بعضی فایلسیستمها نیاز به Pod restart دارند |
| reclaimPolicy: Retain | حفظ دیسک بعد از حذف PVC — امنتر برای prod حساس |
| Delete | پاکسازی خودکار — مناسب ephemeral env |
درخت تصمیم
روی AWS/GCP/Azure؟
├─ فقط یک Pod/نود writer (DB)؟ → Disk/EBS/PD CSI
└─ چند نود اشتراک فایل؟ → EFS / Azure Files / Filestore
Bare metal / VPS / K3s؟
├─ فقط lab؟ → local-path
├─ PVC replicated ساده + UI؟ → Longhorn
├─ latency شدید NVMe؟ → OpenEBS Mayastor
├─ Block + CephFS + S3 یکجا؟ → Rook-Ceph
├─ NAS از قبل دارید؟ → NFS CSI
└─ object/file مقیاس ابری؟ → CubeFS / Ceph RGW
اپ خودش replicate میکند (Cassandra، Raft، …)؟
→ LocalPV اغلب درستتر از double-replication استCSI در برابر «دیسک داخل Pod» و emptyDir
| روش | پایدار بعد از حذف Pod؟ | استفاده |
|---|---|---|
| emptyDir | خیر (با عمر Pod) | کش، scratch |
| hostPath | روی آن نود بله؛ portable خیر | جلوگیری در prod |
| PVC + CSI | بله (طبق reclaim) | حالت استاندارد |
ارتباط با بقیه stack
App Pod
└── PVC
└── StorageClass → CSI Driver
├── Cloud disk/file
├── Longhorn / Ceph / Mayastor
└── NFS / local-path
Backup: VolumeSnapshot + Velero
Registry لایههای ایمیج: Harbor (جدا از PVC اپ)
شبکه نود: CNI جداستروی K3s میتوانید local-path را با Longhorn عوض/مکمل کنید — مقاله K3s.
اشتباهات رایج
| اشتباه | واقعیت |
|---|---|
| DB روی RWX فیلهسیستم با latency بالا | فساد/کندی؛ RWO block بخواهید |
| دو CSI replicated روی هم برای یک DB replicated | double replication = درد و کندی |
| فرض snapshot برای همه درایورها | ماتریس قابلیت را بخوانید |
| Immediate binding در multi-AZ | Volume در zone اشتباه |
| local-path برای HA بدون podAntiAffinity درست | از دست رفتن داده با جابهجایی نود |
| فراموش کردن snapshot-controller | VolumeSnapshot Stuck |
Best practices
- برای هر کلاس کاری یک StorageClass واضح (
db-ssd,shared-nfs,scratch-local) - در cloud همیشه
WaitForFirstConsumerبرای block zone-attached Retainبرای دادههای غیرقابلجایگزین تا pipeline backup ثابت شود- قابلیت snapshot/expand را در POC تست کنید نه در حادثه
- منابع نود (دیسک، CPU، شبکه) را برای Longhorn/Ceph جدا مانیتور کنید
- mon/OSD Ceph را روی همان نودهای اپ شلوغ بدون طراحی نگذارید
- در GitOps، StorageClass را versioned نگه دارید؛ Secretهای CSI را امن
- قبل از حذف PVC در prod، snapshot یا backup بگیرید
- برای RWX فقط وقتی واقعاً چندwriter لازم است هزینه بپردازید
- ماتریس «درایور × قابلیت» داخلی تیم را document کنید
جمعبندی
| مفهوم | یک جمله |
|---|---|
| CSI | استاندارد پلاگین storage برای K8s |
| StorageClass | قالب provisioning |
| RWO vs RWX | تکنود writer در برابر اشتراک |
| Cloud CSI | ساده و سریع روی همان cloud |
| Longhorn | block replicated با ops سبک |
| Rook-Ceph | پلتفرم کامل؛ ops سنگین |
| Mayastor | عملکرد نزدیک NVMe |
| NFS / local-path | ساده؛ محدودیت HA/قابلیت |
مثل CNI، همه درایورهای جدی «دیسک به Pod میچسبانند». تفاوت در access mode، replication، عملیات، snapshot و هزینه تیمی است. کوتاهترین راهنما: cloud → CSI رسمی provider؛ on-prem ساده → Longhorn؛ پلتفرم چندپروتکل → Ceph؛ latency شدید → Mayastor؛ اشتراک فایل آماده → NFS/EFS.
قدم بعدی
kubectl get sc,pvc,pvو provisionerها را ببینید- یک PVC RWO با درایور فعلی بسازید و expand/snapshot را امتحان کنید
- اگر K3s/local-path دارید، POC Longhorn روی سه نود
- نیاز RWX را صریح بنویسید — قبل از انتخاب CephFS/NFS/EFS
- مقاله CNI را کنار این یکی بگذارید: شبکه و storage دو ستون جدا ولی همطراحی
منابع
- Volumes — Kubernetes
- Persistent Volumes
- Storage Classes
- Volume Snapshots
- CSI documentation
- Longhorn (مقاله P30Light)
- CubeFS (مقاله P30Light)
- CNI comparison (مقاله P30Light)
- K3s (مقاله P30Light)
منتشر شده در P30Light — بخش زیرساخت و سرور.