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

پیش‌نیازهای استفاده از persistentVolumeClaim در سکوی ابری آروان

تنها پیش‌نیاز استفاده از این سیستم، داشتن حساب کاربری ابر آروان و دسترسی به سکوی ابری آروان است. بنابراین به سایت ابر آروان به نشانی arvancloud.ir بروید و یک حساب کاربری بسازید یا اگر از پیش حساب کاربری دارید، وارد آن شوید. سپس به بخش پروفایل بروید و در سربرگ API KEYS برای خود یک API KEY جدید بسازید و آن را در جایی ذخیره کنید.

برای انجام مراحل این مقاله نیاز است از command line ابر آروان استفاده کنید. پس از دانلود خط فرمان (در صورت نیاز آن را در PATH خود قرار دهید) با کمک دستور زیر در آن لاگین کنید.

arvan login

سپس API KEY که از سایت دریافت کردید در اینجا کپی کنید.

persistentVolumeClaim چیست؟

دیسک Pod ناپایدار است. به این معنی که، اگر Pod ریستارت شود، تمامی داده‌های ذخیره شده از بین می‌رود و کانتینر به حالت اولیه خود باز می‌گردد. با این حال، برخی برنامه‌ها مانند پایگاه‌های داده نیازمند دیسک پایدار هستند تا داده‌های ذخیره شده روی دیسک، پس از ریستارت Pod از بین نروند. در این شرایط، باید از persistentVolumeClaim ، یا به اختصار PVC، که یکی از اجزای اصلی و پرکاربرد در سکوی ابری آروان است، استفاده کرد. persistentVolumeClaim به کاربر امکان اتصال دیسک پایدار به Pod، برای ذخیره‌سازی دایمی داده را می‌دهد.

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

ساخت persistentVolumeClaim

برای ساخت persistentVolumeClaim، باید اطلاعات مورد نیاز را در قالب yaml در یک فایل وارد و سپس با Command Line، آن را به سکوی ابری آروان ارایه کرد. در ادامه مثالی ساده از یک persistentVolumeClaim برای یک سرویس nginx (که در مقالات پیشین، Deployment، Service و Route برای آن ایجاد شد) بیان و هر یک از بخش‌های آن توضیح داده شده است (البته توجه داشته باشید که نیاز به تغییراتی در Deployment است، که در ادامه این تغییرات نیز توضیح داده شده‌اند).

apiVersion: "v1"
kind: "PersistentVolumeClaim"
metadata:
  name: "claim-vol-1"
spec:
  accessModes:
    - "ReadWriteOnce"
  resources:
    requests:
      storage: "10Gi"

نکته: توجه کنید که indentation در فایل‌های yaml مهم است و کوچک‌ترین جابه‌جایی می‌تواند سبب برگرداندن خطا یا تنظیمات ناخواسته شود.

در ادامه فیلدهای مربوطه توضیح داده شده است.

  • kind: مشخص کننده نوع ماهیت است. این فیلد می‌تواند مقادیری مانند:‌ Pod، persistentVolumeClaim، Service، StatefulSet و… داشته باشد. در این مثال، هدف تعریف persistentVolumeClaim است. بنابراین برای این فیلد مقدار persistentVolumeClaim مشخص شده است.
  • metadata.name: مشخص‌کننده‌ی نام persistentVolumeClaim است.
  • spec.accessModes: مشخص‌کننده‌ی نوع دسترسی به دیسک است که در سکوی ابری آروان باید همواره مقدار ReadWriteOnce تعیین شود. این مقدار بیان‌کننده‌ی این است که هر دیسک تنها به یک کانتینر در لحظه می‌تواند متصل باشد.
  • spec.resources.requests: مشخص‌کننده‌ی حجم دیسک درخواست شده است.

خطوط بالا را در یک فایل به نام nginx-persistentVolumeClaim.yaml وارد و ذخیره کنید. سپس در command line با دستور زیر، persistentVolumeClaim خود را به سکوی ابری آروان ارایه کنید.

arvan paas apply -f nginx-persistentVolumeClaim.yaml

با دستور زیر می‌توانید از وضعیت persistentVolumeClaim خود و اجرای آن روی سکوی ابری آروان آگاه شوید.

arvan paas get pvc

خروجی مشابه زیر خواهد بود:

‎$ arvan paas get pvc‎
NAME          STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   ‎AGE
claim-vol-1   Bound     pvc-1ef621ff-77b6-11ea-b7a9-fa163e633da5   10Gi       RWO            standard       ‎‎31m‎

