در دنیای کوبرنتیز، برای کار با دیسک‌های مانا و راحتی در ایجاد و استفاده‌ از آن‌ها از CSI استفاده می‌کنیم.

هنگامی که در ستون یک کلاستر جدید کوبرنتیز می‌سازید، به صورت پیشفرض، Sotoon Container Storage Interface (SotoonCSI) برای شما نصب و پیکربندی می‌شود. شما می‌توانید جزئیات SotoonCSI را در نیم‌اسپیس sotoon-csi مشاهده کنید.

kubectl get pods -n sotoon-csi
NAME                                            READY   STATUS              RESTARTS        AGE
sotoon-csi-controller-plugin-6ddbbbf4d8-qsqg4   7/7     Running             0               5s
sotoon-csi-node-plugin-2v9xb                    2/2     Running             0               5s
sotoon-csi-node-plugin-mzrc7                    0/2     Running             0               5s

نکته: از آنجایی که SotoonCSI به صورت یک DaemonSet بر روی کلاستر شما نصب می‌شود، روی هر ماشین worker، یک پاد از SotoonCSI وجود دارد و باید ریسورس کافی برای اجرا در آن نود برای پاد SotoonCSI وجود داشته باشد.

مزایای SotoonCSI

  • این CSI تحت مدیریت ستون است و عملیات نگهداری و به‌روزرسانی آن را تیم ستون به صورت خود‌کار برای کلاستر شما انجام می‌دهد.
  • می‌توان از PVها snapshot گرفت.
  • می‌توان از PVها clone گرفت.
  • به‌صورت پیش‌فرض، SotoonCSI از دیسک‌های تحت مدیریت Compute استفاده می‌کند و کاملا یکپارچه با compute شما صحبت می‌کند.
  • هزینه‌ی PVCهایی که می‌سازید به صورت pay as you go محاسبه می‌شوند.

مراحل استفاده از SotoonCSI

پیش‌نیاز

ساخت یک کلاستر کوبرنتیز: شما می‌توانید از طریق پنل، به راحتی یک کلاستر کوبرنیتز جدید بسازید.

پس از ساخت کلاستر، SotoonCSI به صورت خودکار بر روی کلاستر شما پیکربندی می‌شود. پیش از ادامه مسیر، مطمئن شوید که تمامی پاد‌های نیم‌اسپیس sotoon-csi در حالت ready و running هستند.

ساخت یک PVC

می‌توانید مانند مثال زیر، یک PVC بر روی کلاستر بسازید:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pod-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: remote-disk
  resources:
    requests:
      storage: 6Gi

دقت کنید که StorageClassای به نام remote-disk هنگام نصب ‌SotoonCSI برای شما ساخته می‌شود که می‌توانید از آن‌ برای مقدار دهی فیلد spec.storageCLassName در PVCهای خود استفاده کنید.

kubectl get storageclass remote-disk -o yaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: remote-disk
mountOptions:
- discard
parameters:
  csi.storage.k8s.io/fstype: ext4
  storage.sotoon.ir/storage-class: general-purpose
provisioner: csi.ske.ravh.ir
reclaimPolicy: Delete
volumeBindingMode: Immediate

در صورت نیاز می‌توانید به پشتیبانی ستون درخواست دهید تا storageClass: remote-disk به عنوان پیش‌فرض کلاستر شما تنظیم شود تا PVCها به صورت پیش‌فرض توسط SotoonCSI مدیریت شوند.

ساخت یک پاد برای استفاده از PVC

می‌توانید با ساخت پاد زیر، دیسکی را که پیشتر Provision کردید را مصرف کنید.

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
   - name: web-server
     image: nginx
     volumeMounts:
       - mountPath: /var/lib/www/html
         name: mypvc
  volumes:
   - name: mypvc
     persistentVolumeClaim:
       claimName: pod-pvc
       readOnly: false

پس از ساخت پاد، دیسک شما در پاد mount شده و می‌توانید داده‌های خود را در آن ذخیره کنید.

kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pod-pvc   Bound    pvc-c826fe52-f201-4be3-abd1-cd1fdf9fd0da   6Gi        RWO            remote-disk    5s
kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pvc-c826fe52-f201-4be3-abd1-cd1fdf9fd0da   6Gi        RWO            Delete           Bound    default/pod-pvc   remote-disk             5s

رده‌های مختلف دیسک (Sotoon CSI Tiers)

کوبرنتیز ستون برای ارائه‌ی دیسک مانا از High-Operations SSD استفاده می‌کند که شامل (Tier)های مطابق زیر است. در حالت پیشفرض، PVهای کوبرنتیز ستون با رده‌ی Premium ساخته می‌شوند. توصیه می‌شود رده‌ی هر PVC را بنا به نوع و میزان باری که روی آن است، تنظیم نمایید.

  • دیسک Standard
    • 100 IOPS
    • Bandwidth 50Mi
  • دیسک Premium
    • 500 IOPS
    • Bandwidth 200Mi
  • دیسک Ultra
    • 5000 IOPS
    • Bandwidth 500Mi

رده‌ یا tier هر PersistentVolume به راحتی و بدون هیچ وقفه‌ای (Zero-Downtime) تنها با یک انوتیشن قابل تنظیم است.

kubectl annotate pvc PVC_NAME storage.sotoon.ir/tier=standard
kubectl annotate pvc PVC_NAME storage.sotoon.ir/tier=premium
kubectl annotate pvc PVC_NAME storage.sotoon.ir/tier=ultra

