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

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

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

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

مزایای SKE-CSI

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

ماندگاری داده

دیسک مانا در جای دیگری از خود سرور میزبان نگه‌داری می‌شود. همین باعث می‌شود که در صورت ایجاد مشکل روی سرور میزبان، هیچ مشکلی برای داده‌های شما ایجاد نمی‌شود. دیسک‌های مانا در چندین رپلیکا در چند سرور مختلف نگه‌داری می‌شود و نسبت به هر مشکل سخت‌افزاری مقاوم است.

مراحل استفاده از SKE-CSI

پیش‌نیاز

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

پس از ساخت کلاستر، SKE-CSI به صورت خودکار بر روی کلاستر شما پیکربندی می‌شود. پیش از ادامه مسیر، مطمئن شوید که تمامی پاد‌های نیم‌اسپیس sotoon-system در حالت 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 هنگام نصب ‌CSI برای شما ساخته می‌شود که می‌توانید از آن‌ برای مقداردهی فیلد 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

ساخت یک پاد برای استفاده از 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

بکاپ‌گیری از داده‌ها

⚠️ توصیه اکید: از داده‌های مهم خود به‌صورت منظم نسخه پشتیبان‌ تهیه کنید.

  • در حال حاضر، SKE-CSI از قابلیت Snapshot پشتیبانی نمی‌کند. این قابلیت در نسخه‌های آینده اضافه خواهد شد. به عنوان جایگزین استفاده از قابلیت Filesystem Backup از ابزار Velero و همچنین سیاست Retain برای داده‌های مهم توصیه می‌شود.

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

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

  • دیسک Standard
    • 100 IOPS
    • Bandwidth: 50Mi
    • StorageClass: remote-disk-standard
  • دیسک Premium
    • 500 IOPS
    • Bandwidth: 200Mi
    • StorageClass: remote-disk-premium, remote-disk
  • دیسک Ultra
    • 5000 IOPS
    • Bandwidth: 500Mi
    • StorageClass: remote-disk-ultra
  • دیسک Ultra2
    • 7500 IOPS
    • Bandwidth: 500Mi
    • StorageClass: remote-disk-ultra2

در صورت نیاز به استفاده از رده‌های بالاتر، به تیم پیشتیبانی اطلاع دهید.

محدودیت‌ها

  • امکان ساخت دیسک با سایز کمتر از 1GB و بیشتر از 4TB وجود ندارد.
    • در صورت نیاز به ظرفیت بیشتر، به تیم پیشتیبانی اطلاع دهید.
  • سایز دیسک باید مضربی از گیگابایت باشد. به طور مثال ظرفیت 1500MB یا 4.5GB معتبر نمی‌باشد.
  • محدودیت تعداد دیسک به ازای نوع ماشین:
    • ماشین‌های ۱ هسته‌ای: ۴ دیسک (این نوع ماشین توسط کوبرنتیز پشتیبانی نمی‌شود)
    • ما‌شین‌های ۲ هسته‌ای: ۸ دیسک
    • ماشین‌های بزر‌گتر: ۲۰ دیسک

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

  • چگونه می‌توان رده دیسک متصل به PV را تغییر داد؟

    • پیشنیاز این تغییر جدا شدن دیسک از ماشین ورکر مربوطه است. برای انجام اینکار،‌ توصیه می‌شود ورکرهایی که پاد متصل به PV مورد نظر روی آن schedule می‌شود را cordon کرده، سپس توسط kubectl روی پاد مربوطه دستور delete را اجرا نموده تا دیسک و پاد از ورکر جدا شوند و آماده تغییر رده باشند. سپس به تیم پشتیبانی اطلاع دهید تا تغییر رده اعمال شود . سپس ورکر یا ورکرها را uncordon کرده تا پاد مورد نظر schedule شود و دیسک مجددا به ورکر متصل شود.
  • چه accessModesهایی توسط SKE-CSI پشتیبانی می‌شود؟

    • تنها حالت ReadWriteOnce توسط SKE-CSI پشتیبانی می‌شود.
  • آیا می‌توان از reclaimPolicyهای دیگر در SKE-CSI استفاده کرد؟

    • بله، reclaimPolicy در StorageClass های پیشفرض SKE-CSI به صورت Delete است اما می‌توانید یک StorageClass جدید بسازید و مقدار reclaimPolicy آن‌ را متفاوت مقداردهی کنید.
  • هنگام ساخت یک PV از طریق SKE-CSI، دیسک مانای متناظر آن در ماشین مجازی از چه‌کلاسی است؟

    • دیسک‌های مانا به صورت پیشفرض با کلاس premium ساخته می‌شوند.
  • چگونه می‌توانم PVای که در کلاستر ساخته‌ام را به دیسک‌های مانا ماشین مجازی نظیر کنم؟

    • از طریق پنل کوبرنتیز نسخه ۲، جزئیات کلاستر، می‌توانید لیست دیسک‌های مانا‌ی خود را مشاهده کنید و نام PV معادل در کلاستر را مشاهده کنید. همچنین از طریق پنل ماشین مجازی نسخه ۲، قسمت دیسک های مانا، می‌توانید به ازای هر دیسک، نام کلاستر، ماشین و PV معادل آن را پیدا کنید.
  • پس از پاک‌کردن یک کلاستر، چرا همچنان هزینه دیسک‌های مانا برای من حساب می‌شود؟

    • به صورت پیش‌فرض، دیسک‌های مانا‌ی شما پس از پاک‌شدن کلاستر، باقی می‌مانند و شما می‌توانید از طریق ماشین مجازی، به آنها دسترسی پیدا کرده و یا آن‌ها را پاک کنید.
  • آیا قابلیت volume snapshot روی SKE-CSI پشتیبانی می‌شود؟

    • در حال حاضر قابلیت volume snapshot روی csi ستون فعال نمی‌باشد (در حال توسعه). برای بکاپ‌گیری از داده‌های خود، می‌توانید از Velero Filesystem Backup استفاده کنید.

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

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

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

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

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

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