در خروجی بالا، NAME مشخص‌کننده‌ی نام persistentVolumeClaim است. STATUS مشخص‌کننده‌ی وضعیت persistentVolumeClaim است (bound به معنی آماده بودن persistentVolumeClaim، ستون VOLUME مشخص‌کننده‌ی id مربوط به persistentVolumeClaim و CAPACITY حجم persistentVolumeClaim  را مشخص می‌کند. ACCESS MODES معادل مقدار spec.accessModes در فایل توصیف است. توضیح STORAGECLASS طولانی و خارج از مباحث این مقاله است. AGE نیز مشخص‌کننده‌ی مدت زمان فعال بودن persistentVolumeClaim است.

با اعمال فایل بالا، یک دیسک به‌وسیله‌ی سکوی ابری آروان برای پروژه‌ی شما در نظر گرفته می‌شود. برای استفاده از این دیسک، باید آن را به یک کانتینر درون یک Pod متصل کنید. در ادامه، تغییراتی که باید روی deployment برای اتصال اعمال شوند، توضیح داده شده است.

 

استفاده از persistentVolumeClaim

همان‌طور که بیان شد، persistentVolumeClaim باید به یک Pod متصل شود. در این بخش شیوه‌ی استفاده از persistentVolumeClaim در Deployment توضیح داده شده است.

اطلاعات زیر را در فایلی به اسم nginx-deployment-persist.yaml وارد کنید

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  Strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 2368
          protocol: TCP
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
          requests:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      volumes:
      - name: nginx-log
        persistentVolumeClaim:
          claimName: claim-vol-1

 

در ادامه فیلدهایی که در Deployment اضافه تا بتوان دیسک را به Pod متصل کرد، توضیح داده شده‌اند.

  • spec.strategy: همان‌طور که بیان شد، هر persistentVolumeClaim، در سکوی ابری آروان، می‌تواند تنها به یک کانتینر متصل باشد. بنابراین حتمن باید این فیلد با Recreate مقداردهی شود تا هنگام آپدیت، ابتدا Pod قبلی از بین برود و دیسک آزاد شود، سپس Pod جدید ساخته و دیسک به آن متصل شود.
  • spec.template.spec.containers.volumeMounts: در این بخش، مسیری که نیاز است دیسک mount شود، مشخص می‌شود.
  • spec.template.spec.containers.volumeMounts.name: چون به یک کانتینر می‌توان بیش از چند دیسک متصل کرد، برای تفکیک مسیر‌ها، باید آن‌ها را نام‌گذاری کرد.
  • spec.template.spec.containers.volumeMounts.mountPath: مشخص‌کننده‌ی آدرس مسیری درون کانتینر است که می‌خواهیم دیتای آن روی دیسک دایمی نوشته و از آن خوانده شود.
  • spec.template.spec.volumes: این بخش ارتباط بین دیسک دایمی و مسیر درون کانتینر، که لازم است دیسک mount شود، را مشخص می‌کند.
  • spec.template.spec.volumes.name: این فیلد نام volumeای است که مسیر کانتینر با آن مشخص شده است. در واقع همان مقداری که به‌وسیله‌ی فیلد spec.template.spec.containers.volumeMounts.name مشخص شده است.
  • spec.template.spec.volumes.persistentVolumeClaim.claimName: این فیلد نام دیسک یا persistentVolumeClaimای است که قرار است داده‌ها روی آن persist شوند.

فایل بالا را با Command Line به سکوی ابری ارایه کنید. مشاهده خواهید کرد که داده‌های موجود در مسیر /var/log/nginx که به‌وسیله‌ی فیلد spec.template.spec.containers.volumeMounts.mountPath مشخص شده‌اند، با ریستارت شدن Pod هم‌چنان باقی خواهند ماند.

دقت داشته باشید، چون در سکوی ابر آروان هر دیسک تنها به یک کانتینر متصل می‌شود، تعداد replicaهای deployment‌ای که دارای persistentVolumeClaim است را نمی‌توان افزایش داد. در صورت نیاز به چندین Pod مشابه با دیسک پایدار، باید از stateFulSet استفاده کرد. در ادامه توضیح کوتاهی در این مورد آمده است.

 

استفاده از persistentVolumeClaim در stateFulSet

همان‌طور که بیان شد، در سکوی ابری آروان هر دیسک می‌تواند تنها به یک کانتینر متصل شود. از طرفی در برخی مواقع نیاز است چند Pod مشابه دارای دیسک پایدار باشند (داده‌های ذخیره شده روی دیسک پایدار می‌توانند متفاوت باشند).

تفاوتی که در استفاده‌ی persistentVolumeClaim در stateFulSet، با استفاده از آن درdeployment وجود دارد آن است که، هنگام استفاده از stateFulSet نیازی به تعریف persistentVolumeClaim به‌شکل جداگانه نیست و می‌توان در همان فایل توصیف stateFulSet با استفاده از volumeClaimTemplate، برای هر Pod مربوط به replica دیسک جداگانه‌ای ایجاد کرد.
خطوط زیر استفاده از volumeClaimTemplate را نمایش می‌دهند. این تنظیمات مشابه تنظیمات persistentVolumeClaim هستند.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
  labels:
    app: nginx
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: http
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 2G
          requests:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 2G
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
  volumeClaimTemplates:
  - metadata:
      name: nginx-log
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 2Gi

برای کسب اطلاعات بیش‌تر می‌توانید از مستندات OKD و Kubernetes استفاده کنید.