مراحل ساخت snapshot از یک PV

درایور SotoonCSI به طور کامل از API‌های Snapshot در کوبرنتیز پشتیبانی می‌کند. همچنین در کلاستر شما به صورت پیش‌فرض یک volumeSnapshotClass با نام remote-disk وجود دارد که می‌توانید از آن برای ساخت snapshot استفاده کنید.

kubectl get volumeSnapshotClass
NAME          DRIVER            DELETIONPOLICY   AGE
remote-disk   csi.ske.ravh.ir   Delete           4d4h

توجه‌کنید که snapshotهایی که با sotoonCSI می‌سازید Copy on Write هستند.

برای اطلاعات بیشتر در مورد ساخت snapshot در کوبرنتیز می‌توانید این داک را مطالعه کنید.

مراحل ساخت Clone از یک PV

درایور SotoonCSI به طور کامل از ‌APIهای Volume Clonning در کوبرنتیز پشتیبانی می‌کند. برای گرفتن یک clone از volume‌های خود می‌توانید از این داک استفاده کنید.

سوال‌های متداول

  • چه accessModesهایی توسط SotoonCSI پشتیبانی می‌شود؟
    • تنها حالت ReadWriteOnce توسط SotoonCSI پشتیبانی می‌شود.
  • آیا default storage class توسط SotoonCSI مقدار دهی می‌شود؟
    • خیر، شما می‌توانید در صورت نیاز خودتان، remote-disk را به عنوان default storage class قرار دهید ولی این storage class در زمان پیکربندی به عنوان default storage class مقداردهی نمی‌شود.
  • آیا می‌توان از reclaimPolicyهای دیگر در SotoonCSI استفاده کرد؟
    • بله، reclaimPolicy در remote-disk به صورت Delete است ولی شما می‌توانید این reclaimPolicy را در کلاستر خود عوض کنید تا دیسک‌ها پس از پاک شدن پاد، باقی بمانند.
    • همچنین می‌توانید یک storage class جدید بسازید و مقدار reclaimPolicy آن‌ را متفاوت مقدار دهی کنید.
  • هنگام ساخت یک PV از طریق SotoonCSI، دیسک مانای متناظر آن در Compute از چه‌کلاسی است؟
    • دیسک‌های مانا با کلاس premium ساخته می‌شوند.
  • چگونه می‌توانم PVای که در کلاستر ساخته‌ام را به دیسک‌های مانا Compute نظیر کنم؟
    • از طریق پنل کامپیوت می‌توانید لیست دیسک‌های مانا‌ی خود را مشاهده کنید و از روی نام کلاستر و برچسب دیسک متصل، دیسک مانای معادل کامپیوت آن را پیدا کنید.

PVC-labels-in-panel

  • پس از پاک‌کردن یک کلاستر، چرا همچنان هزینه دیسک‌های مانا برای من حساب می‌شود؟
    • به صورت پیش‌فرض، دیسک‌های مانا‌ی شما پس از پاک‌شدن کلاستر می‌مانند و شما می‌توانید از طریق compute، به آنها دسترسی پیدا کرده و یا آن‌ها را پاک کنید. درصورتی که می‌خواهید با پاک شدن، دیسک‌های مانا نیز پاک‌ شوند، باید از در کلاستر خود قابلیت destroy را فعال کنید.

مشکلات متداول

  • هنگام ساخت پاد جدیدی که دارای دیسک است،‌ با خطای timeout در mountکردن دیسک روبه‌رو می‌شوم.
Unable to attach or mount volumes: unmounted volumes=[<volume-name>], unattached volumes=[<volumes>]: timed out waiting for the condition

معمولا این نوع از خطا زمانی رخ می‌دهد که پاد sotoon-csi-controller-plugin دچار خطا شده باشد و در حال اجرا نباشد.

  • ابتدا از بالا بودن پاد‌های SotoonCSI مطمئن شوید، ممکن است پاد sotoon-csi-controller-plugin به دلیل جابه‌جایی، در وضعیت containerCreating باشد. تا بالا آمدن کامل این پاد صبر کنید و یا در صورتی که مشکلی پیش‌آمده‌است، تیکت ثبت کنید.
  • پس از بالا آمدن پاد‌های SotoonCSI، پاد مورد نظر را پاک کنید تا دوباره ساخته شود.
  • هنگام ساخت پاد جدیدی که دارای دیسک است،‌ با خطای MultiAttach در mountکردن دیسک روبه‌رو می‌شوم.
Multi-Attach error for volume "pvc-name" Volume is already exclusively attached to one node and can't be attached to another

خطای بالا در ۲ حالت شکل می‌گیرد:

  • همان‌طور که پیش‌تر گفتیم، SotoonCSI تنها از دیسک‌های ReadWriteOnce پشتیبانی می‌کند. پس اگر دو pod به طور همزمان بخواهند از یک PV استفاده کنند این خطا پیش می‌آید.
    • در این حالت باید یکی از پاد‌ها را پاک کنید تا PV تنها در اختیار یک پاد باشد.
  • زمانی که یکی از ماشین‌های کلاستر به صورت ناقص از کلاستر خارج شده باشد (خاموش شدن بدون خارج شدن، پاک کردن VM به صورت دستی از طریق پنل، …).
    • در این مورد باید یک تیکت ثبت کنید تا متخصصین ما کلاستر شما را recover کنند.